在开发主题和插件时,有时需要使用条件语句向某些挂钩添加一些功能。
例子:
function my_custom_function() {
if( is_home()) {
<---what should the function do--->
}
}
add_action( 'some_hook', 'my_custom_function' );
据我了解,只要存在任何其他条件(is_home
return false),函数的内容没有被执行,但是函数被执行了,尽管它是“空的”。 这意味着一个空函数被传递给了钩子。 这是使用条件标签在法典中显示所有示例的方式。
我确实知道这样做是安全的,并且它不会对加载时间产生任何重大影响(如果对加载时间有任何影响的话)。
我一直在想,同样的一段代码,按照例子,可以写成如下
if( is_home()) {
function my_custom_function() {
<---what the function should do--->
}
add_action( 'some_hook', 'my_custom_funtion' );
}
如果 is_home
返回假。
我不介意使用这两种方法中的任何一种。 但我想知道的是,由于第一个例子被广泛使用,是否有任何编码标准表明这是正确的使用方法,或者这是 wordpress 开发人员所采用的更普遍的方式,或者只是个人喜好。
PHP 的 WordPress 编码标准对此没有任何说明,也没有其他标准,因此开发人员可以选择一种或另一种方式。
我不得不说这两种方法有不同的方法; 第一个包含条件逻辑,第二个是条件函数声明,这意味着如果您尝试调用该函数,则会出现致命错误。
即使使用第一种方法,函数运行的位置(对无关紧要的性能的影响非常小) 丢失的 在应用程序加载中),这是一种更好的使用方法,因为当使用第二种方法时,应用程序的业务逻辑从函数转移到文件解析。
此外,您应该考虑您没有提到的第三种方式:
function my_custom_function() {
// what the function should do
}
if ( is_home() ) {
add_action( 'some_hook', 'my_custom_function' );
}
当您使用 OOP 编程时,这种方法的好处更明显:在这种情况下,类条件声明没有意义(并且方法条件声明根本不可能),但仅在特定条件下运行任务很有意义(钩发射)。
不要即时创建函数。 这很难阅读和调试。 相反,实施关注点分离,并将 回调的注册 从他们的 执行 (商业逻辑)。 在回调注册前逻辑地设置条件检查现在非常简单。
等待 为了行动 template_redirect
实例化该注册处理程序,因为那是你 知道 如果 is_home()
可以检查。
例子
class Theme_Hooks
{
public function setup()
{
if ( ! is_404() ) {
add_action(
get_stylesheet() . '_breadcrumb',
[ new Breadcrumb, 'render' ]
);
}
if ( is_home() ) {
add_action(
get_stylesheet() . '_home_widget',
[ new Home_Widget, 'render' ]
);
}
}
}
add_action( 'template_redirect', [ new Theme_Hooks, 'setup' ] );
