Wenn Sie WordPress-Themes oder -Plugins entwerfen oder entwickeln, besteht eine gute Chance, dass Sie eines Tages eine Abfrage nach benutzerdefinierten Metafeldern durchführen müssen. Dies sind die vollständig benutzerdefinierten Schlüssel / Wert-Paare, die Sie an jeden Beitrag, jede Seite oder jeden benutzerdefinierten Beitragstyp anhängen können. WordPress verfügt standardmäßig über eine grundlegende Benutzeroberfläche, oder Sie können erweiterte benutzerdefinierte Felder verwenden, um sich mit ihnen vertraut zu machen. Aber unter der Haube verwendet ACF reguläre alte benutzerdefinierte Felder.
Diese Snippet-Seite, die Sie gerade ansehen, wurde 1999 geschrieben. Zu diesem Zeitpunkt müssten Sie die globale Variable "$ wpdb" verwenden, um Beiträge mit bestimmten benutzerdefinierten Feldern abzufragen. Dies kann zum Erstellen von MySQL-Abfragen verwendet werden, die von der WordPress WP_Query () -Klasse nicht unterstützt werden. Glücklicherweise hat WordPress heute Argumente, die Abfragen für benutzerdefinierte Metafelder unterstützen.
Hier werden die verschiedenen Möglichkeiten behandelt, wie Sie Beiträge mit bestimmten benutzerdefinierten Feldern (und deren Werten) anfordern und durchlaufen können. Sie können diese Informationen verwenden, unabhängig davon, ob Sie die WP_Query
Klasse query_posts()
oder verwenden get_posts()
. Da query_posts()
und get_posts()
sind Wrapper für die WP_Query
Klasse. Sie alle akzeptieren die gleichen Argumente.
Die Abfrageargumente
Hier ist ein grundlegendes Beispiel für eine WordPress-Abfrage aus dem 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();
Das $args
ist das wichtige Stück dort. Wir werden verschiedene Argumente übergeben, damit diese Arbeit so funktioniert, wie wir es wollen.
Bei der Abfrage nach benutzerdefinierten Metas können Sie zwei „Gruppen“ von Argumenten verwenden. Eine Gruppe ist für eine einfache benutzerdefinierte Meta-Feldabfrage und die andere Gruppe für komplexere benutzerdefinierte Meta-Feld-Abfragen. Beginnen wir mit der einfachen Gruppe.
meta_key
Das meta_key
Argument fragt jeden Beitrag ab, in dem die benutzerdefinierte Feld-Meta-ID in der Datenbank gespeichert ist, unabhängig davon, ob für das Feld ein Wert gespeichert ist oder nicht. Dies meta_key
ist die ID, die Sie Ihren Metafeldern geben. So was:


In diesem Beispiel wird jeder Beitrag abgefragt, der das benutzerdefinierte Metafeld mit der ID "Feld1" enthält.
$args = array( 'meta_key' => 'field1' );
meta_value
Die meta_value
Argumentabfragen veröffentlichen den Wert, den Sie definieren. Das meta_value
Argument wird für Zeichenfolgenwerte verwendet. In diesem Beispiel werden alle Beiträge mit einem benutzerdefinierten Metafeld abgefragt, das den Wert "data1" hat.
$args = array( 'meta_value' => 'data1' );
Sie können auch beide kombinieren. In diesem Beispiel werden nur Posts abgefragt, die das benutzerdefinierte Metafeld mit der ID "Feld1" und dem Wert "Daten1" haben.
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1' );
meta_value_num
Das Argument meta_value_num ähnelt dem Argument `meta_value`. Wenn das meta_value
Argument für Zeichenfolgenwerte angegeben meta_value_num
ist, ist das für numerische Werte gedacht.
Dieses Beispiel zeigt, wie das benutzerdefinierte Metafeld "field1" abgefragt wird, wenn es den Wert "10" hat.
$args = array( 'meta_key' => 'field1', 'meta_value_num' => '10', );
meta_compare
Das meta_compare
Argument macht genau das, wonach es sich anhört. Sie können Komparatoren mit den Argumenten "meta_value" und "meta_value_num" verwenden. Die Komparatoren, die Sie verwenden können, sind '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'ZWISCHEN', 'NICHT ZWISCHEN', 'NICHT EXISTIERT', 'REGEXP', 'NICHT REGEXP' oder 'RLIKE'. Hier ist ein Beispiel, das zeigt, wie Beiträge abgefragt werden, die nicht den Wert "data1" haben.
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );
Komplexere Abfragen
meta_query
Das Hauptargument, das Sie für komplexe Abfragen verwenden, ist meta_query
. Dieses Argument allein macht nichts. Es teilt WordPress lediglich mit, dass Sie eine Abfrage für benutzerdefinierte Metafelder durchführen möchten. Sie werden zusätzliche Argumente hinzufügen meta_query
, die zum Definieren der Abfrage verwendet werden.
Schlüssel, Wert und vergleichen
Die Argumente key
, value
Arbeit genau die gleiche Art und Weise wie meta-key
, meta-value
wie oben beschrieben. Der Komplex compare
ähnelt dem compare
oben beschriebenen, benötigt jedoch eine andere Liste von Komparatoren. Der Komplex compare
verwendet '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'ZWISCHEN ',' NICHT ZWISCHEN ',' EXISTIERT 'oder' NICHT EXISTIERT '. value
kann ein Array sein, aber nur, wenn der Vergleich 'IN', 'NOT IN', 'ZWISCHEN' oder 'NICHT ZWISCHEN' verwendet.
Wenn Sie 'EXISTS' oder 'NOT EXISTS' mit verwenden compare
, müssen Sie kein value
Argument angeben .
In diesem Beispiel werden Beiträge abgefragt, wenn "Feld1" mit dem Wert "Daten1" und "Feld2" mit dem Wert "Daten2" vorhanden sind.
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1' ), array( 'key' => 'field2', 'value' => 'data2', 'compare' => '!=', ) ) );
Beziehung
Das relation
wird verwendet, wenn Sie benutzerdefinierte Metadaten mithilfe einer logischen Beziehung abfragen möchten. Sie können AND
oder verwenden OR
. Zum Beispiel werden Sie AND
vergleichen, ob Daten1 und Daten2 die Kriterien erfüllen, und Sie werden verwenden, OR
wenn Daten1 oder Daten2 die Kriterien erfüllen.
Dieses Argument ist eigenständig. Dies bedeutet, dass es nicht in einzelnen benutzerdefinierten Metafeldparametern angezeigt wird. Schauen wir uns ein Beispiel an. In diesem Beispiel werden nur Posts abgefragt, die "Feld1" mit dem Wert "Daten1" und "Feld2" mit dem Wert "Daten2" haben.
$args = array( 'meta_query' => array( 'relation' => 'AND' array( 'key' => 'field1', 'value' => 'data1', ), array( 'key' => 'field2', 'value' => 'data2', ), ) );
Wenn Sie relation
zu "ODER" geändert haben . Dann würde es alle Beiträge abfragen, wenn "Feld1" den Wert "Daten1" hat oder wenn "Feld2" den Wert "Daten2" hat.
Art
Mit diesem type
Argument können Sie den abzufragenden Datentyp auswählen. Sie können 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' oder 'UNSIGNED' verwenden.
Der Typ "DATE" kann nur dann mit compare
"ZWISCHEN" verwendet werden, wenn das Datumsformat "JJJJMMTT" lautet.
In diesem Beispiel werden alle Beiträge abgefragt, bei denen der Wert von "Feld1" numerisch ist.
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1', 'type' => 'NUMERIC' ) ) );
Beispiel aus der realen Welt
Bisher habe ich nur Beispiele mit beliebigen Daten und Feldern angegeben. Jetzt möchte ich Ihnen ein Beispiel aus der Praxis zeigen, wie Sie benutzerdefinierte Metafelder abfragen können.
Das Szenario
Sie haben einen benutzerdefinierten Beitragstyp für Ereignisse erstellt. Der Post-Typ für Ereignisse verfügt über ein benutzerdefiniertes Datumsfeld mit der ID event_date
. Sie möchten eine Abfrage erstellen, die alle Ereignisse anzeigt, die in den nächsten 30 Tagen am aktuellen Datum beginnen.
Wir werden das meta_query
Argument verwenden, da wir das Argument verwenden möchten, um das type
Feld "event_date" als Datentyp "DATE" zu definieren.
Dies ist die Abfrage:
$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 );
Dies value
ist ein Array des aktuellen Datums - 1 Tag und 31 Tage ab dem aktuellen Datum. Da wir den Komparator "ZWISCHEN" verwenden, werden nur die Beiträge zwischen dem Wertearray abgefragt, sodass wir sie um einen Tag versetzen möchten.
Mit dieser Abfrage zeigen Sie alle Ereignisse an, die in den nächsten 30 Tagen auftreten.
Fazit
Die WP_Query
Klasse ist eine sehr flexible Klasse, mit der Sie eine Vielzahl von benutzerdefinierten Abfragen erstellen können. Wenn Sie mehr über die verschiedenen Argumente erfahren möchten, die Sie für Abfragen verwenden können, empfehle ich, die WP_Query
Codex-Seite zu durchsuchen.