Зачем использовать function_exists в WordPress?
Я заметил, что многие разработчики тем 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'));
}
У меня два вопроса:
Зачем использовать условие if в первом методе?
Какой способ правильный?

Проверка существования встроенных функций WordPress перед их вызовом предназначена для обратной совместимости, которая, по моему мнению, уже не нужна.
Например, если вы видите if ( function_exists( 'register_nav_menus' ) )
, значит, автор темы поддерживает версии WordPress старше 3.0.
Иногда всё ещё встречается if ( function_exists( 'dynamic_sidebar' ) )
. Зачем? Трудно сказать, ведь функция dynamic_sidebar появилась ещё в версии 2.2.
Другая причина использования такой проверки — возможность сделать вашу тему или плагин заменяемым (pluggable). Заменяемая функция — это та, которую можно переопределить в дочерней теме или другом плагине.
Это делается при объявлении функции, а не при её вызове, и используется оператор !
, чтобы убедиться, что функция ещё не существует перед её определением.
if ( ! function_exists( 'my_awesome_function' ) ) {
/**
* Моя потрясающая функция действительно потрясающая
*
* @param array $args
* @return array
*/
function my_awesome_function( $args ) {
// Код функции
return array();
}
}
В этом случае дочерняя тема или другой плагин могут переопределить эту функцию своей собственной.

Функция function_exists
не является альтернативным способом загрузки функции, как add_action
. Она предназначена для проверки вашего кода на наличие других функций с таким же именем, чтобы избежать его поломки. Согласно php.net:
Проверяет список определённых функций, как встроенных (внутренних), так и пользовательских, на наличие function_name.
Если у вас в коде будет две одинаковые функции, это приведёт к ошибке. Именно поэтому рекомендуется добавлять свой префикс к функциям вместо стандартного wp_.
Подробнее: http://php.net/manual/ru/function.function-exists.php

вы можете использовать http://php.net/function_exists
if(function_exists('my_function')){
// функция my_function определена
}
ИЛИ если вы хотите увидеть все доступные функции, вы также можете вывести их все,
echo "<pre>"; print_r(get_defined_functions());
выведет на страницу, и вы можете поискать эту функцию, если её нет в списке, значит она недоступна для использования.
возможно, вам потребуется активировать расширение для конкретной библиотеки.

function_exists
следует использовать после имени функции в теме, а не до.
add_action( 'loop_start', 'add_slider' );
function add_slider() {
if ( function_exists( 'soliloquy' ) ) {
soliloquy( 'slider', 'slug' );
}
}
Это проверяет, активен ли плагин, перед выводом функции и/или разметки, в противном случае может возникнуть ошибка, например, вызов неопределенной функции.

На сайте php.net это определяется как
(PHP 4, PHP 5, PHP 7) function_exists — Возвращает TRUE, если указанная функция была определена
Я согласен с Мишель в использовании этой функции, что вам следует использовать проверку только для чего-то похожего на проверку типа; таким образом, вы бы проверяли, существует ли функция (на этой странице или из всего, что вызывается на этой странице/файле), чтобы затем знать, безопасно ли запускать другую функцию или разбирать какой-то шаблон HTML.
Как уже упоминалось, это часто используется для проверки, может ли ваш файл/тема (использующая WordPress) выполнить ваш запрос. Я использовал это для проверки наличия определенной части шаблона в теме.
if ( function_exists( 'register_sidebar' ) ) {
get_sidebar();
}
