Зачем использовать function_exists в WordPress?

23 авг. 2013 г., 07:30:20
Просмотры: 61.6K
Голосов: 35

Я заметил, что многие разработчики тем 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. Какой способ правильный?

0
Все ответы на вопрос 5
0
43

Проверка существования встроенных функций 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();
  }
}

В этом случае дочерняя тема или другой плагин могут переопределить эту функцию своей собственной.

23 авг. 2013 г. 10:31:38
0

Функция function_exists не является альтернативным способом загрузки функции, как add_action. Она предназначена для проверки вашего кода на наличие других функций с таким же именем, чтобы избежать его поломки. Согласно php.net:

Проверяет список определённых функций, как встроенных (внутренних), так и пользовательских, на наличие function_name.

Если у вас в коде будет две одинаковые функции, это приведёт к ошибке. Именно поэтому рекомендуется добавлять свой префикс к функциям вместо стандартного wp_.

Подробнее: http://php.net/manual/ru/function.function-exists.php

23 авг. 2013 г. 07:43:07
0

вы можете использовать http://php.net/function_exists

if(function_exists('my_function')){
   // функция my_function определена
}

ИЛИ если вы хотите увидеть все доступные функции, вы также можете вывести их все,

echo "<pre>"; print_r(get_defined_functions());

выведет на страницу, и вы можете поискать эту функцию, если её нет в списке, значит она недоступна для использования.

возможно, вам потребуется активировать расширение для конкретной библиотеки.

8 февр. 2017 г. 11:22:25
0

function_exists следует использовать после имени функции в теме, а не до.

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

Это проверяет, активен ли плагин, перед выводом функции и/или разметки, в противном случае может возникнуть ошибка, например, вызов неопределенной функции.

29 мар. 2018 г. 13:55:30
0

На сайте php.net это определяется как

(PHP 4, PHP 5, PHP 7) function_exists — Возвращает TRUE, если указанная функция была определена

Я согласен с Мишель в использовании этой функции, что вам следует использовать проверку только для чего-то похожего на проверку типа; таким образом, вы бы проверяли, существует ли функция (на этой странице или из всего, что вызывается на этой странице/файле), чтобы затем знать, безопасно ли запускать другую функцию или разбирать какой-то шаблон HTML.

Как уже упоминалось, это часто используется для проверки, может ли ваш файл/тема (использующая WordPress) выполнить ваш запрос. Я использовал это для проверки наличия определенной части шаблона в теме.

if ( function_exists( 'register_sidebar' ) ) {
    get_sidebar();
}
24 июн. 2019 г. 03:41:41