問題描述

我注意到很多 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(#替換為 @) 。