问题描述
在开发主题和插件时,有时需要使用条件语句为某些钩子添加一些功能。
例:
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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。