Tilpasset loop / forespørgsel baseret på brugerdefinerede felter - CSS-tricks

Anonim
Sidst opdateret af Jason Witt.

Hvis du designer eller udvikler WordPress-temaer eller plugins, er der en god chance for, at du en dag bliver nødt til at lave en forespørgsel om tilpassede metafelter. Dette er de helt tilpassede nøgle / værdipar, som du kan vedhæfte til ethvert indlæg, side eller tilpasset indlægstype. WordPress har en grundlæggende brugergrænseflade til dem som standard, eller du kan bruge noget som Advanced Custom Fields for at få lyst til dem. Men under emhætten bruger ACF regelmæssige ol 'brugerdefinerede felter.

Denne meget uddragsside, du ser på lige nu, blev skrevet i 1999. På det tidspunkt skulle du bruge den globale variabel '$ wpdb' for at kunne søge efter indlæg med bestemte brugerdefinerede felter. Det kan bruges til at oprette MySQL-forespørgsler, som WordPress WP_Query () -klassen ikke understøtter. Heldigvis i dag har WordPress argumenter, der understøtter forespørgsler om tilpassede metafelter.

Her dækker vi de forskellige måder, du kan anmode om og løbe indlæg med bestemte brugerdefinerede felter (og deres værdier). Du kan bruge disse oplysninger, uanset om du bruger WP_Queryklassen query_posts(), eller get_posts(). Siden query_posts()og get_posts()er indpakninger til WP_Queryklassen. De accepterer alle de samme argumenter.

Forespørgselsargumenterne

Her er et grundlæggende eksempel på en WordPress-forespørgsel taget fra 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();

Det $argser den vigtige bit der. Vi sender forskellige argumenter for at få dette til at fungere, som vi vil.

Når du spørger efter tilpasset meta, er der to "grupper" af argumenter, som du kan bruge. Den ene gruppe er for en simpel brugerdefineret metafeltforespørgsel og den anden gruppe for mere komplekse forespørgsler om brugerdefinerede metafelt. Lad os starte med den enkle gruppe.

meta_key

Det meta_keyargument vil forespørge nogen indlæg, der har det brugerdefinerede felt meta-id gemt i databasen, om der er en værdi gemt for feltet. Det meta_keyer det id, du giver til dine metafelter. Sådan her:

Dette eksempel spørger ethvert indlæg, der har det brugerdefinerede metafelt med id'et "felt1".

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

metaværdi

Det meta_valueargument forespørgsler indlæg, der har den værdi, du definerer. Den meta_valueargument bruges til strengværdier. Dette eksempel vil forespørge på alle indlæg med et brugerdefineret metafelt, der har værdien "data1".

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

Du kan også kombinere de to. Dette eksempel spørger kun indlæg, der har det brugerdefinerede metafelt med id'et "felt1", der har værdien "data1".

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

meta_værdi_nummer

Argumentet meta_value_num svarer til argumentet `meta_value`. Hvor meta_valueargumentet er ment for strengværdier, meta_value_numer det beregnet til numeriske værdier.

Dette eksempel viser, hvordan man forespørger "felt1" tilpasset metafelt, hvis det har en værdi på "10".

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

meta_compare

Det meta_compareargument gør præcis hvad det lyder som. Det giver dig mulighed for at bruge komparatorer med argumenterne 'meta_value' og 'meta_value_num'. De komparatorer, du kan bruge, er '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'MELLEM', 'IKKE MELLEM', 'IKKE FINDES', 'REGEXP', 'IKKE REGEXP' eller 'RLIKE'. Her er et eksempel, der viser, hvordan man forespørger på indlæg, der ikke har værdien "data1".

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

Mere komplekse forespørgsler

meta_query

Hovedargumentet, du bruger til komplekse forespørgsler, er meta_query. Dette argument alene gør ikke noget. Det fortæller bare WordPress, at du vil lave en forespørgsel til brugerdefinerede metafelter. Du tilføjer yderligere argumenter inden for meta_query, som bruges til at definere forespørgslen.

nøgle, værdi og sammenlign

Den argumenter key, valuearbejde nøjagtig samme måde som meta-key, meta-valuesom beskrevet ovenfor. Komplekset compareligner det enkle compareovenfor, men det kræver en anden liste over komparatorer. Komplekset comparebruger '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'MELLEM ',' IKKE MELLEM ',' EXISTER 'eller' NOT EXISTS '. valuekan være en matrix, men kun når sammenligning bruger 'IN', 'NOT IN', 'MELLEM' eller 'IKKE MELLEM'.

Hvis du bruger 'EXISTS' eller 'NOT EXISTS' med compare, behøver du ikke angive et valueargument.

Her er et eksempel, der spørger indlæg, hvis det har "felt1" med værdien "data1" og "felt2" med den værdi, der ikke er "data2".

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

forhold

Den relationbruges, når du vil forespørge tilpassede metadata ved hjælp af et logisk forhold. Du kan bruge ANDeller OR. For eksempel bruger du ANDtil at sammenligne, om data1 og data2 opfylder kriterierne, og du bruger, ORhvis data1 eller data2 opfylder kriterierne.

Dette argument er enkeltstående. Det betyder, at det ikke vises i et individuelt tilpasset metafeltparameter. Lad os se på et eksempel. Dette eksempel spørger kun indlæg, der har "felt1" med værdien "data1" og "felt2" med værdien "data2".

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

Hvis du skiftede relationtil “ELLER”. Derefter vil det spørge om alle indlæg, hvis "felt1" har værdien "data1", eller hvis "felt2" har værdien "data2".

type

Det typeargument giver dig mulighed for at vælge den type data til forespørgslen. Du kan bruge 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' eller 'UNSIGNED'.

“DATE” -typen kan kun bruges med compare“MELLEM”, hvis datoformatet er “ÅÅÅÅMMDD”.

Dette eksempel spørger ethvert indlæg, hvor værdien af ​​"felt1" er numerisk.

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

Virkelig verdenseksempel

Indtil videre har jeg kun givet eksempler med vilkårlige data og felter. Nu vil jeg gerne vise dig et virkeligt verdenseksempel på forespørgsel om tilpassede metafelter.

Scenariet

Du har oprettet en brugerdefineret posttype. Begivenhedens posttype har et tilpasset datofelt med id'et på event_date. Du vil oprette en forespørgsel, der viser alle begivenheder, der starter på den aktuelle dato de næste 30 dage.

Vi skal bruge meta_queryargumentet, som vi vil bruge typeargumentet til at definere feltet "event_date" som "DATE" datatype.

Dette er forespørgslen:

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

Det valueer en matrix med den aktuelle dato - 1 dag og 31 dage fra den aktuelle dato. Da vi bruger komparatoren “MELLEM”, bliver kun stillingerne mellem værdi-arrayet spurgt, så vi vil udligne dem med en dag.

Med denne forespørgsel viser du enhver begivenhed, der finder sted i de næste 30 dage.

Konklusion

Den WP_Queryklasse er en meget fleksibel klasse, der vil tillade dig at oprette et væld af brugerdefinerede forespørgsler. Hvis du vil lære mere om de forskellige argumenter, du kan bruge til forespørgsler, anbefaler jeg at kigge igennem WP_Querycodex-siden.