Целевая установка определенного меню с помощью wp_nav_menu_items

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

Привет! Я добавил 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. Понимание того, как работают фильтры и действия, позволит в будущем использовать возможности платформы на полную катушку, соответствуя запросам пользователей и задачам бизнеса.

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

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