Verschachtelte Metaabfrage mit mehreren Beziehungsschlüsseln

Ich bin neugierig, ob WordPress geschachtelte meta_query , mit jeweils unterschiedlichen Relation Keys? Ab WordPress 3.0 kann tax_query diese function ausführen; Ich frage mich, ob dies eine Entsprechung zu meta_query .

 $results = query_posts( array( 'post_type' => 'event_id', 'meta_query' => array( 'relation' => 'AND', array( 'relation' => 'OR', array( 'key' => 'primary_user_id', 'value' => $user_id ), array( 'key' => 'secondary_user_id', 'value' => $user_id ) ), array( 'key' => 'date', 'value' => array( $start_date, $end_date ), 'type' => 'DATETIME', 'compare' => 'BETWEEN' ) ) ) ); 

Verweise:

  • WP_Query Benutzerdefinierte Feldparameter – Mehrere benutzerdefinierte Feldbehandlung
  • Abfrage mehrere Taxonomie und zeigen Post-Anzahl
  • Wie funktioniert die Navigation in einer benutzerdefinierten Schleife innerhalb des Shortcodes?

Solutions Collecting From Web of "Verschachtelte Metaabfrage mit mehreren Beziehungsschlüsseln"

Die Frage war für WordPress 3.0, aber nur für den Fall, dass jemand die gleiche Frage für eine neuere Version von WordPress Codex hat:

“Ab Version 4.1 können Meta-Query-Klauseln geschachtelt werden, um komplexe Abfragen zu erstellen.”

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Diese Abfrage sollte also mit der aktuellen WordPress-Version funktionieren.

Das scheint unmöglich zu sein. Bitte korrigieren Sie mich, wenn ich falsch liege.

Der Parameter meta_query wird tatsächlich in ein WP_Meta_Query Objekt umgewandelt, und die relation wird in wp-includes/meta.php nicht tiefer wp-includes/meta.php und tritt nur einmal in der obersten Ebene auf:

 if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) { $this->relation = 'OR'; } else { $this->relation = 'AND'; } 

Eine mögliche Lösung hierfür ist die Erstellung eines eigenen JOIN für diese Abfrage.

 $query = new WP_Query( array( ... 'my_meta_query' => true, 'suppress_filters' => false ) ); add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 ); function my_meta_query_posts_join( $join, $query ) { if ( empty( $query->query_vars['my_meta_query'] ) ) return $join; global $wpdb; $new_join = " INNER JOIN {$wpdb->postmeta} pm1 ON 1=1 AND pm1.post_id = {$wpdb->posts}.ID AND pm1.meta_key = '_some_meta_key' AND pm1.meta_value = 'some_value' "; return $join . ' ' . $new_join; } 

Und wenn Sie weitere Überprüfungen und Regeln benötigen, können Sie auch den posts_where Filter verwenden.