Jak sprawdzić, czy produkt należy do określonej kategorii na single-product.php w Woocommerce?

25

Jak na świecie mogę sprawdzić, czy produkt należy do określonej kategorii produktów na 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 („ślimak”) nie ma wpływu na single-product.php . Chcę mieć górne warunki warunkowe. Jakieś rozwiązanie tego na stronie jednego produktu?

Alex
źródło
Może dlatego, że w pierwszym wyciągu brakuje zamknięcia )? Powinno byćif (is_product_category('audio'))
stealthyninja,
Dobry chwyt, ale to nie wszystko. is_product_category nie działa na single-product.php
Alex

Odpowiedzi:

28

Nie sądzę, że get_categories()jest to najlepsza opcja dla Ciebie w tym przypadku, ponieważ zwraca ciąg ze wszystkimi kategoriami wymienionymi jako tagi kotwicy, dobrze do wyświetlania, ale nie jest świetny do zrozumienia w kodzie, jakie są kategorie. Ok, więc pierwszą rzeczą, którą musisz zrobić, to pobrać obiekt produktu / postu dla bieżącej strony, jeśli jeszcze go nie masz:

global $post;

Następnie możesz uzyskać obiekty terminu kategorii produktu (kategorie) dla produktu. Tutaj przekształcam obiekty terminów kategorii w prostą tablicę o nazwie, $categoriesaby łatwiej było zobaczyć, jakie ślimaki są przypisane. Pamiętaj, że spowoduje to zwrócenie wszystkich kategorii przypisanych do produktu, a nie tylko tej z bieżącej strony, tj. Jeśli jesteśmy na /shop/audio/funzo/:

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

Następnie musimy tylko sprawdzić, czy kategoria znajduje się na liście:

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

Kładąc wszystko razem:

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

Mam nadzieję, że tego właśnie szukałeś i odpowiada na twoje pytanie.

Justin Stern
źródło
37

has_term powinien działać w tym przypadku:

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';
}
Milo
źródło
Super prosty i skuteczny sposób na zrobienie tego. Myślę, że to lepsza odpowiedź.
Trevor,
Wolałem to, ponieważ było krótkie. Jednak zrobiłemif { thing; return;}
Eoin
8

Warto zauważyć, że możesz przeglądać listę opcji, wywołując tablicę, zamiast zaśmiecać kod wieloma kontrolami elseif, zakładając, że chcesz zrobić to samo z każdą kategorią.

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

// Do stuff here

else :

// Do some other stuff

endif;
Koshensky
źródło
Myślę, że tę odpowiedź należy dodać jako edycję do odpowiedzi Milo.
cybmeta
0

Chciałbym użyć get_categories()funkcji klasy WC_Product.

Link do dokumentacji można znaleźć tutaj .

Zasadniczo w pętli strony wywołuje funkcję, aby zwrócić kategorie związane z produktem.

Steve
źródło
Nie jestem w stanie tego zakodować. Nie mam pojęcia, jak to zrobić. Niech ktoś to zilustruje. Próbowałem tam, co mogłem. Czy powinienem zastąpić to get_categories ()?
Alex
@Alex funkcja is_product_category () zwraca PRAWDA, jeśli jesteś na stronie kategorii produktu. Nie kategoria produktu. W tej chwili spoglądam na projekt, ale później postaram się zdobyć fragment kodu.
Steve,
Dzięki, Steven, za poświęcenie czasu na napisanie tego małego fragmentu kodu. Doceniam to bardzo.
Alex