Wyświetlanie produktów WooCommerce z użyciem WP_Query

Wpis ten stanowi uzupełnienie do mojego poprzedniego artykułu opisującego pobieranie danych produktów WooCommerce z użyciem WP_Query. Skoro umiemy już pobierać dane, to warto byłoby je wyświetlić w naszym motywie.

Bazą dla naszych przykładów będzie poniższy kod, który opisywałem już we wspomnianym artykule o pobieraniu danych:

<?php
$params = array('posts_per_page' => 5, 'post_type' => 'product');
$wc_query = new WP_Query($params);
?>
<?php if ($wc_query->have_posts()) : ?>
    <?php while ($wc_query->have_posts()) :
                $wc_query->the_post(); ?>
        <?php the_title(); ?>
    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
<?php else:  ?>
<p><?php _e( 'Brak produktów' ); ?></p>
<?php endif; ?>

Ponieważ produkty WooCommerce są po prostu wpisami typu product to podstawowe ich informacje możemy wyświetlić z użyciem standardowych funkcji takich jak:

  • the_title() – nazwa produktu
  • the_excerpt() – skrócony opis produktu
  • the_content() – pełna treść opisu produktu
  • the_permalink() – URL do produktu
  • the_ID() – ID produktu
  • the_post_thumbnail() – zdjęcie produktu

Przykładowe wykorzystanie powyższych funkcji:

<?php
$params = array('posts_per_page' => 5, 'post_type' => 'product');
$wc_query = new WP_Query($params);
?>
<ul>
<?php if ($wc_query->have_posts()) : ?>
    <?php while ($wc_query->have_posts()) :
                $wc_query->the_post(); ?>
    <li>
       <h3>
             <a href="<?php the_permalink(); ?>">
             <?php the_title(); ?>
             </a>
       </h3>
<?php the_post_thumbnail(); ?>
<?php the_excerpt(); ?>
</li>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<li><?php _e( 'Brak produktów' ); ?></li>
<?php endif; ?>
</ul>

Jednak WooCommerce posiada też wiele innych elementów, które na pewno warto wyświetlać w określonych rodzajach list produktów. Poniżej kilka przykładów wraz z kodem do wstawienia w pętli wyświetlającej produkty:

Zdobycie danych produktu

Wiele z poniższych przykładów wykorzystuje dodatkowe dane i metody dostępne w obiektach klasy WC_Product – aby stworzyć obiekt tej klasy dla danego produktu musimy wywołać następujący kod w pętli wyświetlającej nasze produkty:

$product = new WC_Product(get_the_ID());

Alternatywnie można wykorzystać funkcję get_product:

$product = get_product(get_the_ID());

Cena produktu

Cenę produktu najprościej wyświetlić poprzez metodę get_price_html:

echo $product->get_price_html();

Przy czym należy pamiętać o tym, że w zależności od tego czy produkt jest przeceniony lub nie otrzymamy trochę inne struktury HTML.

Dodatkowo możemy mieć potrzebę wykorzystania innego sposobu wyświetlania cen. Dlatego warto zapoznać się z następującymi metodami:

  • $product->get_sale_price() – zwraca cenę promocyjną (bez podatku)
  • $product->get_regular_price() – zwraca cenę normalna (bez podatku)
  • $product->get_price() – zwraca aktywną cenę (bez podatku)
  • $product->get_price_excluding_tax() – zwraca aktywną cenę bez podatku
  • $product->get_price_including_tax() – zwraca aktywną cenę z podatkiem
  • wc_price() – dodaje symbol waluty do zadanej ceny (powyższe funkcjie zwracają cenę bez symbolu waluty)

Zatem przykładowo chcąc pokazać cenę promocyjną z podatkiem i symbolem waluty, musimy użyć poniższego kodu:

echo wc_price($product->get_price_including_tax(1, $product->get_sale_price()));

W tym miejscu warto dodać, że jako pierwszy argument metody get_price_including_tax / get_price_excluding_tax przyjmują liczbę produktów – w naszym wypadku 1.

Jak widać kosztem dużo dłuższego kodu mamy pełną kontrolę nad sposobem wyświetlania cen.

Ocena produktu

Ocenę produktu, podobnie jak cenę, możemy wyświetlić bardzo prosto, korzystając z metody get_rating_html():

echo $product->get_rating_html();

Jednak w tym wypadku jesteśmy skazani na standardową strukturę HTML ocen WooCommerce. Alternatywnie możemy z użyciem metodget_rating_count() (zwraca liczbę ocen) oraz get_average_rating() (zwraca ocenę produktu na bazie ocen użytkowników) stworzyć własną strukturę do wyświetlania ocen.

Liczba recenzji produktu

Liczbę recenzji produktu wyświetlimy poprzez metodę get_review_count():

echo $product->get_review_count();

Polecam opakować tą wartość w link do strony produktu i elementu #reviewsw niej, dzięki czemu od razu po kliknięciu linka pojawią się opinie na temat produktu:

<a href="<?php the_permalink(); ?>#reviews">
    Opinie: <?php echo $product->get_review_count(); ?>
</a>

Wyróżnianie produktów

Do odróżnienia wybranych produktów od innych można wykorzystać następujące metody:

  • $product->is_on_sale() – dla produktów w cenach wyprzedażowych
  • $product->is_featured() – dla produktów wyróżnionych
  • $product->is_in_stock() – dla produktów będących na magazynie
  • $product->is_sold_individually() – dla produktów sprzedawanych pojedynczo
  • $product->is_downloadable() – dla produktów, które są dostępne do pobrania
  • $product->is_virtual() – dla produktów cyfrowych

Przykładowy kod:

<?php if($product->is_on_sale()) : ?>
<strong><?php _e('Wyprzedaż', 'my-theme'); ?></strong>
<?php endif; ?>

Przycisk dodaj do koszyka

Na koniec chyba najbardziej przydatne zagadnienie – czyli dodawanie produktu do koszyka.

Zacznijmy od bazowego koszyka:

<form class="cart" method="post" enctype="multipart/form-data">
     <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>">
     <button type="submit">
         <?php echo $product->single_add_to_cart_text(); ?>
     </button>
</form>

Jak łatwo się domyślić kluczowym elementem jest tutaj ukryte pole o nazwie add-to-cart, które jako wartość przechowuje ID produktu.

Warto pamiętać, że koszyka w tej formie możemy używać tylko wtedy gdy mamy jakiś ajaksowo odświeżany koszyk w motywie – inaczej istnieje duża szansa na to, że użytkownik nie zobaczy żadnego komunikatu o dodaniu produktu do koszyka.

Dlatego osobiście stosuję przekierowanie na stronę produktu z użyciem atrybutu action i funkcji the_permalink():

<form class="cart" action="<?php the_permalink() ?>" method="post" enctype="multipart/form-data">
     <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>">
     <button type="submit"><?php echo $product->single_add_to_cart_text(); ?></button>
</form>

Dodatkowo możemy też dodać pole do określania liczby produktów:

<form class="cart" action="<?php the_permalink() ?>" method="post" enctype="multipart/form-data">
    <div class="quantity">
         <input type="number" step="1" min="1" max="9" name="quantity" value="1" title="<?php _e('Szt.', 'my-theme'); ?>" class="input-text qty text" size="4">
    </div>
    <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>">
    <button type="submit"><?php echo $product->single_add_to_cart_text(); ?></button>
</form>

Na koniec cały kod koszyka warto opatrzyć w dwa dodatkowe warunki – przycisk nie może się pokazywać, gdy produktu nie można kupić oraz wtedy gdy ma warianty – wtedy użytkownik powinien być przeniesiony na stronę produktu. Cały kod wraz z obsługą tych dwóch przypadków widoczny jest poniżej:

<?php if($product->has_child()) : ?>
<a href="<?php the_permalink(); ?>"><?php _e('Zobacz dostępne warianty', 'my-theme'); ?></a>
<?php elseif($product->is_in_stock()) : ?>
<form class="cart" action="<?php the_permalink() ?>" method="post" enctype="multipart/form-data">
    <div class="quantity">
         <input type="number" step="1" min="1" max="9" name="quantity" value="1" title="<?php _e('Szt.', 'my-theme'); ?>" class="input-text qty text" size="4">
    </div>
    <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>">
    <button type="submit"><?php echo $product->single_add_to_cart_text(); ?></button>
</form>
<?php endif; ?>

Podsumowanie

Pokazane w powyższym wpisie funkcje klasy WC_Product, to tylko część jej prawdziwych możliwości. Zachęcam do lektury dokumentacji by poznać pozostałe pola i metody tej użytecznej części API wtyczki WooCommerce.

Ekskluzywne porady, triki i trendy bezpośrednio na Twoją skrzynkę odbiorczą. Adres e-mail

[shopmagic_form id="3782" name=false labels=false doubleOptin]

Ekskluzywne porady, triki i trendy bezpośrednio na Twoją skrzynkę odbiorczą. Adres e-mail

[shopmagic_form id="3782" name=false labels=false doubleOptin]