SQL-statement, die von WP_Query generiert wurde, führt nicht zu erwarteten Ergebnissen

Ich versuche, WP_Query auf dem pre_get_posts Hook WP_Query zu ändern, um die zurückgegebenen Posts zu filtern, abhängig von der eingebauten category und post_tag Taxonomien.

Ich möchte, dass die einzigen Posts, die von der Abfrage zurückgegeben werden, entweder beide Taxonomien überhaupt nicht registriert haben, oder für beide Taxonomien für den Post kein Begriff festgelegt ist, oder im letzten Fall haben beide Taxonomien einen bestimmten Wert.

Auf der Codex WP_Query Seite wird angegeben, dass für diese Art von Zweck “Nested Taxonomies” verwendet werden sollte ( siehe hier ).

Obwohl es in meinem speziellen Fall nicht funktioniert – hier ist mein Code:

 // In a function hooked on 'pre_get_posts' action $query->set('post_type', array('post','wpgdacces_acces', 'page')); $query_tax_param = array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'private' ), 'operator' => 'IN'), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => array('private'), 'operator' => 'IN') ), array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'operator' => 'NOT EXISTS' ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'operator' => 'NOT EXISTS' ) ) ); 

Davor habe ich den benutzerdefinierten Posttyp ‘wpgdacces_acces’ registriert und außerdem sowohl die category für integrierte Taxonomien als auch post_tag für den post_tag registriert.

Ich teste die Abfrage in einer lokalen Umgebung in einer WP 4.3-Installation mit dem Standardthema. In diesem Setup habe ich 3 Standard-Posts, von denen nur einer den ‘privaten’ Begriff für Kategorie und Tags hat. Die 2 verbleibenden Beiträge haben als Kategoriebegriff “Nicht klassifiziert”. Ich habe auch 3 Seiten, für die kein Begriff für beide Taxonomien festgelegt ist. Und in meiner benutzerdefinierten Beitragstyp ‘wpgdacces_acces’, für die beide Taxonomien überhaupt nicht registriert wurden, habe ich 2 Beiträge.

Auf der Startseite wird die Abfrage so geändert, dass die 3 Post-Typen post , page und ‘wpgdacces_acces’ angezeigt werden (die erste Codezeile im Block hier oben). Und deshalb sollte ich 1 Post + 3 Seiten + 2 wpgdacces_acces Beiträge sehen. Das einzige Element, das angezeigt wird, ist der Standardpost, bei dem Kategorie und Tags auf “privat” gesetzt sind.

Wirklich seltsam: wenn ich die Abfrage mit den beiden Bedingungen separat modifiziere und ausführe (die Abfrage ändern, um nur Beiträge mit nicht eingestellten Taxonomien zu erhalten, und die Abfrage zum Abrufen von Posts mit Taxonomien auf privat setzen, auf der anderen Seite) es funktioniert perfekt.

Das lässt mich denken, dass die SQL-statement, die von WP_Query nach pre_get_posts erzeugt wird, WP_Query pre_get_posts könnte. Hier ist es, gedruckt mit echo $GLOBALS['wp_query']->request; auf dem ‘wp_footer’-Haken:

 SELECT SQL_CALC_FOUND_ROWS wptom_posts.ID FROM wptom_posts INNER JOIN wptom_term_relationships ON (wptom_posts.ID = wptom_term_relationships.object_id) INNER JOIN wptom_term_relationships AS tt1 ON (wptom_posts.ID = tt1.object_id) WHERE 1=1 AND ( ( wptom_term_relationships.term_taxonomy_id IN (7) AND tt1.term_taxonomy_id IN (8) ) OR ( NOT EXISTS ( SELECT 1 FROM wptom_term_relationships INNER JOIN wptom_term_taxonomy ON wptom_term_taxonomy.term_taxonomy_id = wptom_term_relationships.term_taxonomy_id WHERE wptom_term_taxonomy.taxonomy = 'category' AND wptom_term_relationships.object_id = wptom_posts.ID ) AND NOT EXISTS ( SELECT 1 FROM wptom_term_relationships INNER JOIN wptom_term_taxonomy ON wptom_term_taxonomy.term_taxonomy_id = wptom_term_relationships.term_taxonomy_id WHERE wptom_term_taxonomy.taxonomy = 'post_tag' AND wptom_term_relationships.object_id = wptom_posts.ID ) ) ) AND wptom_posts.post_type IN ('post', 'wpgdacces_acces', 'page') AND (wptom_posts.post_status = 'publish' OR wptom_posts.post_author = 1 AND wptom_posts.post_status = 'private') GROUP BY wptom_posts.ID ORDER BY wptom_posts.post_date DESC LIMIT 0, 10 

Ist in der obigen SQL-statement etwas falsch? Ich möchte herausfinden, was in dieser SQL-statement falsch ist. Wenn ich weiß, was falsch ist, kann ich vielleicht einen der WP_Query Filter verwenden, um die Abfrage nach pre_get_posts zu ändern, aber bevor sie tatsächlich ausgeführt wird.

Solutions Collecting From Web of "SQL-statement, die von WP_Query generiert wurde, führt nicht zu erwarteten Ergebnissen"

Es sieht so aus:

 AND (wptom_posts.post_status = 'publish' OR wptom_posts.post_author = 1 AND wptom_posts.post_status = 'private') 

ist überhaupt nicht an die beiden unterschiedlichen Abfragebedingungen gebunden …

Vielleicht sollte der ursprüngliche Code drei Bedingungen für Teil 1 sein:

 array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'operator' => 'IN'), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'operator' => 'IN'), array( 'terms' => array('private') ) ), 

Ich vermute ein bisschen hier, ohne es zu testen, aber das würde ich versuchen.