Создайте шорткод для отображения конкретного навигационного меню в зависимости от категории продукта

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

Мне нужно создать шорткод, который отображает конкретное меню WordPress на странице продукта Woocommerce в зависимости от категории, к которой принадлежит продукт. Как категория, так и меню идентифицируются по ID, но мне не удается сделать это работающим.

Вот мой код:

function view_color_menu( $category ) {
    $catarray = get_the_category( $post->ID );
    foreach ($catarray as $cat) {
        $catid = $cat->term_id;
        if ($catid == 31) {
          wp_nav_menu( array( 'menu_id' => '16' ) ); 
        }
        if ($catid == 35) {
          wp_nav_menu( array( 'menu_id' => '17' ) ); 
        }
        if ($catid == 42) {
          wp_nav_menu( array( 'menu_id' => '21' ) ); 
        }
    }
}
add_shortcode('get_color_menu', 'view_color_menu');

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

Чтобы создать шорткод для отображения конкретного меню в зависимости от категории продукта на сайте WordPress с плагином WooCommerce, необходимо внести несколько изменений в вашу реализацию. Ваш код выглядит близким к правильному, но требует некоторых корректировок для корректной работы.

Вот исправленный и полный вариант кода:

function view_color_menu() {
    // Получаем глобальную переменную поста
    global $post;

    // Проверяем, является ли пост продуктом
    if ( 'product' == get_post_type( $post ) ) {
        // Получаем категории продукта
        $catarray = get_the_terms( $post->ID, 'product_cat' );

        // Проверяем, существуют ли категории
        if ( ! empty( $catarray ) && ! is_wp_error( $catarray ) ) {
            foreach ( $catarray as $cat ) {
                $catid = $cat->term_id;

                // В зависимости от идентификатора категории отображаем нужное меню
                if ( $catid == 31 ) {
                    wp_nav_menu( array( 'menu' => '16' ) ); 
                    return; // Прекращаем выполнение после первого совпадения
                }
                if ( $catid == 35 ) {
                    wp_nav_menu( array( 'menu' => '17' ) ); 
                    return;
                }
                if ( $catid == 42 ) {
                    wp_nav_menu( array( 'menu' => '21' ) ); 
                    return;
                }
            }
        }
    }
    // Если нет подходящей категории, можно вернуть что-то по умолчанию или ничего
    return '';
}
add_shortcode('get_color_menu', 'view_color_menu');

Объяснение изменений:

  1. Глобальная переменная $post: Мы получаем доступ к глобальной переменной $post, чтобы убедиться, что мы получаем информацию о текущем продукте.

  2. Проверка типа поста: Мы проверяем, является ли текущий пост продуктом, используя get_post_type( $post ).

  3. Правильно получаем категории: Используем get_the_terms( $post->ID, 'product_cat' ), чтобы получить категории продукта. Функция get_the_category() предназначена для обычных категорий и не сработает для категорий продуктов WooCommerce.

  4. Проверка на наличие категорий: Проверяем, существуют ли категории и что не произошло ошибки, используя ! empty() и ! is_wp_error().

  5. Использование параметра 'menu': Изменен параметр menu_id на menu при вызове wp_nav_menu(), так как именно так WordPress ожидает идентификатор меню.

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

Теперь вы можете использовать шорткод [get_color_menu] в любом месте вашего сайта, и он будет отображать соответствующее меню в зависимости от категории продукта.

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

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