Как проверить принадлежность товара к определенной категории на single-product.php в Woocommerce?

12 дек. 2012 г., 21:34:21
Просмотры: 108K
Голосов: 30

Как можно проверить, принадлежит ли товар к определенной категории товаров на странице 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. Я хочу использовать условия, как показано выше. Есть ли решение для этого на странице одиночного товара?

3
Комментарии

Возможно, потому что в вашем первом выражении отсутствует закрывающая )? Должно быть if (is_product_category('audio'))

stealthyninja stealthyninja
12 дек. 2012 г. 22:32:53

Хорошее замечание, но дело не в этом. Функция is_product_category, похоже, не работает на single-product.php

Alex Alex
13 дек. 2012 г. 00:10:14

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

Philip Philip
4 апр. 2022 г. 22:19:16
Все ответы на вопрос 5
3
48

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 'какой-то текст';
}
18 дек. 2012 г. 21:14:45
Комментарии

Очень простой и эффективный способ сделать это. Я считаю, это лучший ответ.

Trevor Trevor
25 мая 2017 г. 05:57:39

Я предпочел этот вариант, потому что он короткий. Однако я сделал if { thing; return;}

Eoin Eoin
31 янв. 2018 г. 23:49:55

Это сработало идеально - спасибо!

Calum Childs Calum Childs
23 июл. 2021 г. 08:41:49
0
32

Я не думаю, что 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 'какой-то текст';
}

Надеюсь, это то, что вы искали, и ответит на ваш вопрос.

18 дек. 2012 г. 21:05:33
1

Стоит отметить, что вы можете перебрать список вариантов, используя массив, вместо того чтобы загромождать код множеством проверок elseif, при условии, что вы хотите выполнить одни и те же действия для каждой категории.

if( has_term( array( 'laptop', 'fridge', 'hats', 'magic wand' ), 'product_cat' ) ) :

// Выполнить действия здесь

else :

// Выполнить другие действия

endif;
18 февр. 2015 г. 18:13:08
Комментарии

Я считаю, что этот ответ следует добавить в виде правки к ответу Мило.

cybmeta cybmeta
18 февр. 2015 г. 18:41:36
0

Это устарело, но на случай, если кто-то все еще ищет простое решение от WooThemes:

if ( is_product() && has_term( 'ваша_категория', 'product_cat' ) ) {
    // выполнить код
}

*Замените 'ваша_категория' на то, что используете вы.

Вот ссылка на документацию: https://docs.woothemes.com/document/remov-product-content-based-on-category/

10 июн. 2016 г. 00:37:40
3

Я бы рекомендовал использовать функцию get_categories() класса WC_Product.

Ссылку на документацию можно найти здесь.

По сути, в цикле страницы нужно вызвать эту функцию, чтобы получить категории, связанные с товаром.

13 дек. 2012 г. 00:26:38
Комментарии

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

Alex Alex
13 дек. 2012 г. 18:04:51

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

Steve Steve
13 дек. 2012 г. 19:55:24

Спасибо, Стивен, за то, что нашли время написать этот небольшой фрагмент кода. Очень это ценим.

Alex Alex
13 дек. 2012 г. 19:56:59