Como verificar se o produto está em uma determinada categoria em um único produto.php no Woocommerce?

19

Como no mundo posso verificar se um produto está em uma determinada categoria de produto no 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') não afeta o single-product.php . Eu quero ter as condicionais superiores. Alguma solução para isso em uma página de um único produto?

    
por Alex 12.12.2012 / 20:34
fonte

5 respostas

23

Eu não acho que get_categories() é a melhor opção para você neste caso, porque ele retorna uma string com todas as categorias listadas como tags de âncora, ótimo para exibição, mas não é excelente para descobrir no código quais são as categorias . Ok, então a primeira coisa que você precisa fazer é pegar o produto / objeto post para a página atual se você ainda não tiver:

global $post;

Depois, você pode obter os objetos de termo da categoria do produto (as categorias) para o produto. Aqui estou transformando os objetos de termos da categoria em uma matriz simples chamada $categories , para que seja mais fácil ver quais slugs são atribuídos. Observe que isso retornará todas categorias atribuídas ao produto, não apenas a da página atual, ou seja, se estivermos em /shop/audio/funzo/ :

$terms = wp_get_post_terms( $post->ID, 'product_cat' );
foreach ( $terms as $term ) $categories[] = $term->slug;

Em seguida, basta verificar se uma categoria está na lista:

if ( in_array( 'audio', $categories ) ) {  // do something

Colocando tudo junto:

<?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';
}

Espero que seja o que você estava procurando e responda sua pergunta.

    
por Justin Stern 18.12.2012 / 20:05
fonte
25

has_term deve funcionar neste caso:

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';
}
    
por Milo 18.12.2012 / 20:14
fonte
6

É interessante notar que você pode passar por uma lista de opções chamando uma matriz em vez de ter que confundir seu código com muitas verificações elseif, supondo que você queira fazer a mesma coisa com cada categoria.

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

// Do stuff here

else :

// Do some other stuff

endif;
    
por Koshensky 18.02.2015 / 17:13
fonte
2

Isso é antigo, mas apenas para o caso de as pessoas ainda procurarem o WooThemes como uma solução simples:

if ( is_product() && has_term( 'your_category', 'product_cat' ) ) {
    //do code
}

* Altere 'sua_categoria' para o que você estiver usando.

Aqui está o link para a documentação: enlace

    
por tiaNaturally 09.06.2016 / 23:37
fonte
0

Eu observaria o uso da função get_categories() da classe WC_Product.

Você pode encontrar o link para a documentação aqui .

Basicamente, dentro do loop da página, chame a função para retornar as categorias associadas ao produto.

    
por Steve 12.12.2012 / 23:26
fonte