Budujemy customowe WP_Query

21 stycznia 2023

Zobacz jak zbudować niestandardowe zapytania odnosząc się do klasy zdefiniowanej w Wordpress. Dzięki custom WP_Query dostaniemy się do danych dostępnych w bazie danych.

Co to jest WP_Query ?

WP_Query, jest klasą zdefiniowaną w WordPress. Pozwala ona developerom na tworzenie nietypowych zapytań do bazy danych dzięki przekazywanym argumentom.

Przykład zapytania

<?php
   $args = array(
     'post_type' => 'post',
   );
   $query = new WP_Query($args);
?>

<ul>
 <?php while ($query->have_posts()) : $query->the_post(); 
 ?>
  <li><?= the_title(); ?></li>
 <?php endwhile; ?>
</ul>

Jest to przykładowe zapytanie do bazy danych, które zwróci nam wszystkie wpisy dodane na stronie po czym wyświetli je nam jako listę wpisów.

Informacje, które chcemy uzyskać z bazy danych przekazujemy do zmiennej $args (ogólnie przyjęta nazwa zmiennej dla argumentów). Zamiast 'post_type’ => 'post’, możemy na przykład pobrać posty zawarte w konkretnej kategorii poprzez dopisanie kolejnych argumentów do zmiennej $args. Np. 'category_name’ => 'nazwa_kategorii’,

Lista argumentów dostepnych w WP_Query

Autor

'author' => 1, // (int) Podajemy ID autora
'author_name' => 'artur', // (string) - używa 'user_nicename'

Kategorie

'cat' => 5, 
// (int) - podajemy numer ID danej kategorii

'category_name' => 'nazwa', 
// (string) - podajemy "slug" kategorii

'category__and' => array( 2, 6 ), 
// (array) - przyjmuje ID kategorii.

'category__in' => array( 2, 6 ), 
// (array) - przyjmuje ID kategorii.

'category__not_in' => array( 2, 6 ),
// (array) - przyjmuje ID kategorii.

Tagi

'tag' => 'cooking', 
// (string) - używa sluga.

'tag_id' => 5, 
// (int) - korzysta z ID tagu.

'tag__and' => array( 2, 6), 
// (array) - korzysta z ID tagu.

'tag__in' => array( 2, 6), 
// (array) - korzysta z ID tagu.

'tag__not_in' => array( 2, 6), 
// (array) - ukorzysta z ID tagu.

'tag_slug__and' => array( 2, 6), 
// (array) - używa sluga.

'tag_slug__in' => array( 2, 6), 
// (array) - używa sluga.

Post

'p' => 1, 
// (int) - używa ID postu.

'name' => 'hello-world', 
// (string) - używa sluga postu.

'page_id' => 1, 
// (int) - używa ID strony.

'pagename' => 'sample-page', 
// (string) - używa sluga strony.

'pagename' => 'sample-page/child', 
// (string) - wyświetla zagnieżdzoną stronę

'post_parent' => 1, 
// (int) - używa ID strony. Zwraca zagnieżdzone strony.

'post__in' => array(1,2,3), 
// (array) - używa ID postu. Pobieramy ID postów podanych w tablicy.

'post__not_in' => array(1,2,3), 
// (array) - używa ID postu. NIE pobieramy ID postów podanych w tablicy.

Post – typ i status

Poza zapytaniami podanymi powyżej, możemy również „zapytać” o typ i status wpisów.

'post_type' => array( //(string / array) - używa typów postów;
            'post',            // - wpis.
            'page',            // - strona.
            'revision',        // - rewizja.
            'my-post-type'     // - przyjmuje customowe typy postów np. 'moje-filmy'
            ),  
    'post_status' => array(    //(string / array) - używa "statusu" postu. Standardowo wykorzystuje 'publish'. Możemy wyświetlić również oczekujące, szkice oraz szkice automatyczne         
            'publish',         // - opublikowana strona lub wpis.
            'pending',         // - wpis oczekujący.
            'draft',           // - szkic.
            'auto-draft'       // - nowo utworzony, jeszcze bez treści
            'future'           // - wpis który ma być opublikowany w przyszłości
            'private'          // - niewidoczny dla niezalogowanych użytkowników
            'inherit'          // - rewizja, zobacz get_children.
            'trash'            // - wpis w "koszu" (WP od wersji 2.9).
            'any'              // - pobiera dowolny status z wyjątkiem tych z typów postów z ustawieniem „exclude_from_search” na true.
            ),

Parametry paginacji

'posts_per_page' => 10, 
// (int) - liczba postów która ma zostać wyświetlona. Ustawienie na '-1' spowoduje pobranie wszystkich postów.

'posts_per_archive_page' => 10, 
// (int) - liczba postów do wyświetlenia tylko na stronach archiwum. Zastępuje wyświetlanie postów posts_per_page na stronach, na których is_archive() lub is_search() byłoby ustawione na 'true'

'nopaging' => false,                    
// (bool) - pokaże wszystkie posty lub użyje paginacji. Wartość domyślna to „false”.

'paged' => get_query_var('page'),       
// (int) - pokazuje posty na "podstronach"

Różne

'offset' => 3,
// (int) - wyświetla "query" od numeru elementu podanego w kluczu offset

'order' => ASC,
// Kolejność wyświetlania
//'ASC' - rosnąco od najniższych do najwyższych wartości (1, 2, 3; a, b, c).
//'DESC' - kolejność malejąca od najwyższych do najniższych wartości (3, 2, 1; c, b, a).

Przykładowe zapytanie

Stwórzmy przykładowe zapytanie o wpisy z kategorii o nazwie „biblioteka”, które wyświetli nam 10 postów w kolejności rosnącej z pominięciem pierwszego wpisu

<?php
   $args = array(
     'post_type' => 'post',
     'category_name' => 'biblioteka',
     'order' => 'ASC',
     'offset' => 1,
     'post_per_page' => 10,
   );
   $query = new WP_Query($args);
?>

<ul>
 <?php while ($query->have_posts()) : $query->the_post(); 
 ?>
  <li><?= the_title(); ?></li>
 <?php endwhile; ?>
</ul>

Więcej na temat WP_Query możesz przeczytać na stronie WordPressa https://developer.wordpress.org/reference/classes/wp_query/

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Dozwolone tagi i atrybuty HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Zobacz również

Me, Myself & I