Вопрос или проблема
Привет! Я добавил wp_loginout() в свой хедер, используя сниппет в functions.php:
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
ob_start();
wp_loginout('index.php');
$loginoutlink = ob_get_contents();
ob_end_clean();
$items .= '<li>'. $loginoutlink .'</li>';
return $items;
}
Проблема в том, что ссылка на вход отображается во всех трех моих меню:
function register_main_menus() {
register_nav_menus(
array(
'primary-menu' => __( 'Primary Menu' ),
'secondary-menu' => __( 'Secondary Menu' ),
'footer-menu' => __( 'Footer Menu' ),
)
);
};
Я бы хотел, чтобы фильтр wp_nav_menu_items включал ссылку на вход только в основное меню. Есть идеи? Спасибо заранее
Смотрите этот связанный вопрос. Я полагаю в вашем случае вы можете обернуть код в if( $args->theme_location == 'primary-menu' )
.
Пожалуйста, измените ваш код следующем образом:
Вы забыли добавить условие if ($args->theme_location == 'primary-menu')
, которое проверяет, является ли меню основным.
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
if ($args->theme_location == 'primary-menu') {
ob_start();
wp_loginout('index.php');
$loginoutlink = ob_get_contents();
ob_end_clean();
$items .= '<li>' . $loginoutlink . '</li>';
return $items;
}
}
function register_main_menus() {
register_nav_menus(
array(
'primary-menu' => __( 'Primary Menu' ),
'secondary-menu' => __( 'Secondary Menu' ),
'footer-menu' => __( 'Footer Menu' ),
)
);
};
На самом деле, я довольно новичок в разработке WordPress и пытаюсь полностью разобраться в документации.
Я замечаю, что существует множество способов решить одну и ту же задачу, и некоторые из них значительно сложнее других.
В случае вышеуказанной проблемы, она решается намного проще, чем описано ранее;
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
фильтр wp_nav_menu_items на самом деле является динамическим, и вы можете просто вставить между wp_nav_menu__items, чтобы нацелиться на конкретное меню.
пример;
add_filter('wp_nav_menu_primary-menu_items', 'add_login_logout_link', 10, 2);
если вы посмотрите файл wp-includes/nav-menu-template.php, вы можете это подтвердить.
Ответ или решение
В мире разработки WordPress существует множество способов настройки и расширения функциональности, особенно когда речь идет о меню навигации. Очень часто задачи, схожие с вашей, требуют понимания того, как работают фильтры и хуки. Ваша цель — добавить ссылку на вход и выход из системы только в одну из навигационных меню, а именно в "Primary Menu". Давайте разберемся, как это можно сделать, прибегая к наилучшим практикам.
Теория
В WordPress встроены инструменты, которые позволяют изменять почти все аспекты системы. Один из таких инструментов — это фильтры. Фильтр wp_nav_menu_items
позволяет модифицировать содержащиеся в меню элементы непосредственно перед их выводом. Это особенно полезно, когда вы хотите добавить дополнительные пункты меню или изменить существующие.
Основная задача данного хука — пройтись по всем элементам меню и позволить разработчику внести свои изменения. Существует возможность определить целевые меню через аргумент $args->theme_location
, что позволяет применить изменения только к определенным областям меню.
Пример
Исходный код, который вы предоставили, добавляет ссылку на вход/выход в каждое меню, что, очевидно, не является оптимальным решением для вашего случая. Чтобы направить модификации только в "Primary Menu", мы можем воспользоваться условием:
add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);
function add_login_logout_link($items, $args) {
// Проверяем, если текущая тема меню - 'primary-menu'
if ($args->theme_location == 'primary-menu') {
ob_start();
wp_loginout('index.php');
$loginoutlink = ob_get_contents();
ob_end_clean();
// Добавляем ссылку входа/выхода в элементы меню
$items .= '<li>' . $loginoutlink . '</li>';
}
return $items;
}
function register_main_menus() {
// Регистрация основных меню
register_nav_menus(
array(
'primary-menu' => __( 'Primary Menu' ),
'secondary-menu' => __( 'Secondary Menu' ),
'footer-menu' => __( 'Footer Menu' ),
)
);
}
Применение
Устанавливая данное решение, мы эффективно ограничиваем добавление ссылки входа/выхода только к "Primary Menu". Это достигается за счет использования проверки $args->theme_location
, которая позволяет точно определить, какой из зарегистрированных мест в теме мы хотим модифицировать.
Для более изящного решения, как вы заметили, можно использовать динамический характер хука, где название меню прописывается прямо в фильтре. Это может быть соблазнительным в плане минимизации кода, но всё-таки следует учитывать, что модифицировать поведение "в лоб" не всегда лучшая практика, особенно если в будущем необходимо будет вносить изменения или расширять функциональность в рамках более сложного проекта.
Заключение
Баланс между эффективностью и простотой кроется в том, насколько хорошо вы понимаете внутренние работы WordPress. Наличие нескольких отдельных методов решения одной проблемы в WordPress — яркий пример гибкости платформы. И хотя применение динамических хуков может казаться более удобным, не забывайте о поддерживаемости и читаемости кода, что особенно важно в командной разработке и на долгосрочной перспективе.
Ваш опыт только начинается, но уже сейчас вы узнаете о способах, которые помогут создавать более кастомизированные и управляемые сайты на WordPress. Понимание того, как работают фильтры и действия, позволит в будущем использовать возможности платформы на полную катушку, соответствуя запросам пользователей и задачам бизнеса.