Benutzerdefinierte Schleife/Abfrage basierend auf benutzerdefinierten Feldern

Avatar of Chris Coyier
Chris Coyier am
Zuletzt aktualisiert von Jason Witt.

Wenn Sie WordPress-Themes oder Plugins entwerfen oder entwickeln, ist die Wahrscheinlichkeit groß, dass Sie irgendwann eine Abfrage für benutzerdefinierte Metadatenfelder erstellen müssen. Dies sind jene völlig 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 einfache Benutzeroberfläche dafür, oder Sie können etwas wie Advanced Custom Fields verwenden, um damit raffinierte Dinge zu tun. Aber im Grunde verwendet ACF normale benutzerdefinierte Felder.

Diese spezielle Schnipsel-Seite, die Sie gerade betrachten, wurde 1999 geschrieben. Damals müssten Sie die globale Variable `$wpdb` verwenden, um nach Beiträgen mit bestimmten benutzerdefinierten Feldern abzufragen. Diese kann zur Erstellung von MySQL-Abfragen verwendet werden, die die Klasse WP_Query() von WordPress nicht unterstützt. Glücklicherweise bietet WordPress heute Argumente, die Abfragen für benutzerdefinierte Metadatenfelder unterstützen.

Hier behandeln wir die verschiedenen Möglichkeiten, wie Sie Beiträge mit bestimmten benutzerdefinierten Feldern (und ihren Werten) anfordern und durchlaufen können. Sie können diese Informationen nutzen, unabhängig davon, ob Sie die Klasse WP_Query, query_posts() oder get_posts() verwenden. Da query_posts() und get_posts() Wrapper für die Klasse WP_Query sind, akzeptieren sie alle dieselben Argumente.

Die Abfrageargumente

Hier ist ein grundlegendes Beispiel für eine WordPress-Abfrage aus dem WordPress Codex.

<?php
// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
  echo '<ul>';
  while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '<li>' . get_the_title() . '</li>';
  }
  echo '</ul>';
} else {
  // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

Das Wichtigste daran sind die $args. Wir werden verschiedene Argumente übergeben, um dies wie gewünscht funktionieren zu lassen.

Bei der Abfrage von benutzerdefinierten Metadaten gibt es zwei „Gruppen“ von Argumenten, die Sie verwenden können. Eine Gruppe ist für eine einfache Abfrage benutzerdefinierter Metadatenfelder und die andere Gruppe für komplexere Abfragen benutzerdefinierter Metadatenfelder. Beginnen wir mit der einfachen Gruppe.

meta_key

Das Argument meta_key fragt jeden Beitrag ab, der die benutzerdefinierte Feld-Metadaten-ID in der Datenbank gespeichert hat, unabhängig davon, ob ein Wert für das Feld gespeichert ist oder nicht. Der meta_key ist die ID, die Sie Ihren Metadatenfeldern geben. Wie hier:

Dieses Beispiel fragt jeden Beitrag ab, der das benutzerdefinierte Metadatenfeld mit der ID „field1“ hat.

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

meta_value

Das Argument meta_value fragt Beiträge ab, die den von Ihnen definierten Wert haben. Das Argument meta_value wird für *Zeichenfolgenwerte* verwendet. Dieses Beispiel fragt alle Beiträge mit einem benutzerdefinierten Metadatenfeld ab, das den Wert „data1“ hat.

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

Sie können die beiden auch kombinieren. Dieses Beispiel fragt nur Beiträge ab, die das benutzerdefinierte Metadatenfeld mit der ID „field1“ haben, das den Wert „data1“ hat.

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

meta_value_num

Das Argument meta_value_num ist dem Argument `meta_value` ähnlich. Während das Argument meta_value für Zeichenfolgenwerte gedacht ist, ist meta_value_num für *numerische Werte* gedacht.

Dieses Beispiel zeigt, wie das benutzerdefinierte Metadatenfeld „field1“ abgefragt wird, wenn es den Wert „10“ hat.

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

meta_compare

Das Argument meta_compare tut genau das, was sein Name vermuten lässt. Es ermöglicht Ihnen, Vergleichsoperatoren mit den Argumenten `meta_value` und `meta_value_num` zu verwenden. Die Vergleichsoperatoren, die Sie verwenden können, sind: „=“, „!=“, „>“, „>=“, „<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT 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 werden, ist meta_query. Dieses Argument allein tut nichts. Es teilt WordPress lediglich mit, dass Sie eine Abfrage für benutzerdefinierte Metadatenfelder erstellen möchten. Sie fügen zusätzliche Argumente innerhalb von meta_query hinzu, die zur Definition der Abfrage verwendet werden.

Schlüssel, Wert und Vergleich

Die Argumente key und value funktionieren genauso wie meta-key und meta-value, wie oben beschrieben. Der komplexe compare ähnelt dem einfachen compare oben, aber er akzeptiert eine andere Liste von Vergleichsoperatoren. Der komplexe compare verwendet „=“, „!=“, „>“, „>=“, „<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' oder 'NOT EXISTS'. value kann ein Array sein, aber nur, wenn compare 'IN', 'NOT IN', 'BETWEEN' oder 'NOT BETWEEN' verwendet.

Wenn Sie 'EXISTS' oder 'NOT EXISTS' mit compare verwenden, müssen Sie kein value-Argument angeben.

Hier ist ein Beispiel, das Beiträge abfragt, wenn sie "field1" mit dem Wert "data1" und "field2" mit einem Wert, der nicht "data2" ist, haben.

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

);

relation

Die relation wird verwendet, wenn Sie benutzerdefinierte Metadaten mit einer logischen Beziehung abfragen möchten. Sie können AND oder OR verwenden. Zum Beispiel verwenden Sie AND, um zu vergleichen, ob data1 und data2 die Kriterien erfüllen, und Sie verwenden OR, wenn data1 oder data2 die Kriterien erfüllen.

Dieses Argument ist eigenständig. Das bedeutet, es erscheint nicht in einzelnen benutzerdefinierten Feldparametern. Schauen wir uns ein Beispiel an. Dieses Beispiel fragt nur Beiträge ab, die "field1" mit dem Wert "data1" und "field2" mit dem Wert "data2" haben.

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

Wenn Sie relation auf „OR“ ändern, werden alle Beiträge abgefragt, wenn „field1“ den Wert „data1“ hat oder wenn „field2“ den Wert „data2“ hat.

type

Das Argument type ermöglicht es Ihnen, den Datentyp für die Abfrage auszuwählen. Sie können „NUMERIC“, „BINARY“, „CHAR“, „DATE“, „DATETIME“, „DECIMAL“, „SIGNED“, „TIME“ oder „UNSIGNED“ verwenden.

Der Typ „DATE“ kann mit dem Vergleichsoperator „BETWEEN“ nur verwendet werden, wenn das Datumsformat „YYYYMMDD“ ist.

Dieses Beispiel fragt jeden Beitrag ab, bei dem der Wert von „field1“ numerisch ist.

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

Beispiel aus der Praxis

Bisher habe ich nur Beispiele mit beliebigen Daten und Feldern gegeben. Jetzt möchte ich Ihnen ein Beispiel aus der Praxis für die Abfrage benutzerdefinierter Metadatenfelder zeigen.

Das Szenario

Sie haben einen benutzerdefinierten Beitragstyp für Veranstaltungen erstellt. Der Beitragstyp Veranstaltungen hat ein benutzerdefiniertes Datumsfeld mit der ID event_date. Sie möchten eine Abfrage erstellen, die alle Veranstaltungen anzeigt, die vom aktuellen Datum bis zu den nächsten 30 Tagen stattfinden.

Wir werden das Argument meta_query verwenden, da wir das Argument type verwenden möchten, um das 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 );

Der value ist ein Array aus dem aktuellen Datum – 1 Tag und 31 Tage ab dem aktuellen Datum. Da wir den Vergleichsoperator „BETWEEN“ verwenden, werden nur die Beiträge zwischen dem Array abgefragt, daher möchten wir sie um einen Tag verschieben.

Mit dieser Abfrage werden alle Veranstaltungen angezeigt, die in den nächsten 30 Tagen stattfinden.

Fazit

Die Klasse WP_Query ist eine sehr flexible Klasse, mit der Sie eine Vielzahl benutzerdefinierter Abfragen erstellen können. Wenn Sie mehr über die verschiedenen Argumente erfahren möchten, die Sie für Abfragen verwenden können, empfehle ich Ihnen, die WP_Query Codex-Seite durchzulesen.