Vergleichen von Arrays mit Metaabfragen in pre_get_posts

Ich arbeite an einem Formular zum Filtern einer Liste von Beiträgen mithilfe von benutzerdefinierten Feldern, die mit dem Plugin Erweiterte benutzerdefinierte Felder erstellt wurden. Wegen des Formulars verwende ich die Aktion pre_get_posts , um die Abfrage über GET-Anforderungen zu ändern. (Folgende Code-Referenzen sind entweder PHP oder von print_r() )

Ich setze die meta_query so:

 $query->set('meta_query',$filter); 

und $filter sieht so aus:

 Array ( [0] => Array ( [key] => delivery_method [value] => Array ( [0] => Online [1] => Scheduled ) [compare] => IN ) ) 

Das benutzerdefinierte Feld, das ich abfrage, ist wie folgt strukturiert:

 Array ( [delivery_method] => Array ( [0] => Online [1] => Scheduled ) ) 

Wenn ich nach Posts mit [compare] => IN (wie oben) suche, werden keine Posts zurückgegeben. Wenn ich nach Posts mit [compare] => NOT IN suche, werden alle Posts zurückgegeben.

Ich versuche nur solche Beiträge zurückzugeben, die eine bestimmte “Zustellungsmethode” haben. Gibt es eine Möglichkeit, die beiden Arrays zu vergleichen, die ich verpasst habe? oder muss ich irgendwie eines der Arrays explodieren und individuelle Werte mit einem Array vergleichen?

Solutions Collecting From Web of "Vergleichen von Arrays mit Metaabfragen in pre_get_posts"

Wenn ich richtig bin, haben Sie ein Feld, das ein Array enthält, um klar zu sein, etwas, das Sie speichern können mit:

 add_post_meta( $postid, 'delivery_method', array('Online', 'Scheduled') ); 

Dann möchten Sie Posts abfragen, bei denen das Feld ‘delivery_method’ = array( 'Online', 'Scheduled') .

Das Problem ist, dass eine Meta-Abfrage wie die Ihre:

 $meta_query = array( array( 'key' => 'delivery_method', 'value' => array( 'Online', 'Scheduled' ), 'compare' => 'IN' ) ); 

gibt Beiträge zurück, bei denen der Schlüssel ‘deliver_method’ auf ‘Online’ (string) oder ‘Geplant’ (string) oder beides gesetzt ist, aber Ihr Post hat den Schlüssel ‘deliver_method’ als Array gespeichert, so dass der Wert von WordPress serialisiert wird, bevor er gespeichert wird database, und Sie können keinen serialisierten Wert mit einem unserialisierten Array abfragen …

Wenn Sie also verschiedene Übermittlungsmethoden speichern möchten, ist es besser, wenn Sie mehrere Werte für denselben Schlüssel anstelle eines Schlüssels mit mehreren Werten verwenden, z

 add_post_meta( $postid, 'delivery_method', 'Online' ); add_post_meta( $postid, 'delivery_method', 'Scheduled' ); 

Auf diese Weise werden Sie in der Lage sein, Posts zu erhalten, die eine der Methoden haben, oder beide, abhängig von Ihren Bedürfnissen.

Ich weiß natürlich nicht, wie man dies mit ACF implementiert, und wie auch immer der Plugin-spezifische Weg für diese Seite nicht möglich ist, aber ich denke, dass das Konzept einfach ist und Sie einfach auf dieses Plugin anwenden können.

Ein schmutziger Hack für den speziellen Fall ist eine Abfrage, die den serialisierten Wert als Wert verwendet

 $meta_query = array( array( 'key' => 'delivery_method', 'value' => serialize ( array( 'Online', 'Scheduled' ) ) ) ); 

Diese Meta-Abfrage gibt die Posts zurück, die beide Methoden als Array gespeichert haben.

Die ACF-Dokumentation empfiehlt, die Werte einzeln und nicht gleichzeitig mit einem Array zu überprüfen.

Der folgende Code stammt aus der ACF-Dokumentation für den Feldtyp “Checkbox”:

http://www.advancedcustomfields.com/resources/field-types/checkbox/

 /* * Query posts for a checkbox value. * This method uses the meta_query LIKE to match the string "red" to the database value a:2:{i:0;s:3:"red";i:1;s:4:"blue";} (serialized array) * The above value suggests that the user selected "red" and "blue" from the checkbox choices */ $posts = get_posts(array( 'meta_query' => array( array( 'key' => 'field_name', // name of custom field 'value' => '"red"', // matches exaclty "red", not just red. This prevents a match for "acquired" 'compare' => 'LIKE' ) ) )); 

Daher sollte die Abfrage in pre_get_posts wie pre_get_posts aussehen:

 $filter = array( array( 'key' => 'delivery_method' 'value' => '"Online"' 'compare' => 'LIKE' ), array( 'key' => 'delivery_method' 'value' => '"Scheduled"' 'compare' => 'LIKE' ) ) $query->set('meta_query',$filter);