Schließen Sie nur die übergeordneten benutzerdefinierten post-type Posts aus

Ich bin mir nicht sicher, ob dies ohne eine Art von Hard-Coding möglich ist, aber ich habe einen benutzerdefinierten Post-Typ namens “city”. Innerhalb der Poststelle “Stadt” habe ich einige Elternposten (zB England, Amerika und China) und einige Kinderposts (London, Washington DC und Peking).

Ich habe eine Abfrage, die alle Beiträge unter “Stadt” anzeigt. Aber für diese spezielle Frage möchte ich eigentlich ALLE Elternbeiträge ignorieren (dh England, Amerika und China) und nur Kinderposts anzeigen (London, Washington und Peking).

Hier ist die Art, wie ich meine Abfrage codiere:

 'city', 'orderby' => 'name', 'order' => 'ASC', 'posts_per_page' => -1 )); ?> have_posts() ) : $city->the_post(); ?>   

Ist das möglich? Ich hätte gedacht, dass das Gegenteil der Fall ist eher eine beliebte Frage (Anzeige nur die Eltern und Ausschluss der Kinder), aber ich hoffe, dass mein Problem möglich ist!

Vielen Dank

Solutions Collecting From Web of "Schließen Sie nur die übergeordneten benutzerdefinierten post-type Posts aus"

Entsprechend dem Codex für WP_Query könnte die Lösung darin bestehen, post_parent als ID des post_parent oberster Ebene zu verwenden. Aber da es in Ihrem Fall eine Menge Top-Level-Cpts gibt, sollte diese Lösung Ihnen helfen: Wie werden nur Top-Level-Posts in einer Schleife über WP_Query angezeigt? .

Aktualisieren:

 < ?php $all = get_posts(array('post_type'=> 'city', 'posts_per_page' => -1)); $parents = array(); foreach ($all as $single) { $kids = get_children($single->ID); if(isset($kids) && !empty($kids) && count($kids) >= 1) { $parents[] = $single->ID; } } $args = array('post_type' => 'city', 'orderby' => 'name', 'order' => 'ASC', 'posts_per_page' => -1, 'post__not_in' => $parents ); $city = new WP_Query($args); while ($city->have_posts() ) : $city->the_post(); echo get_the_title()."
"; endwhile; wp_reset_postdata(); ?>

Das ist ein langer Schnitt, aber es funktioniert. Stellen Sie nur sicher, dass Sie überprüfen, ob das Array $ elterns nicht leer ist, bevor Sie es in die Abfrage aufnehmen.

Was Sie wollen, ist der posts_where Filter, mit dem Sie der SQL-Abfrage, die get_posts erzeugt, zusätzliche WHERE Klauseln get_posts . Dadurch sparen Sie die Reise in die database, um nur übergeordnete Posts abzurufen.

Die socked-function erhält zwei Argumente: die WHERE Klausel selbst und das Abfrageobjekt. Überprüfen Sie, ob die Abfrage für den Ortsposttyp gilt, und ändern Sie dann die Where-Klausel von dort.

 < ?php add_filter( 'posts_where', 'wpse29897_no_parents', 10, 2 ); function wpse29897_no_parents( $where, $query ) { if( isset( $query->query_vars['post_type'] ) && 'city' == $query->query_vars['post_type'] ) { if( '' != $where ) { $where .= ' AND post_parent != 0'; } else { $where .= ' post_parent != 0'; } } return $where; } 

Ich nehme an, dass Sie nicht wollen, dass dies bei JEDER Frage geschieht, die den Stadtpost-Typ betrifft. Sie sollten also wahrscheinlich den Aufruf von add_filter genau über dem add_filter , an dem Sie das neue WP_Query-Objekt erstellen. Dann kleben Sie die function wpse29897_no_parents in Ihrer functions.php Datei oder einem Plugin.

 < ?php add_filter( 'posts_where', 'wpse29897_no_parents', 10, 2 ); $city = new WP_Query(array('post_type' => 'city', 'orderby' => 'name', 'order' => 'ASC', 'posts_per_page' => -1 )); while ($city->have_posts() ) : $city->the_post(); ?> < ?php the_title(); ?> < ?php endwhile; ?> 

Sie können den Filter sogar nach Ihrer Schleife entfernen, um sicherzugehen.

 < ?php remove_filter( 'posts_where', 'wpse29897_no_parents', 10, 2 ); ?>