Вопрос или проблема
Я хочу добавить настраиваемое поле в меню, поэтому пытаюсь использовать 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!