Как проверить, находится ли продукт в определенной категории на одном product.php в Woocommerce?


25

Как в мире я могу проверить, находится ли продукт в определенной товарной категории на single-product.php ?

<?php if (is_product_category('audio')) {
           echo 'In audio';
               woocommerce_get_template_part( 'content', 'single-product' );

      } elseif (is_product_category('elektro')) {

            echo 'In elektro';
            woocommerce_get_template_part( 'content', 'single-product' );
         } else {
            echo 'some blabla'; }  ?>

is_product_category ('slug') не влияет на одиночный product.php . Я хочу иметь верхние условия. Любое решение для этого на странице одного продукта?


Может быть потому, что в вашем первом заявлении отсутствует закрытие )? Так и должно бытьif (is_product_category('audio'))
stealthyninja

Хороший улов, но это не так. Кажется, что is_product_category не работает с одиночным product.php
Алекс

Ответы:


28

Я не думаю, что get_categories()это лучший вариант для вас в этом случае, потому что он возвращает строку со всеми категориями, перечисленными в качестве тегов привязки, отлично подходит для отображения, но не очень хорошо для определения в коде, что такое категории. Итак, первое, что вам нужно сделать, это взять объект product / post для текущей страницы, если у вас его еще нет:

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 ) ) {  // do something

Собираем все вместе:

<?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 'In audio';
  woocommerce_get_template_part( 'content', 'single-product' );
} elseif ( in_array( 'elektro', $categories ) ) {
  echo 'In elektro';
  woocommerce_get_template_part( 'content', 'single-product' );
} else {
  echo 'some blabla';
}

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


37

has_term должно работать в этом случае:

if ( has_term( 'audio', 'product_cat' ) ) {

       echo 'In audio';
       woocommerce_get_template_part( 'content', 'single-product' );

} elseif ( has_term( 'elektro', 'product_cat' ) ) {

       echo 'In elektro';
       woocommerce_get_template_part( 'content', 'single-product' );

} else {
       echo 'some blabla';
}

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

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

8

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

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

// Do stuff here

else :

// Do some other stuff

endif;

Я думаю, что этот ответ должен быть добавлен, как редактирование, к ответу Майло.
cybmeta


0

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

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

По сути, внутри цикла страницы вызывается функция, возвращающая категории, связанные с продуктом.


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

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

Спасибо, Стивен, за то, что уделил время написанию этого маленького фрагмента. Очень ценю это.
Алекс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.