Aangepaste lus / zoekopdracht op basis van aangepaste velden - CSS-trucs

Anonim
Laatst bijgewerkt door Jason Witt.

Als u WordPress-thema's of plug-ins ontwerpt of ontwikkelt, is de kans groot dat u op een dag een query moet maken voor aangepaste metavelden. Dit zijn die volledig aangepaste sleutel / waarde-paren die u aan elk bericht, elke pagina of aangepast berichttype kunt toevoegen. WordPress heeft standaard een eenvoudige gebruikersinterface voor hen, of u kunt zoiets als geavanceerde aangepaste velden gebruiken om er zin in te krijgen. Maar onder de motorkap gebruikt ACF gewone oude aangepaste velden.

Deze pagina waar je nu naar kijkt, is geschreven in 1999. Op dat moment zou je de globale variabele `$ wpdb` moeten gebruiken om te zoeken naar berichten met bepaalde aangepaste velden. Dat kan worden gebruikt voor het maken van MySQL-query's die de WordPress WP_Query () - klasse niet ondersteunt. Gelukkig heeft WordPress tegenwoordig argumenten die zoekopdrachten voor aangepaste metavelden ondersteunen.

Hier bespreken we de verschillende manieren waarop u berichten kunt opvragen en doorlopen met bepaalde aangepaste velden (en hun waarden). U kunt deze informatie gebruiken, ongeacht of u de WP_Queryklas query_posts(), of gebruikt get_posts(). Sinds query_posts()en get_posts()zijn wikkels voor de WP_Queryklas. Ze aanvaarden allemaal dezelfde argumenten.

De vraagargumenten

Hier is een eenvoudig voorbeeld van een WordPress-query uit de 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();

Het $argsis daar het belangrijkste. We zullen verschillende argumenten aanvoeren om dit te laten werken zoals we willen.

Bij het zoeken naar aangepaste meta, zijn er twee "groepen" argumenten die u kunt gebruiken. De ene groep is voor een eenvoudige aangepaste metaveldquery en de andere groep voor complexere aangepaste metaveldenquery's. Laten we beginnen met de eenvoudige groep.

meta_key

Het meta_keyargument zal elk bericht opvragen waarvan de meta-ID van het aangepaste veld is opgeslagen in de database, ongeacht of er een waarde is opgeslagen voor het veld. Het meta_keyis de ID die u aan uw metavelden geeft. Zoals dit:

In dit voorbeeld wordt elk bericht met het aangepaste metaveld opgevraagd met de ID "field1".

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

meta_value

De meta_valueargumentquery's posten met de waarde die u definieert. Het meta_valueargument wordt gebruikt voor tekenreekswaarden. Dit voorbeeld zal alle berichten opvragen met een aangepast metaveld dat de waarde "data1" heeft.

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

Je kunt de twee ook combineren. In dit voorbeeld worden alleen berichten doorzocht die het aangepaste metaveld hebben met de ID van "field1" met de waarde "data1".

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

meta_value_num

Het meta_waarde_num argument is vergelijkbaar met het 'meta_value' argument. Waar het meta_valueargument is bedoeld voor tekenreekswaarden, meta_value_numis het bedoeld voor numerieke waarden.

Dit voorbeeld laat zien hoe u het aangepaste metaveld "field1" kunt opvragen als dit de waarde "10" heeft.

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

meta_compare

Het meta_compareargument doet precies wat het klinkt. Het staat je toe om vergelijkers te gebruiken met de `meta_value` en` meta_value_num` argumenten. De vergelijkers die u kunt gebruiken zijn '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' of 'RLIKE'. Hier is een voorbeeld dat laat zien hoe je berichten kunt opvragen die niet de waarde "data1" hebben.

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

Meer complexe zoekopdrachten

meta_query

Het belangrijkste argument dat u voor complexe zoekopdrachten gebruikt, is meta_query. Dit argument op zichzelf doet niets. Het vertelt WordPress gewoon dat u een query wilt maken voor aangepaste metavelden. U voegt extra argumenten toe meta_querydie worden gebruikt om de query te definiëren.

sleutel, waarde en vergelijk

De argumenten key, valuewerk op precies dezelfde manier als meta-key, meta-valuezoals hierboven beschreven. Het complex compareis vergelijkbaar met het simpele comparehierboven, maar er is een andere lijst met vergelijkers voor nodig. Het complex comparegebruikt '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'TUSSEN ',' NIET TUSSEN ',' BESTAAT 'of' BESTAAT NIET '. valuekan een array zijn, maar alleen wanneer vergelijken wordt gebruikt met 'IN', 'NOT IN', 'BETWEEN' of 'NOT BETWEEN'.

Als u 'EXISTS' of 'NOT EXISTS' gebruikt compare, hoeft u geen valueargument op te geven .

Hier is een voorbeeld dat berichten zal opvragen als het "veld1" heeft met de waarde "data1" en "veld2" met de waarde die niet "data2" is.

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

relatie

De relationwordt gebruikt wanneer u aangepaste metagegevens wilt opvragen met behulp van een logische relatie. U kunt ANDof gebruiken OR. U gebruikt bijvoorbeeld om ANDte vergelijken of data1 en data2 aan de criteria voldoen, en u gebruikt ORals data1 of data2 aan de criteria voldoen.

Dit argument staat op zichzelf. Dit betekent dat het niet wordt weergegeven in individuele aangepaste metaveldparameters. Laten we naar een voorbeeld kijken. In dit voorbeeld worden alleen query's uitgevoerd op berichten met "field1" met de waarde "data1" en "field2" met de waarde "data2".

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

Als u bent veranderd relationin "OF". Vervolgens zou het alle berichten opvragen als "field1" de waarde "data1" heeft, of als "field2" de waarde "data2" heeft.

type

Met het typeargument kunt u het type gegevens kiezen dat u wilt opvragen. U kunt 'NUMERIC', 'BINAIR', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' of 'UNSIGNED' gebruiken.

Het type "DATUM" kan alleen worden gebruikt met compare"TUSSEN" als het datumnotatie "JJJJMMDD" is.

Dit voorbeeld zal elk bericht opvragen waar de waarde van "field1" numeriek is.

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

Voorbeeld uit de echte wereld

Tot nu toe heb ik alleen voorbeelden gegeven met willekeurige gegevens en velden. Nu wil ik u een voorbeeld uit de echte wereld laten zien van het opvragen van aangepaste metavelden.

Het scenario

Je hebt een aangepast berichttype voor evenementen gemaakt. Het posttype voor gebeurtenissen heeft een aangepast datumveld met de ID van event_date. U wilt een query maken waarin alle gebeurtenissen worden weergegeven die op de huidige datum tot de komende 30 dagen beginnen.

We gaan het meta_queryargument gebruiken omdat we het argument willen gebruiken typeom het veld "event_date" te definiëren als het gegevenstype "DATE".

Dit is de vraag:

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

Het valueis een matrix van de huidige datum - 1 dag en 31 dagen vanaf de huidige datum. Omdat we de comparator "BETWEEN" gebruiken, worden alleen de berichten tussen de waardematrix opgevraagd, dus we willen ze met één dag compenseren.

Met deze zoekopdracht geeft u alle gebeurtenissen weer die in de komende 30 dagen plaatsvinden.

Gevolgtrekking

De WP_Queryklasse is een zeer flexibele klasse waarmee u een groot aantal aangepaste query's kunt maken. Als je meer wilt weten over de verschillende argumenten die je voor queries kunt gebruiken, raad ik je aan de WP_Querycodex-pagina te doorzoeken.