Anpassad loop / fråga baserad på anpassade fält - CSS-tricks

Anonim
Senast uppdaterad av Jason Witt.

Om du utformar eller utvecklar WordPress-teman eller plugins finns det en god chans att du någon gång måste göra en fråga för anpassade metafält. Det här är de helt anpassade nyckel- / värdepar som du kan bifoga till valfritt inlägg, sida eller anpassad inläggstyp. WordPress har ett grundläggande användargränssnitt för dem som standard, eller så kan du använda något som Advanced Custom Fields för att bli snäll med dem. Men under huven använder ACF vanliga ol-anpassade fält.

Den här mycket utdragssidan du tittar på just nu skrevs 1999. Vid den tiden måste du använda den globala variabeln `$ wpdb` för att kunna fråga efter inlägg med specifika anpassade fält. Det kan användas för att skapa MySQL-frågor som WordPress WP_Query () -klassen inte stöder. Lyckligtvis idag har WordPress argument som stöder frågor för anpassade metafält.

Här kommer vi att täcka de olika sätten du kan begära och loopa inlägg med specifika anpassade fält (och deras värden). Du kommer att kunna använda denna information oavsett om du använder WP_Queryklassen query_posts(), eller get_posts(). Sedan query_posts()och get_posts()är omslag för WP_Queryklassen. De accepterar alla samma argument.

Frågan argument

Här är ett grundläggande exempel på en WordPress-fråga från 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 $argsär den viktiga biten där. Vi kommer att skicka olika argument för att få det att fungera som vi vill.

När du frågar efter anpassade meta finns det två ”grupper” av argument som du kan använda. En grupp är för en enkel anpassad metafältfråga och den andra gruppen för mer komplexa anpassade metafältfrågor. Låt oss börja med den enkla gruppen.

meta_key

Det meta_keyargumentet kommer att fråga någon post som har anpassat fält meta ID sparas i databasen, oavsett om det finns ett värde sparas för fältet. Det meta_keyär det ID som du ger till dina metafält. Så här:

Detta exempel kommer att fråga alla inlägg som har det anpassade metafältet med ID: t "field1".

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

metavärde

Det meta_valueargument frågar inlägg som har det värde som du definierar. Det meta_valueargumentet används för strängvärden. Detta exempel kommer att fråga alla inlägg med ett anpassat metafält som har värdet "data1".

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

Du kan också kombinera de två. Det här exemplet kommer bara att fråga efter inlägg som har det anpassade metafältet med ID: t "field1" som har värdet "data1".

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

meta_value_num

Argumentet meta_value_num liknar argumentet `meta_value`. Om meta_valueargumentet är ment för strängvärden meta_value_numär det avsett för numeriska värden.

Det här exemplet visar hur man frågar efter "field1" anpassat metafält om det har värdet "10".

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

meta_compare

Det meta_compareargument gör precis vad det låter som. Det gör att du kan använda komparatorer med argumenten 'meta_value' och 'meta_value_num'. Jämförelserna du kan använda är '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'MELLAN', 'INTE MELLAN', 'INTE EXISTERER', 'REGEXP', 'INTE REGEXP' eller 'RLIKE'. Här är ett exempel som visar hur du frågar inlägg som inte har värdet "data1".

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

Mer komplexa frågor

meta_query

Huvudargumentet du kommer att använda för komplexa frågor är meta_query. Detta argument på egen hand gör ingenting. Det säger bara till WordPress att du vill göra en fråga för anpassade metafält. Du lägger till ytterligare argument inom meta_querysom kommer att användas för att definiera frågan.

nyckel, värde och jämför

Det argument key, valuearbete precis på samma sätt som meta-key, meta-valueenligt beskrivningen ovan. Komplexet compareliknar det enkla compareovan, men det krävs en annan lista över jämförare. Komplexet compareanvänder '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'MELLAN ',' INTE MELLAN ',' EXISTER 'eller' INTE EXISTER '. valuekan vara en matris, men bara när jämförelse använder 'IN', 'NOT IN', 'MELLAN' eller 'INTE MELLAN'.

Om du använder 'EXISTS' eller 'NOT EXISTS' med comparebehöver du inte ange ett valueargument.

Här är ett exempel som frågar inlägg om det har "field1" med värdet "data1" och "field2" med det värde som inte är "data2".

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

relation

Den relationanvänds när du vill fråga anpassade metadata med hjälp av en logisk relation. Du kan använda ANDeller OR. Du använder ANDtill exempel för att jämföra om data1 och data2 uppfyller kriterierna och du använder ORom data1 eller data2 uppfyller kriterierna.

Detta argument är fristående. Det betyder att det inte visas i enskilda anpassade metafältparametrar. Låt oss titta på ett exempel. Det här exemplet kommer bara att fråga inlägg som har "field1" med värdet "data1" och "field2" med värdet "data2".

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

Om du ändrade relationtill “ELLER”. Då skulle det fråga alla inlägg om “field1” har värdet “data1”, eller om “field2” har värdet “data2”.

typ

Det typeargumentet kan du välja vilken typ av data till fråga. Du kan använda 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' eller 'UNSIGNED'.

“DATE” -typen kan endast användas med compare“MELLAN” om datumformatet är “ÅÅÅÅMMDD”.

Detta exempel kommer att fråga alla inlägg där värdet för "field1" är numeriskt.

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

Verklig världsexempel

Hittills har jag bara gett exempel med godtyckliga data och fält. Nu vill jag visa dig ett verkligt exempel på hur du frågar efter anpassade metafält.

Scenariot

Du har skapat en anpassad posttyp för händelser. Händelsens inläggstyp har ett anpassat datumfält med ID: t event_date. Du vill skapa en fråga som visar alla händelser som börjar på det aktuella datumet under de kommande 30 dagarna.

Vi kommer att använda meta_queryargumentet som vi vill använda typeargumentet för att definiera fältet ”event_date” som ”DATE” -datatyp.

Det här är frågan:

$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 valueär en matris med det aktuella datumet - 1 dag och 31 dagar från det aktuella datumet. Eftersom vi använder komparatorn "MELLAN" kommer endast inläggen mellan värden att fråga, så vi vill kompensera dem med en dag.

Med den här frågan visar du alla händelser som inträffar under de närmaste 30 dagarna.

Slutsats

Den WP_Queryklassen är en mycket flexibel klass som gör att du kan skapa en mängd egna frågor. Om du vill lära dig mer om de olika argumenten du kan använda för frågor rekommenderar jag att du tittar igenom WP_Querycodex-sidan.