Niestandardowa pętla / zapytanie oparte na niestandardowych polach - CSS-Tricks

Anonim
Ostatnia aktualizacja przez Jason Witt.

Jeśli projektujesz lub opracowujesz motywy lub wtyczki WordPress, istnieje duża szansa, że ​​pewnego dnia będziesz musiał wykonać zapytanie dotyczące niestandardowych pól meta. Są to całkowicie niestandardowe pary klucz / wartość, które możesz dołączyć do dowolnego posta, strony lub niestandardowego typu posta. WordPress ma dla nich podstawowy interfejs użytkownika lub możesz użyć czegoś takiego jak Zaawansowane pola niestandardowe, aby je polubić. Ale pod maską ACF używa zwykłych, niestandardowych pól.

Ta bardzo krótka strona, na którą teraz patrzysz, została napisana w 1999 roku. W tamtym czasie, aby wyszukiwać posty z określonymi polami niestandardowymi, musiałbyś użyć zmiennej globalnej `$ wpdb`. Można go użyć do tworzenia zapytań MySQL, których nie obsługuje klasa WordPress WP_Query (). Na szczęście dzisiaj WordPress ma argumenty, które obsługują zapytania o niestandardowe pola meta.

Tutaj omówimy różne sposoby żądania i zapętlania postów z określonymi polami niestandardowymi (i ich wartościami). Będziesz mógł użyć tych informacji, niezależnie od tego, czy korzystasz z WP_Queryklasy query_posts(), czy get_posts(). Ponieważ query_posts()i get_posts()są opakowaniami dla WP_Queryklasy. Wszyscy akceptują te same argumenty.

Argumenty zapytania

Oto podstawowy przykład zapytania WordPress zaczerpnięty z WordPress Codex.

have_posts() ) ( echo '
    '; while ( $the_query->have_posts() ) ( $the_query->the_post(); echo '
  • ' . get_the_title() . '
  • '; ) echo '
'; ) else ( // no posts found ) /* Restore original Post Data */ wp_reset_postdata();

To $argsjest tam ważne. Będziemy przekazywać różne argumenty, aby to działało tak, jak chcemy.

Podczas odpytywania niestandardowej meta można użyć dwóch „grup” argumentów. Jedna grupa jest przeznaczona dla prostego niestandardowego zapytania o meta pola, a druga do bardziej złożonych niestandardowych zapytań o meta pola. Zacznijmy od prostej grupy.

meta_key

meta_keyArgument zapytania żadnego postu, który ma zwyczaj pola meta identyfikator zapisany w bazie danych, czy nie jest zapisana wartość dla pola. Jest meta_keyto identyfikator, który nadajesz swoim polom meta. Lubię to:

W tym przykładzie zostanie wysłana kwerenda do dowolnego posta, który ma niestandardowe pole meta o identyfikatorze „pole1”.

$args = array( 'meta_key' => 'field1' );

meta_value

meta_valueArgumentem odpytuje post, że mają wartość zdefiniować. meta_valueArgumentem jest wykorzystywana do wartości ciągów. W tym przykładzie będzie można odpytać wszystkie posty z niestandardowym polem meta o wartości „dane1”.

$args = array( 'meta_value' => 'data1' );

Możesz też połączyć te dwa elementy. Ten przykład będzie dotyczył tylko postów, które mają niestandardowe pole meta o identyfikatorze „field1”, które ma wartość „data1”.

$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1' );

meta_value_num

Argument meta_value_num jest podobny do argumentu „meta_value”. Tam, gdzie meta_valueargument jest używany dla wartości łańcuchowych, meta_value_numjest przeznaczony dla wartości liczbowych.

Ten przykład pokazuje, jak wysłać zapytanie do niestandardowego pola meta „field1”, jeśli ma ono wartość „10”.

$args = array( 'meta_key' => 'field1', 'meta_value_num' => '10', );

meta_compare

meta_compareArgumentem robi dokładnie to, co brzmi jak. Umożliwi to użycie komparatorów z argumentami „meta_value” i „meta_value_num”. Komparatory, których możesz użyć, to „=”, „! =”, „>”, „> =”, „<”, „<=”, „LIKE”, „NOT LIKE”, „IN”, „NOT IN” , „BETWEEN”, „NOT BETWEEN”, „NOT EXISTS”, „REGEXP”, „NOT REGEXP” lub „RLIKE”. Oto przykład, który pokazuje, jak wyszukiwać posty, które nie mają wartości „data1”.

$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );

Bardziej złożone zapytania

meta_query

Głównym argumentem, którego będziesz używać do złożonych zapytań, jest meta_query. Ten argument sam w sobie nic nie daje. Po prostu mówi WordPress, że chcesz wysłać zapytanie o niestandardowe pola meta. Dodasz dodatkowe argumenty, meta_queryktóre zostaną użyte do zdefiniowania zapytania.

klucz, wartość i porównanie

Argumenty key, valuedziałają dokładnie w taki sam sposób jak meta-key, meta-valuejak opisano powyżej. Złożony comparejest podobny do prostego comparepowyżej, ale wymaga innej listy komparatorów. Kompleks compareużywa znaków „=”, „! =”, „>”, „> =”, „<”, „<=”, „LIKE”, „NOT LIKE”, „IN”, „NOT IN”, „BETWEEN” „NIE MIĘDZY”, „ISTNIEJE” lub „NIE ISTNIEJE”. valuemoże być tablicą, ale tylko wtedy, gdy w porównaniu używa się „IN”, „NOT IN”, „BETWEEN” lub „NOT BETWEEN”.

Jeśli użyjesz opcji „ISTNIEJE” lub „NIE ISTNIEJE” z compare, nie musisz określać valueargumentu.

Oto przykład, który wysyła zapytanie do postów, jeśli ma „field1” z wartością „data1” i „field2” z wartością inną niż „data2”.

$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1' ), array( 'key' => 'field2', 'value' => 'data2', 'compare' => '!=', ) ) );

relacja

relationJest używany, gdy chcesz niestandardowej kwerendy danych meta przy użyciu logiczny związek. Możesz użyć ANDlub OR. Na przykład użyjesz ANDdo porównania, czy dane1 i dane2 spełniają kryteria, a użyjesz, ORjeśli dane1 lub dane2 spełniają kryteria.

Ten argument jest samodzielny. Oznacza to, że nie pojawia się w poszczególnych niestandardowych parametrach pola meta. Spójrzmy na przykład. Ten przykład będzie dotyczył tylko postów, które mają „field1” o wartości „data1” i „field2” o wartości „data2”.

$args = array( 'meta_query' => array( 'relation' => 'AND' array( 'key' => 'field1', 'value' => 'data1', ), array( 'key' => 'field2', 'value' => 'data2', ), ) );

Jeśli zmienisz relationna „LUB”. Następnie zapytałby wszystkie posty, jeśli „field1” ma wartość „data1” lub „field2” ma wartość „data2”.

rodzaj

typeArgumentem pozwala wybrać rodzaj danych do zapytania. Możesz użyć „NUMERIC”, „BINARY”, „CHAR”, „DATE”, „DATETIME”, „DECIMAL”, „SIGNED”, „TIME” lub „UNSIGNED”.

Typu „DATA” można używać z compareopcją „BETWEEN” tylko wtedy, gdy format daty to „RRRRMMDD”.

W tym przykładzie zostanie wysłana kwerenda do dowolnego posta, w którym wartość „field1” jest liczbowa.

$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1', 'type' => 'NUMERIC' ) ) );

Przykład z prawdziwego świata

Jak dotąd podałem tylko przykłady z dowolnymi danymi i polami. Teraz chciałbym pokazać prawdziwy przykład wykonywania zapytań o niestandardowe pola meta.

Scenariusz

Utworzyłeś niestandardowy typ posta o wydarzeniach. Typ posta o wydarzeniach ma niestandardowe pole daty z identyfikatorem event_date. Chcesz utworzyć zapytanie, które pokaże wszystkie zdarzenia, które będą się rozpoczynać w bieżącej dacie przez następne 30 dni.

Użyjemy meta_queryargumentu, ponieważ chcemy użyć typeargumentu do zdefiniowania pola „data_zdarzenia” jako typu danych „DATA”.

Oto zapytanie:

$args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'event_date', 'value' => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ), 'compare' => 'BETWEEN', 'type' => 'DATE' ) ) ); $event_query = new WP_Query( $args );

To valuetablica aktualnej daty - 1 dzień i 31 dni od aktualnej daty. Ponieważ używamy komparatora „BETWEEN”, odpytywane będą tylko wpisy między tablicą wartości, więc chcemy przesunąć je o jeden dzień.

Za pomocą tego zapytania wyświetlisz każde zdarzenie, które nastąpi w ciągu najbliższych 30 dni.

Wniosek

WP_QueryKlasa jest bardzo elastyczny klasa, która pozwoli stworzyć wiele niestandardowych zapytań. Jeśli chcesz dowiedzieć się więcej o różnych argumentach, których możesz użyć w zapytaniach, polecam przejrzenie strony z WP_Querykodeksem.