Erhalten Sie nur die Enkel, nicht die direkten Kinder der Seite / aktuelle Seite?

Ich weiß Javascript jetzt ziemlich gut, aber ich bin neu in PHP und WordPress Theme Building. Ich habe ein gutes Stück gesucht und finde keine Lösung für etwas, das wie eine ziemlich einfache Aufgabe aussieht. Alles, was ich erreichen möchte, ist, nur die Enkel einer Seite zu bekommen, nicht die direkten Kinder, so:

Portfolio

  • Kind 1
    • Enkel 1A
    • Enkel 1B
  • Kind 2
    • Enkel 2A
    • Enkel 2B

Meine Seite ist “Portfolio” und ich möchte “get_pages”, aber nur die, die Enkel von “Portfolio” sind, also würde es in diesem Fall nur zurückgeben: – “Enkel 1A”, “Enkel 1B”, “Enkel 2A”, “Enkel 2B”.

irgendwelche Vorschläge?

Solutions Collecting From Web of "Erhalten Sie nur die Enkel, nicht die direkten Kinder der Seite / aktuelle Seite?"

Es gibt keine einheimische Art, dieses AFAIK zu machen. Der einfachste Weg wird sein:

  • einfach alle Seiten in der Hierarchie der übergebenen Seiten-ID abfragen

  • Geben Sie dann alle übergeordneten IDs ( $ post_parent-Eigenschaft des Postobjekts ) von allen Seiten in einem Array zurück

  • Durchlaufen Sie die Seiten und vergleichen Sie die Seiten-ID mit den IDs im Array der übergeordneten ID

  • Jede Seite, die ihre ID im Array der Eltern-ID hat, wird einfach übersprungen und ausgeschlossen

  • Jede Seite, deren ID nicht im Eltern-ID-Array enthalten ist, verwenden wir, um ein neues Array zu erstellen. Diese Seiten sind die Seiten der untersten Ebene

Am einfachsten ist es, eine eigene benutzerdefinierte function zu erstellen, die wir in jeder Seitenvorlage aufrufen können. Hier ist die function:

function get_lowest_level_pages( $page_id = '' ) { // Check if we have a page id, if not, return false if ( !$page_id ) return false; // Validate the page id $page_id = filter_var( $page_id, FILTER_VALIDATE_INT ); // Check if this is a page, if not, return false if ( !is_page() ) return false; // Get all pages in hierarchy of the current page $args = [ 'child_of' => $page_id, ]; $q = get_pages( $args ); // Check if there are pages, if not, return false if ( !$q ) return false; // Use wp_list_pluck to get all the post parents from all return pages $parents = wp_list_pluck( $q, 'post_parent' ); // Set the $new__page_array variable that will hold grandchildren/lowest level pages $new__page_array = []; // Loop through all the pages foreach ( $q as $page_object ) { // Simply skip any page if it has child page if ( in_array( $page_object->ID, $parents ) ) continue; // Create a new array holding only grandchild pages $new__page_array[] = $page_object; } return $new__page_array; } 

Sie können es dann wie folgt verwenden: ( Denken Sie daran, die ID der übergeordneten Seite zu übergeben, von der Sie die Enkelkinder erhalten möchten )

 $page_id = get_queried_object_id(); // Returns the current page ID $q = get_lowest_level_pages( $page_id ); if ( $q ) { foreach ( $q as $post ) { setup_postdata( $post ); the_title(); } wp_reset_postdata(); } 

Verwenden Sie get_page_children

 $all_wp_pages = get_all_page_ids(); // Get the page as an Object $portfolio = get_page_by_title('Portfolio'); // Filter through all pages and find Portfolio's children $portfolio_children = get_page_children($portfolio->ID, $all_wp_pages); foreach ($portfolio_children as $child) { $post_data = array('child_of' => $child->ID); $grandchild = get_pages($post_data); } // echo what we get back from WP to the browser echo '
' . print_r($grandchild, true) . '

';

Dies, damit Sie eine Idee bekommen können, haben diesen Code nicht getestet, aber vielleicht sollten Sie es versuchen.

 < ?php $args = array( 'post_parent' => 0, //post parent id 'post_type' => 'any', 'numberposts' => -1, 'post_status' => 'any' ); $childen = get_children( $args, OBJECT ); foreach($children as $child){ $args = array( 'post_parent' => $child->ID, 'post_type' => 'any', 'numberposts' => -1, 'post_status' => 'any' ); $grand_children[] = get_children($args, OBJECT); } 

vielleicht kannst du es so versuchen.