动作、功能和条件句

时间:2014-05-26 作者:Pieter Goosen

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

示例:

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

 add_action( \'some_hook\', \'my_custom_function\' );
据我所知,只要存在任何其他情况(is_home return false),函数的内容不会执行,但是函数会执行,尽管它是“空的”。这意味着将一个空函数传递给挂钩。这是所有示例在codex中使用条件标记显示的方式。

我确实理解这样做是安全的,并且它不应该对加载时间有任何重大影响(如果对加载时间有任何影响的话)。

我一直在想,根据示例,同一段代码可以编写如下

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

  add_action( \'some_hook\', \'my_custom_funtion\' );

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

我不介意使用这两种方法中的任何一种。但我想知道的是,由于第一个示例已被广泛使用,是否有任何编码标准表明这是正确的使用方法,或者这是wordpress开发人员惯用的方法,或者只是个人喜好。

5 个回复
最合适的回答,由SO网友:gmazzap 整理而成

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编程时,这种方法的好处更加明显:在这种情况下,类条件声明没有意义(方法条件声明根本不可能),但它只在特定条件下运行任务(钩子触发)很有意义。

SO网友:fuxia

不要动态创建函数。这很难阅读和调试。使生效separation of concerns 而是将registration of callbacks 从他们的execution (业务逻辑)。现在,在回调注册之前以逻辑方式设置条件检查非常简单
Wait 对于操作template_redirect 实例化该注册处理程序,因为know 如果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\' ] );

SO网友:birgire

我只想补充一点,一般来说,使用条件标记时应该小心,如:

if( is_*() )
{
    // stuff
}
在全球范围内functions.php, 因为它将在启动任何筛选器或操作之前运行do_action()apply_filters().

SO网友:Berend

我想说的是个人喜好。

此外,在if语句外部进行函数调用以及在其内部执行操作更为简洁。这样,如果if语句返回true,该函数仍将仅由操作调用。

始终将函数定义保留在if语句之外,可以确保您永远不会调用一个碰巧被捕获和不可调用的函数。

SO网友:Anh Tran

只想添加另一个选项。混合核心框架实现了一种称为“智能挂钩”的方法,可以识别上下文。

可在此处查看完整来源:

https://github.com/justintadlock/hybrid-core/blob/master/functions/core.php

理想情况下,它可以这样使用:

基本挂钩的一个示例是“hybrid\\u header”。do\\u atomic()函数对其进行了扩展,以提供额外的挂钩,如“hybrid\\u singular\\u header”、“hybrid\\u singular-post\\u header”和“hybrid\\u singular-post-ID\\u header”。

结束

相关推荐