it-swarm.com.ru

Правильный способ использования функций в хуке действий?

Мне интересно, правильна ли приведенная ниже логика и должны ли присутствовать определенные обстоятельства, чтобы она работала, поскольку в некоторых случаях она, похоже, не работает.

Пример ниже довольно прост. Допустим, я хочу использовать функцию, которая определена в другом месте в файле, связанном с темой, скажем, parent_theme_hooks.php, через ловушку действия в моей дочерней теме functions.php.

parent_theme_hooks.php

function is_enabled(){
    return true;
}

function check_if_enabled(){    
    do_action( 'my_hook', $some, $args );
}

Тогда в child-theme functions.php

function my_function($some, $args) {
    if ( is_enabled() ) {
        $message = 'yes';
    } else {
        $message = 'no';
    } 
    echo $message;
}
add_action( 'my_hook', 'my_function', 11, 2 );

Вопрос Итак, мой вопрос, могу ли я использовать функцию is_enabled() в дочерней теме functions.php, когда она определена в другом месте в родительской теме?

Спасибо

1
RobbTe

Да, ты можешь. Но вы должны быть осторожны, так как могут возникнуть некоторые особые случаи. Некоторые из них:

1. Функция может быть методом класса, а не глобальной функцией:

class SomeClass {
   ...
   function some_function() { ... }
   ...
}

В таком случае вы можете использовать его только в том случае, если: - это статическая функция - это открытый метод и у вас есть доступ к некоторому объекту этого класса.

2. Файл с этой функцией не всегда может быть включен:

function do_something() {
    if ( condition_met() ) {
        include_once( 'parent_theme_hooks.php' );
    }
}

В этом случае функции из этого файла не будут доступны всегда.

3. Функция может быть объявлена ​​внутри оператора if:

if ( class_exists( 'SomeClass' ) ) {
    function some_function() { ... }
}

Опять же - если данный класс не существует, функция не будет доступна.

4. Файл еще не загружен

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

В таком случае функция не будет доступна до того, как эта ловушка будет запущена.

Другой пример этого случая - использование функций из родительской темы внутри дочерней темы. functions.php файл из родительской темы идет после того же файла из дочерней темы. Таким образом, вы не можете использовать родительские функции напрямую в файле дочерних тем functions.php.

Но...

Есть несколько способов сделать ваш код более надежным при использовании таких функций:

  1. Всегда пытайтесь понять, когда и как объявлена ​​эта функция.
  2. Проверьте, существует ли функция с if ( function_exists( 'function_name' ) ), и вызывайте ее, только если она существует. Вы также можете предоставить альтернативное решение (запасной вариант), если оно не существует.
2
Krzysiek Dróżdż

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

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

Таким образом, ваш пример будет работать, только если check_if_enabled() запущен после загрузки родительской темы. Если вы попытаетесь использовать эту функцию в своей дочерней теме до загрузки родительской темы, она не будет работать.

2
Jacob Peattie