Вопрос или проблема
Мне нужно создать шорткод, который отображает конкретное меню 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');
Объяснение изменений:
-
Глобальная переменная
$post
: Мы получаем доступ к глобальной переменной$post
, чтобы убедиться, что мы получаем информацию о текущем продукте. -
Проверка типа поста: Мы проверяем, является ли текущий пост продуктом, используя
get_post_type( $post )
. -
Правильно получаем категории: Используем
get_the_terms( $post->ID, 'product_cat' )
, чтобы получить категории продукта. Функцияget_the_category()
предназначена для обычных категорий и не сработает для категорий продуктов WooCommerce. -
Проверка на наличие категорий: Проверяем, существуют ли категории и что не произошло ошибки, используя
! empty()
и! is_wp_error()
. -
Использование параметра
'menu'
: Изменен параметрmenu_id
наmenu
при вызовеwp_nav_menu()
, так как именно так WordPress ожидает идентификатор меню. - Возврат из функции: После успешного отображения одного из меню, выполнение функции завершается с помощью
return;
, чтобы избежать показа нескольких меню.
Теперь вы можете использовать шорткод [get_color_menu]
в любом месте вашего сайта, и он будет отображать соответствующее меню в зависимости от категории продукта.