Как проверить принадлежность товара к определенной категории на single-product.php в Woocommerce?
Как можно проверить, принадлежит ли товар к определенной категории товаров на странице single-product.php?
<?php if (is_product_category('audio')) {
echo 'В категории аудио';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif (is_product_category('elektro')) {
echo 'В категории электро';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'что-то еще'; } ?>
is_product_category('slug') не работает на странице single-product.php. Я хочу использовать условия, как показано выше. Есть ли решение для этого на странице одиночного товара?
has_term
должен работать в данном случае:
if ( has_term( 'audio', 'product_cat' ) ) {
echo 'В аудио';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif ( has_term( 'elektro', 'product_cat' ) ) {
echo 'В электро';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'какой-то текст';
}

Я не думаю, что get_categories()
— лучший вариант в вашем случае, потому что он возвращает строку со всеми категориями в виде якорных тегов, что хорошо для отображения, но не очень удобно для программного определения категорий. Итак, первое, что вам нужно сделать — получить объект товара/записи для текущей страницы, если у вас его еще нет:
global $post;
Затем вы можете получить объекты терминов категорий товара (категории) для этого товара. Здесь я преобразую объекты терминов категорий в простой массив с именем $categories
, чтобы было проще увидеть, какие слаг-имена назначены. Обратите внимание, что это вернет все категории, назначенные товару, а не только категорию текущей страницы, например, если мы находимся на /shop/audio/funzo/
:
$terms = wp_get_post_terms( $post->ID, 'product_cat' );
foreach ( $terms as $term ) $categories[] = $term->slug;
Затем нам остаётся только проверить, есть ли категория в списке:
if ( in_array( 'audio', $categories ) ) { // сделать что-то
Собираем всё вместе:
<?php
global $post;
$terms = wp_get_post_terms( $post->ID, 'product_cat' );
foreach ( $terms as $term ) $categories[] = $term->slug;
if ( in_array( 'audio', $categories ) ) {
echo 'В категории audio';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif ( in_array( 'elektro', $categories ) ) {
echo 'В категории elektro';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'какой-то текст';
}
Надеюсь, это то, что вы искали, и ответит на ваш вопрос.

Стоит отметить, что вы можете перебрать список вариантов, используя массив, вместо того чтобы загромождать код множеством проверок elseif, при условии, что вы хотите выполнить одни и те же действия для каждой категории.
if( has_term( array( 'laptop', 'fridge', 'hats', 'magic wand' ), 'product_cat' ) ) :
// Выполнить действия здесь
else :
// Выполнить другие действия
endif;

Это устарело, но на случай, если кто-то все еще ищет простое решение от WooThemes:
if ( is_product() && has_term( 'ваша_категория', 'product_cat' ) ) {
// выполнить код
}
*Замените 'ваша_категория' на то, что используете вы.
Вот ссылка на документацию: https://docs.woothemes.com/document/remov-product-content-based-on-category/

Я бы рекомендовал использовать функцию get_categories()
класса WC_Product.
Ссылку на документацию можно найти здесь.
По сути, в цикле страницы нужно вызвать эту функцию, чтобы получить категории, связанные с товаром.

Я не могу закодировать это. У меня нет никаких идей, как заставить это работать. Кто-нибудь, пожалуйста, проиллюстрируйте это. Я сделал все возможное выше. Должен ли я заменить это на get_categories()?

@Alex функция is_product_category() возвращает TRUE, если вы находитесь на странице категории товаров. Не на категории товара. Сейчас я полностью погружен в проект, но позже попробую предоставить вам фрагмент кода.
