问题描述

在开发主题和插件时,有时需要使用条件语句为某些钩子添加一些功能。

例:

function my_custom_function() {
    if( is_home()) {
       <---what should the function do--->
    }
}

 add_action( 'some_hook', 'my_custom_function' );

据我了解,每当存在任何其他条件 (is_home 返回 false) 时,函数的内容都不会执行,但是该函数是执行的,尽管它是”empty” 。这意味着一个空的函数传递给钩子。这是所有示例在使用条件标签的 codex 中显示的方式。

我明白这样做是安全的,它不会对加载时间产生任何重大影响 (如果对加载时间有任何影响) 。

我一直在想,同样的代码片段,例如,可以写成如下

if( is_home()) {
   function my_custom_function() {
     <---what the function should do--->
   }

  add_action( 'some_hook', 'my_custom_funtion' );

}

如果 is_home 返回 false,这将完全跳过所有内容。

我不介意使用这两种方法。但是我想知道的是,由于第一个例子被广泛使用,有没有任何编码标准说明这是正确的使用方法,或者这是根据 wordpress 开发人员的预测方式,还是个人偏好。

最佳解决方案

WordPress coding standards for PHP 没有说明任何内容,没有其他标准,所以开发人员可以选择一种方式。

我不得不说,这两种方法有不同的方法; 而第一个包含条件逻辑,第二个是条件函数声明,这意味着如果您尝试调用该函数,则会获得致命错误。

即使使用第一种方法,函数的运行方式 (对应用程序负载不相关和丢失的性能影响非常小),因此使用第二种方法时,使用第二种方法时,业务逻辑您的应用程序从函数移动到文件解析。

此外,你应该考虑有没有提到的第三种方法:

function my_custom_function() {
    // what the function should do
}

if ( is_home() ) {
    add_action( 'some_hook', 'my_custom_function' );
}

当使用 OOP 编程时,这种方法的好处是更可察觉的:在这种情况下,类条件声明没有任何意义 (并且方法条件声明根本是不可能的),但是只有在特定条件下才能运行很多有意义的运行任务钩子射击) 。

次佳解决方案

不要在飞行中创建功能。这很难阅读和调试。实现 separation of concerns,并将回调的注册与其执行 (业务逻辑) 分开。在回调注册之前逻辑地设置条件检查现在已经很简单了。等待操作 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' ] );

第三种解决方案

我只是想补充说,一般来说,应该谨慎使用条件标签,如:

if( is_*() )
{
    // stuff
}

functions.php 的全局范围内,因为它将在 do_action()apply_filters()发生任何过滤器或操作之前运行。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。