Пользовательский Action Hook плагина не работает

25 нояб. 2013 г., 20:27:40
Просмотры: 22.1K
Голосов: 2

Я пытаюсь создать простой плагин, в котором хочу создать свой собственный action hook. Вот код для этого.

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

do_action('basic_action_demo');
?>

Теперь после активации этого плагина я хочу использовать этот action hook в файле function.php моей текущей темы, код для этого выглядит следующим образом:

add_action('basic_action_demo','action_demo');

function action_demo()
{
    echo "Я внутри";
}

Проблема в том, что мой подключенный action никогда не вызывается. Мы видим, что do_action вызывается безусловно, поэтому он должен вызываться при каждой загрузке страницы, но он никогда не попадает в метод "action_demo".

То, что я выяснил: плагин загружается до того, как выполняется файл function.php моей темы. Поэтому здесь do_action вызывается первым, а затем add_action.

Буду признателен за подсказку.

Обновление:

Ниже приведен рабочий вариант плагина.

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

add_action('basic_action_demo','action_demo');
do_action('basic_action_demo');

function action_demo()
{
    echo "Я внутри";
    die;
}
?>
4
Комментарии

Порядок ваших do's и add's неверный. Пожалуйста, объясните, чего вы хотите достичь с помощью своего хука действия, чтобы мы могли подсказать, где и как вам нужно их добавить.

Twifty Twifty
25 нояб. 2013 г. 20:36:27

@Waldermort Ну, допустим, у меня есть плагин с простой формой. Я хочу вызвать свой собственный хук действия, когда эта форма будет отправлена. Надеюсь, теперь понятно, что я имею в виду.

Avinash Avinash
25 нояб. 2013 г. 20:39:07

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

Twifty Twifty
25 нояб. 2013 г. 20:46:39

@Waldermort Проблема, которую я выяснил (из вашего ответа ниже), заключается в том, что файл плагина вызывается раньше файла темы. Есть ли у вас какие-то конкретные рекомендации по обработке этой ситуации?

Avinash Avinash
25 нояб. 2013 г. 20:53:01
Все ответы на вопрос 1
5

Вашему плагину нужно дождаться загрузки файла functions.php темы. Попробуйте так:

<?php
/*
Plugin Name: Демо-плагин
Version: 1.0
*/

add_action( 'after_setup_theme', function() {
    do_action( 'basic_action_demo' );
} );
?>

Хук after_setup_theme выполняется сразу после загрузки functions.php.

Обновление для вашего комментария ниже. В вашем плагине создайте функцию для вашей формы:

<?php
/*
Plugin Name: Демо-плагин
Version: 1.0
*/

function output_my_form () {
    echo "Я форма";
    // выполняем ваше действие здесь
    do_action( 'basic_action_demo' );
}
?>

Затем в functions.php вашей темы:

if ( function_exists( 'output_my_form' ) ) {
    output_my_form();
}

Это простой пример. В реальности вы бы хотели вызывать эту функцию из файла form.php в вашей теме.

25 нояб. 2013 г. 20:40:59
Комментарии

Это работает, но является ли это единственным способом добавить собственный хука действия в файлах плагина, или я что-то упускаю?

Avinash Avinash
25 нояб. 2013 г. 20:48:32

@Avinash Когда вы хотите, чтобы ваш код выполнялся? Плагин создан для того, чтобы быть доступным для темы, поэтому они загружаются первыми. Если вы хотите запускать код из вашего плагина в теме, просто создайте набор функций в плагине и вызывайте их из темы. Если вы хотите запускать код темы из плагина (что не очень хорошая идея), то используйте вышеуказанный хук действия, чтобы дождаться загрузки темы, а затем вызывайте эти функции из обработчика действия.

Twifty Twifty
25 нояб. 2013 г. 21:00:55

У меня есть код обработки формы в файле плагина, после которого я вызываю do_action('my_action'), но это не работает :(

Avinash Avinash
25 нояб. 2013 г. 21:03:41

Хорошо. Я начинаю понимать. Не выводите вашу форму при загрузке плагина. Создайте для этого функцию, затем вызовите эту функцию из вашей темы. Я обновлю свой ответ.

Twifty Twifty
25 нояб. 2013 г. 21:06:04

@Avinash Пожалуйста, не забудьте проголосовать/принять ответ, если считаете его полезным :)

Twifty Twifty
25 нояб. 2013 г. 21:38:58