Pobieranie produktów WooCommerce z użyciem WP_Query

Dosyć często występuje potrzeba wyświetlenia produktów WooCommerce z wykorzystaniem specyficznej struktury HTML. Jednym z rozwiązań jest wykorzystanie WP_Query i pętli wpisów do generowania własnej struktury. W tym wpisie przedstawię kilka przykładów wyświetlania produktów z użyciem tej metody.

Wprowadzenie

Aby zapewnić sobie możliwość wyświetlania produktów w różnych miejscach motywu najlepiej poniższe przykłady opakować w shortcode, który będzie wyświetlał wpisy generowane poprzez WP_Query. Drugą opcją jest stworzenie widżetu, który będzie korzystał z opisywanych fragmentów kodu.

WP_Query pozwala tworzyć złożone zapytania zwracające posty – wyniki takiego zapytania można następnie wyświetlić w pętli w której mamy dostęp do wygodnych funkcji takich jak the_title() czy the_excerpt(). Co bardzo ważne – użycie WP_Query ma wpływ na zmienne wykorzystywane przy kolejnych zapytaniach, dlatego też należy pamiętać o przywróceniu globalnych zmiennych do pierwotnego stanu funkcją wp_reset_postdata().

Struktura bazowego kodu dla naszych przykładów prezentuje się następująco:

<?php
$params = array('posts_per_page' => 5); // (1)
$wc_query = new WP_Query($params); // (2)
?>
<?php if ($wc_query->have_posts()) : // (3) ?>
    <?php while ($wc_query->have_posts()) : // (4)
                $wc_query->the_post(); // (5) ?>
        <?php the_title(); // (6) ?>
    <?php endwhile; ?>
    <?php wp_reset_postdata(); // (7) ?>
<?php else:  ?>
<p><?php _e( 'Brak produktów' ); // (8) ?></p>
<?php endif; ?>

Powyższy kod zwróci tytuły pięciu ostatnich wpisów z bazy naszego WordPressa, wykonując przy tym następujące operacje:

1) Tworzymy tablicę parametrów dla WP_Query – to głównie operując na jej wartościach, będziemy uzyskiwać różne rezultaty naszych zapytań

2) Na bazie parametrów tworzymy zapytanie

3) Sprawdzamy czy zapytanie zwróciło jakiekolwiek wyniki

4) Jeżeli są wyniki to iterujemy po nich…

5) …ustawiając zmienną globalną $post, która zapewnia działanie takich funkcji jak…

6) … the_title() odpowiedzialna za wyświetlenie tytułu wpisu

7) Po wyświetleniu wszystkiego przywracamy zmienną $post do pierwotnego stanu

8) Gdyby w punkcie 3. okazało się, że nie ma wpisów do wyświetlenia to w tym miejscu wyświetlamy stosowny komunikat.

Pobieranie produktów WooCommerce

Wspomniany we wprowadzeniu kod ma jedną wadę – wyświetla 5 ostatnich wpisów a nie produktów WooCommerce – wynika to z tego, że domyślna wartość parametru post_type dla WP_Query to post. Wystarczy jednak zmienić tablicę parametrów zapytania na:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => 'product'
);

By zapytanie zaczęło zwracać nam produkty z WooCommerce.

To tyle tytułem rozgrzewki – pora na bardziej wyszukane przykłady :)

Wyświetlanie produktów będących w promocji

Za promocyjną cenę odpowiada w WooCommerce pole _sale_price – gdy produkt nie ma ceny promocyjnej pozostaje ono puste. Dlatego aby znaleźć produkty w promocji, należy sprawdzić czy pole _sale_price ma wartość większą lub równą zeru – posłuży nam do tego następujący zestaw parametrów:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => 'product',
        'meta_key' => '_sale_price',
        'meta_value' => '0',
        'meta_compare' => '>='
);

Co z wariantami produktów w promocyjnej cenie?

Poprzedni kod oczywiście nie uwzględnia wariantów produktów, którym przecież też możemy nadać promocyjną cenę. Wynika to z faktu, że WooCommerce przechowuje każdy wariant produktu jako oddzielny post i do tego jest to post innego typu – product_variation. Dlatego potrzebujemy małej modyfikacji naszej tablicy parametrów:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => array('product', 'product_variation'),
        'meta_key' => '_sale_price',
        'meta_value' => 0,
        'meta_compare' => '>='
        'meta_type' => 'NUMERIC'
);

W powyższym kodzie korzystamy z faktu, że parametr post_type jako wartość może przyjąć także tablicę kilku różnych typów postów, które mają być uwzględnianie przy zapytaniu do bazy.

Wyświetlanie produktów z zadanego przedziału cenowego

Czasami przydaje się możliwość wyświetlania produktów o określonej cenie – cenę produktu przechowuje pole _price, zatem przy zapytaniu musimy uwzględnić zarówno cenę zwykłą jak i promocyjną – zacznijmy od prostszego wariantu w którym pobierzemy produkty tańsze niż 5:

$params = array(
        'posts_per_page' => 100, 
        'post_type' => array('product', 'product_variation'),
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => '_price',
                'value' => 5,
                'compare' => '<=',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => '_sales_price',
                'value' => 5,
                'compare' => '<=',
                'type' => 'NUMERIC'
            )
        )
);

Korzystamy tutaj z parametru meta_query, który pozwala nam budować bardziej złożone zapytania bazujące na polach wpisów. Domyślny sposób łączenia warunków to koniunkcja (AND), dlatego dodatkowo musimy dodać parametr relation by korzystać przy łączeniu warunków z alternatywy (OR).

Pora na główny przykład w tej części – czyli produkty z zadanego zakresu cenowego – w tym wypadku 10-15:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => array('product', 'product_variation'),
        'meta_query' => array(
            'relation' => 'OR',
            array(
                array(
                    'key' => '_price',
                    'value' => 10,
                    'compare' => '>=',
                    'type' => 'NUMERIC'
                ),
                array(
                    'key' => '_price',
                    'value' => 15,
                    'compare' => '<=',
                    'type' => 'NUMERIC'
                )
            ),
            array(
                array(
                    'key' => '_sale_price',
                    'value' => 10,
                    'compare' => '>=',
                    'type' => 'NUMERIC'
                ),
                array(
                    'key' => '_sale_price',
                    'value' => 15,
                    'compare' => '<=',
                    'type' => 'NUMERIC'
                )
            )
        )
);

Wyświetlanie tylko dostępnych produktów

Za stan magazynowy produktu odpowiada pole _stock_status, które przyjmuje dwie wartości: instock oraz outofstock. Zatem żeby pokazać tylko produkty o cenie niższej niż 5 oraz znajdujące się w magazynie, wykorzystamy następujące parametry:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => array('product', 'product_variation'),
        'meta_query' => array(
            array(
                'key' => '_price',
                'value' => 5,
                'compare' => '<',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => '_stock_status',
                'value' => 'instock'
            )
        )
);

Wyświetlanie produktów o określonym stanie magazynowym

W WooCommerce możemy też zarządzać ilością produktów w magazynie – wartość tą przechowuje pole _stock. Dzięki temu, podobnie jak w wypadku ceny produktu, możemy wyświetlić tylko te produkty, które występują w określonej ilości w magazynie np. produkty, których jest więcej niż 5 w magazynie:

$params = array(
        'posts_per_page' => 100, 
        'post_type' => array('product', 'product_variation'),
        'meta_query' => array(
            array(
                'key' => '_stock',
                'value' => 5,
                'compare' => '>',
                'type' => 'NUMERIC'
            )
        )
);

Wyświetlanie wariantów wybranego produktu

Na koniec dużo prostszy ale warty uwagi przykład wyświetlania wariantów danego produktu:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => array('product_variation'),
        'post_parent' => 15
);

W tym wypadku korzystamy z faktu, że warianty produktu poza określonym typem wpisu mają też ustawione pole na wartość ID produktu-rodzica. Powyższy przykład wyświetli do 5 wariantów produktu o ID równym 15. Oczywiście podobnie jak w wypadku typów wpisów możemy podać kilka ID produktów rodziców w postaci tablicy:

$params = array(
        'posts_per_page' => 5, 
        'post_type' => array('product_variation'),
        'post_parent' => array(15, 25)
);

Podsumowanie

WP_Query samo w sobie ma ogromne możliwości i warto je wykorzystywać także w wypadku produktów WooCommerce. Każdy produkt WooCommerce ma kilkanaście pól, które można wykorzystać do wyszukiwania produktów spełniających określone kryteria co daje w zasadzie nieograniczone możliwości filtrowania i dobierania produktów.

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]