WP Abfrage Taxonomie Eingabe unterscheidet sich von der Ausgabe?

Ich versuche, eine benutzerdefinierte Abfrage zu erstellen, und ich muss die aktuelle Kategorie-ID einschließen. Ich hatte zuvor die WP_Query-Argumente als:

Array ( [post_status] => publish [posts_per_page] => -1 [post_type] => courses [cat] => 70 

Wenn ich SQL-Ergebnis hinter dieser Argumentabfrage mit $ query-> request; die Taxonomien als 95 und 203 statt 70 gelesen?

 SELECT wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) INNER JOIN wp_postmeta AS mt3 ON (wp_posts.ID = mt3.post_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (95,203) 

Kann mir jemand sagen, wie / warum das passiert und was ich tun muss, um 95.203 von diesen ersten 70 zu finden, damit ich diese Abfrage auch manuell erstellen kann?

Danke vielmals

Solutions Collecting From Web of "WP Abfrage Taxonomie Eingabe unterscheidet sich von der Ausgabe?"

Eine neugierige Reise einer ” cat

Nehmen wir an, wir haben die folgende Kategoriehierarchie:

Bildbeschreibung hier eingeben

wo die relevanten Zeilen aus der Tabelle wp_term_taxonomy sind:

wp_term_taxonomie

Wir möchten alle Beiträge in der Tierkategorie abfragen, wo die id 65 :

 $query = new WP_Query( array( 'cat' => 65 ) ); 

und versuchen zu verstehen, warum das resultierende SQL ist:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (15,70, 75) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5 

dh der Teil, warum 65 in 15, 70, 75 geändert wird.

Lasst uns beginnen:

In WP_Query() unsere Abfrage in WP_Query() umgewandelt:

 $tax_query[0] = array( 'taxonomy' => 'category', 'terms' => array( 65 ), 'field' => 'term_id', 'include_children' => 1 ); 

bevor es den Hungrigen zu essen gibt:

  WP_Tax_Query( $tax_query ) 

die die SQL-Abfrage aus dem $tax_query Array $tax_query .

Dort ist es mit den Standardwerten verschmolzen:

 array( 'taxonomy' => '', 'terms' => array(), 'include_children' => true, 'field' => 'term_id', 'operator' => 'IN', ); 

Wenn das WP_Query() Objekt die resultierende SQL-Abfrage WP_TAX_Query::get_sql() ruft es die WP_TAX_Query::get_sql() -Methode auf.

Dann wird unser Array ” gereinigt ” und ” transformiert “:

a) Es wird über die WP_TAX_Query::clean_query() -Methode bereinigt , was zu folgenden Ergebnissen führt:

 array( 'taxonomy' => 'category', 'terms' => array( 61, 13, 65 ), 'field' => 'term_id', 'include_children' => 1, 'operator' => 'IN', ); 

wo die get_term_children() Kategorien mit get_term_children() .

b) Es wird über die WP_TAX_Query::transform_query() -Methode WP_TAX_Query::transform_query() , wobei die term_id in die entsprechenden term_taxonomy_id Werte term_taxonomy_id .

In unserem Fall ist es das Ergebnis von:

  SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy = 'category' AND term_id IN (15, 61, 65) 

nämlich 15, 70 und 75 :

Bildbeschreibung hier eingeben

Dann sieht unsere Steueranfrage so aus:

 array( 'taxonomy' => 'category', 'terms' => array( 15, 70, 75 ), 'field' => 'term_taxonomy_id', 'include_children' => 1, 'operator' => 'IN', ); 

bevor es zu den SQL-Abfrageteilen von WP_Query() hinzugefügt wird:

 "join": INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) "where": AND ( tfl_term_relationships.term_taxonomy_id IN (15,70,75) ) 

Das Ende 😉


Extra:

Man kann auch direkt mit der WP_TAX_Query class spielen, um das generierte SQL zu untersuchen.

Beispielsweise:

  $tax_query = array(); $tax_query[0] = array( 'taxonomy' => 'category', 'terms' => array( 65 ), 'field' => 'term_id', 'include_children' => 1 ); $t = new WP_TAX_Query( $tax_query ); print_r( $t->get_sql( $GLOBALS['wpdb']->posts, 'ID' ) ); 

gibt folgende Ausgabe:

 Array ( [join] => INNER JOIN wp_term_relationships ON (tfl_posts.ID = wp_term_relationships.object_id) [where] => AND ( wp_term_relationships.term_taxonomy_id IN (15,70,75) ) )