Buclă personalizată / interogare bazată pe câmpuri personalizate - CSS-Tricks

Anonim
Ultima actualizare de Jason Witt.

Dacă proiectați sau dezvoltați teme sau pluginuri WordPress, există șanse mari ca într-o zi să aveți nevoie să faceți o interogare pentru meta câmpuri personalizate. Acestea sunt acele perechi cheie / valoare complet personalizate pe care le puteți atașa la orice postare, pagină sau tip de postare personalizată. WordPress are o interfață de utilizare de bază pentru ei în mod implicit sau puteți utiliza ceva de genul Advanced Custom Fields pentru a vă distra. Dar sub capotă ACF folosește câmpuri personalizate obișnuite.

Această pagină de fragment pe care o priviți acum a fost scrisă în 1999. În acel moment, pentru a căuta postări cu câmpuri particularizate, va trebui să utilizați variabila globală `$ wpdb`. Aceasta poate fi utilizată pentru crearea interogărilor MySQL pe care clasa WordPress WP_Query () nu le acceptă. Din fericire, astăzi, WordPress are argumente care acceptă interogări pentru meta câmpuri personalizate.

Aici, vom acoperi diferitele moduri în care puteți solicita și repeta postările cu anumite câmpuri personalizate (și valorile lor). Veți putea folosi aceste informații indiferent dacă utilizați WP_Queryclasa query_posts(), sau get_posts(). Deoarece query_posts()și get_posts()sunt ambalaje pentru WP_Queryclasă. Toți acceptă aceleași argumente.

Argumentele interogării

Iată un exemplu de bază al unei interogări WordPress preluate din 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();

Acesta $argseste elementul important acolo. Vom transmite diferite argumente pentru ca acest lucru să funcționeze așa cum ne dorim.

Când interogați meta personalizate, există două „grupuri” de argumente pe care le puteți folosi. Un grup este destinat unei interogări simple de câmp personalizat, iar celălalt grup de interogări mai complexe de câmpuri personalizate. Să începem cu grupul simplu.

meta_key

meta_keyArgumentul va interoga orice postare care are ID - ul de meta câmp personalizat salvat în baza de date, indiferent dacă există sau nu o valoare salvată pentru câmpul. Este meta_keyID-ul pe care îl dați meta câmpurilor dvs. Ca aceasta:

Acest exemplu va interoga orice postare care are meta câmp personalizat cu ID-ul „câmp1”.

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

meta_value

meta_valueArgumentul interogări postare care au valoarea pe care o definiți. meta_valueArgumentul este utilizat pentru valori string. Acest exemplu va interoga orice postări cu un meta câmp personalizat care are valoarea „date1”.

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

Puteți combina și cele două. Acest exemplu va interoga numai postările care au meta câmpul personalizat cu ID-ul „câmp1” care are valoarea „date1”.

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

meta_value_num

Argumentul meta_value_num este similar cu argumentul `meta_value`. În cazul în care meta_valueargumentul este menționat pentru valorile șirului, acesta meta_value_numeste destinat pentru valorile numerice.

Acest exemplu arată cum să interogați câmpul meta personalizat „câmp1” dacă are o valoare „10”.

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

meta_compare

meta_compareArgumentul face exact ceea ce pare. Vă va permite să utilizați comparatoare cu argumentele `meta_value` și„ meta_value_num`. Comparatoarele pe care le puteți utiliza sunt '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , „BETWEEN”, „NOT BETWEEN”, „NOT EXISTS”, „REGEXP”, „NOT REGEXP” sau „RLIKE”. Iată un exemplu care arată cum să interogați orice postări care nu au valoarea „date1”.

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

Interogări mai complexe

meta_interogare

Principalul argument pe care îl veți folosi pentru interogări complexe este meta_query. Acest argument pe cont propriu nu face nimic. Îi spune doar WordPress că doriți să faceți o interogare pentru câmpurile meta personalizate. Veți adăuga argumente suplimentare meta_querycare vor fi utilizate pentru a defini interogarea.

cheie, valoare și comparare

Argumentele key, valuelucru exact în același mod ca și meta-key, meta-valueașa cum este descris mai sus. Complexul compareeste similar cu cel simplu de comparemai sus, dar are o listă diferită de comparatoare. Complexul comparefolosește '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN ',' NU ÎNTRE ',' EXISTĂ 'sau' NU EXISTĂ '. valuepoate fi o matrice, dar numai atunci când comparația folosește „IN”, „NOT IN”, „BETWEEN” sau „NOT BETWEEN”.

Dacă utilizați „EXISTĂ” sau „NU EXISTĂ” cu compare, nu este necesar să specificați un valueargument.

Iată un exemplu care va interoga postările dacă are „câmpul1” cu valoarea „date1” și „câmpul2” cu valoarea care nu este „date2”.

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

relație

Este relationutilizat atunci când doriți să interogați meta date personalizate utilizând o relație logică. Puteți utiliza ANDsau OR. De exemplu, veți utiliza ANDpentru a compara dacă data1 și data2 îndeplinesc criteriile și utilizați ORdacă data1 sau data2 îndeplinesc criteriile.

Acest argument este independent. Adică nu apare în parametrii individuali ai unui câmp meta personalizat. Să vedem un exemplu. Acest exemplu va interoga numai postările care au „câmpul1” cu valoarea „date1” și „câmpul2” cu valoarea „date2”.

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

Dacă ați trecut relationla „SAU”. Apoi, ar interoga orice postări dacă „câmpul1” are valoarea „date1” sau dacă „câmpul2” are valoarea „date2”.

tip

typeArgumentul vă permite să alegeți tipul de date pentru interogare. Puteți utiliza „NUMERIC”, „BINAR”, „CHAR”, „DATE”, „DATETIME”, „DECIMAL”, „SIGNED”, „TIME” sau „UNSIGNED”.

Tipul „DATE” poate fi utilizat cu compare„BETWEEN” numai dacă formatul datei este „AAAAMZZ”.

Acest exemplu va interoga orice postare în care valoarea „câmpului1” este numerică.

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

Exemplu de lume reală

Până acum, am dat doar exemple cu date și câmpuri arbitrare. Acum, aș dori să vă arăt un exemplu real de interogare a câmpurilor meta personalizate.

Scenariul

Ați creat un tip de postare personalizată pentru evenimente. Tipul de postare a evenimentelor are un câmp personalizat de dată cu ID-ul de event_date. Doriți să creați o interogare care să afișeze orice evenimente care vor începe la data curentă în următoarele 30 de zile.

Vom folosi meta_queryargumentul așa cum dorim să îl folosim typepentru a defini câmpul „eveniment_dată” ca tip de date „DATĂ”.

Aceasta este interogarea:

$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 );

Este valueo matrice a datei curente - 1 zi și 31 de zile de la data curentă. Deoarece folosim comparatorul „ÎNTRE”, vor fi interogate numai postările dintre matricea de valori, așa că dorim să le compensăm cu o zi.

Cu această interogare, veți afișa orice eveniment care apare în următoarele 30 de zile.

Concluzie

WP_QueryClasa este o clasă foarte flexibil , care vă va permite să creați o multitudine de interogări personalizate. Dacă doriți să aflați mai multe despre diferitele argumente pe care le puteți utiliza pentru interogări, vă recomand să căutați în WP_Querypagina Codex.