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


25

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 os condicionais superiores. Alguma solução para isso em uma página de produto único?


Pode ser porque a sua primeira declaração está faltando um fechamento )? Deveria serif (is_product_category('audio'))
stealthyninja 12/12

Boa captura, mas não é isso. is_product_category não parece trabalhar em single-product.php
Alex

Respostas:


28

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

global $post;

Em seguida, você pode obter os objetos de termo da categoria do produto (as categorias) para o produto. Aqui, estou transformando os objetos de termo de categoria em uma matriz simples denominada, $categoriespara que seja mais fácil ver quais lesmas são atribuídas. Observe que isso retornará todas as 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;

Depois, basta verificar se uma categoria está na lista:

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

Juntando tudo:

<?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 isso que você estava procurando e responda à sua pergunta.


37

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

Maneira super simples e eficaz de fazer isso. Eu acho que essa é uma resposta melhor.
Trevor

Eu preferi isso porque era curto. No entanto eu fizif { thing; return;}
Eoin 31/01

8

Vale a pena notar que você pode percorrer uma lista de opções chamando uma matriz em vez de ter que desordenar seu código com muitas outras verificações, assumindo que você queira fazer o mesmo com cada categoria existente.

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

// Do stuff here

else :

// Do some other stuff

endif;

Penso que esta resposta deve ser adicionada, como edição, à resposta de Milo.
22415 cybmeta


0

Eu get_categories()usaria a função da classe WC_Product.

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

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


Não consigo codificar isso. Eu não tenho idéia de como fazer isso funcionar. Alguém por favor ilustre isso. Eu tentei o meu melhor lá em cima. Devo substituir isso por get_categories ()?
1312 Alex

@Alex, a função is_product_category () retorna TRUE se você estiver na página da categoria do produto. Não é a categoria do produto. Estou no projeto agora, mas tentarei obter um trecho de código mais tarde.
Steve

Obrigado, Steven, por reservar um tempo para codificar esse pequeno trecho. Aprecio muito.
Alex
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.