如何在Woocommerce中的single-product.php上检查产品是否属于某个类别?


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')single-product.php没有影响。我想有较高的条件。在单一产品页面上对此有什么解决方案?


可能是因为您的第一个语句缺少结尾)吗?应该是if (is_product_category('audio'))
secretthyninja 2012年

不错,但这不是。is_product_category似乎不适用于single-product.php
Alex

Answers:


28

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 ) ) {  // 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';
}

超级简单有效的方法来做到这一点。我认为这是更好的答案。
Trevor

我喜欢这个,因为它很短。但是我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;

我认为应该将此答案作为编辑添加到Milo的答案中。
cybmeta 2015年


0

我将研究使用get_categories()WC_Product类的功能。

您可以在此处找到文档的链接。

基本上在页面循环中,调用函数以返回与产品关联的类别。


我无法对此进行编码。我不知道如何使它工作。有人请说明一下。我尽力了。我应该用get_categories()代替它吗?
亚历克斯

如果您位于产品类别页面上,则@Alex is_product_category()函数将返回TRUE。不是产品类别。我现在正在处理一个项目,但是稍后我将尝试为您提供一个代码片段。
史蒂夫

谢谢,史蒂文(Steven)花时间编码这个小片段。非常感谢。
亚历克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.