问题描述

我注意到很多 WordPress 主题的开发人员将在 functions.php 中使用它

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

对于我来说,我还是使用 add_action 来处理我在 functions.php 中使用的每个功能

所以上面写的是:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Header Navigation'));
}

我有两个问题:

  1. 为什么在第一种方法中使用 if 语句?

  2. 哪一种是正确的方法?

最佳解决方案

在调用它们之前检查是否存在内置的 WordPress 函数是为了向后兼容,不需要 IMHO 。

所以如果你看到 if ( function_exists( 'register_nav_menus' ) ),主题作者支持 3.0 之前的版本。

你还有时候看到 if ( function_exists( 'dynamic_sidebar' ) )为什么?我不能告诉你,因为在 2.2 中引入了 dynamic_sidebar 。

使用它的另一个原因是使您的主题或插件可插拔。可插拔功能是可以在子主题或其他插件中覆盖的功能。

这个定义不是调用,而是你使用!操作员确定它在您定义之前不存在。

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * My Awesome function is awesome
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  //function stuff
  return array();
  }
}

当这样做完成时,儿童主题或其他插件可以用自己的方式覆盖该功能。

次佳解决方案

function_exists 函数不是另一种方式来加载 add_action 这样的函数来检查你的代码,看看没有其他同名的函数,所以它不会破坏你的代码。从 php.net:

Checks the list of defined functions, both built-in (internal) and user-defined, for function_name.

如果你的代码中有两个相同的功能,那么它将会破坏,那就是为什么你的函数前缀不是 wp_。

阅读更多:http://php.net/manual/en/function.function-exists.php

参考文献

注:本文内容整合自 google/baidu/bing 翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为 @) 。