add_action не вызывает функцию

Вопрос или проблема

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

add_action( 'wp_nav_menu_item_custom_fields', 'my_custom_fields', 10, 4);

function my_custom_fields( $item_id, $item, $depth, $args ) {
    var_dump("test test");
}

В данный момент не существует фильтра для управления полями при создании меню. С другой стороны, вы можете создать нового “меню-ходока”, чтобы предоставить WordPress поля ввода, а также добавить свои собственные. Это включает в себя расширение класса WordPress Walker_Nav_Menu_Edit вашим собственным кодом.

Поскольку объяснение всего необходимого кода довольно длинное, я бы хотел предложить вам использовать существующий плагин и использовать необходимые вам части. Я, например, использовал плагин Menu image в качестве отправной точки. Обратите внимание на два класса там:

  • Menu_Image_Plugin создает базовую функциональность плагина (вам понадобятся только некоторые из фильтров и действий в конструкторе)
  • Menu_Image_Walker_Nav_Menu_Edit, который расширяет Walker_Nav_Menu_Edit, чтобы создать поля для меню

Надеюсь, это поможет вам (и, возможно, другим) управлять своими меню так, как они хотят 🙂

ОБНОВЛЕНИЕ
Как всегда, когда ищешь что-то другое, находишь ответ на то, что искал ранее. Итак… здесь есть ответ, который может помочь вам с небольшим (простым) кодом; здесь более подробный ответ с большим количеством (простого и среднего) кода.

Добавьте это после вашей функции;

do_action('my_custom_fields');

Это заставит wp выполнить все зарегистрированные обратные вызовы, назначенные для указанного действия.

Ответ или решение

Проблема с вызовом функции через add_action: диагностика и возможные решения

Если вы пытаетесь добавить свой кастомный поля в меню с помощью wp_nav_menu_item_custom_fields и функция не вызывается, это может быть вызвано несколькими причинами. Давайте рассмотрим основные моменты, которые могут помочь вам диагностировать и решить эту проблему.

Понимание хука wp_nav_menu_item_custom_fields

Хук wp_nav_menu_item_custom_fields используется для добавления дополнительных полей к элементам меню в административной области WordPress. Однако для того чтобы сработал этот хук, необходимо, чтобы он был активирован в соответствующем контексте.

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

Правильное использование хука add_action

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

add_action( 'wp_nav_menu_item_custom_fields', 'my_custom_fields', 10, 4 );

Убедитесь, что вы правильно вызываете функцию my_custom_fields. Проверьте также, что у вас включены все необходимые аргументы. Ваш код должен выглядеть следующим образом:

function my_custom_fields( $item_id, $item, $depth, $args ) {
    var_dump("test test");
}

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

Решение проблемы с использованием кастомного "Walker"

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

class My_Custom_Walker extends Walker_Nav_Menu_Edit {
    function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
        // Ваша логика для добавления кастомных полей
    }
}

После создания кастомного класса вам необходимо использовать его при выводе меню:

add_filter('wp_nav_menu_parameters', 'my_custom_menu_walker');
function my_custom_menu_walker($args) {
    $args['walker'] = new My_Custom_Walker();
    return $args;
}

Принудительный вызов вашей функции

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

do_action('my_custom_fields');

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

Заключение

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

Если вы по-прежнему сталкиваетесь с проблемами, наличие как минимум одной активной темы или плагина, использующего wp_nav_menu_item_custom_fields, может помочь: посмотрите, как они реализованы, и проанализируйте, что может быть неправильно в вашей реализации.

Надеюсь, это поможет вам найти решение вашей проблемы и успешно добавить пользовательские поля в меню WordPress!

Оцените материал
Добавить комментарий

Капча загружается...