Best Practice für die Abfrage von Enkelkindern?

Ziel: Die Seiten der dritten Ebene “Enkel” einer Seite abfragen und durchlaufen, so dass Seitenumbrüche möglich sind.

Hier ist der Code, den ich verwende (ohne Paginierung):

// Get the ID of the first generation $gen1_ids = $post->ID; // Query for second generation IDs $gen2 = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen1_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC" ); // Test ordering by title // Implode the results for further use $gen2_ids = implode( $gen2,', ' ); // Now, query for third generation IDs using second generation IDs $gen3 = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_parent IN ($gen2_ids) AND $wpdb->posts.post_type = 'page' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.ID ASC" ); $args = array( 'post__in' => $gen3, 'post_type' => 'page', 'post_status' => 'publish', 'posts_per_page' => 5, 'paged' => get_query_var('paged') ); $results = null; $results = new WP_Query( $args ); if( $results->have_posts() ) { while ( $results->have_posts() ) : $results->the_post(); ?> 
  • <a href="https://wordpress.stackexchange.com/questions/84810/best-practice-for-querying-grandchildren/" class="img">

    <a href="https://wordpress.stackexchange.com/questions/84810/best-practice-for-querying-grandchildren/">

    ...

  • Ich habe den Code von einer Antwort auf eine Support-Frage vor zwei Jahren in den WordPress.org-Foren angepasst. Der Code funktioniert.

    Gibt es eine Möglichkeit, dass dies besser gemacht werden kann?

    Solutions Collecting From Web of "Best Practice für die Abfrage von Enkelkindern?"

    Du bist auf dem richtigen Weg. Sie können dies mit nur einer MySQL-Abfrage anstelle von zwei tun, indem Sie sich dem post_parent . Setzen Sie diese function in Ihre functions.php-Datei, und ersetzen Sie dann in Ihrer Vorlage Ihren WP_Query Aufruf mit $results = wpse_84810_get_grandchildren(); , ändere deine if-Klausel als if( $results && $results->have_posts() ) , dann if( $results && $results->have_posts() ) weiter mit dem Rest deines Template-Codes.

     function wpse_84810_get_grandchildren( $grandparent_id = false ) { global $wpdb; if ( !$grandparent_id ) $grandparent_id = get_the_ID(); $grandchildren_ids = $wpdb->get_col( $wpdb->prepare( "SELECT p1.ID FROM {$wpdb->posts} AS p1 INNER JOIN {$wpdb->posts} AS p2 ON p1.post_parent = p2.ID WHERE p2.post_parent = %d", $grandparent_id ) ); if ( $grandchildren_ids ) { return new WP_Query( array( 'post__in' => $grandchildren_ids, 'post_type' => 'page', 'post_status' => 'publish', 'posts_per_page' => 5, 'paged' => get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1 ) ); } return false; }