it-swarm.com.de

Erhalten Sie nur die Enkelkinder, nicht die direkten Kinder der Seite/aktuellen Seite?

Ich kenne Javascript ziemlich gut, aber ich bin neu in PHP und WordPress Theme Building. Ich habe ein gutes Stück gesucht und kann keine Lösung für etwas finden, das mir ziemlich einfach vorkommt. Alles, was ich erreichen möchte, ist, alle Enkelkinder einer Seite zu bekommen, nicht die direkten Kinder, wie zum Beispiel:

Portfolio

  • kind 1
    • enkel 1A
    • enkelkind 1B
  • kind 2
    • enkel 2A
    • enkelkind 2B

Meine Seite ist "Portfolio" und ich möchte "get_pages", aber nur diejenigen, die Enkel von "Portfolio" sind. In diesem Fall wird nur Folgendes zurückgegeben: - "Enkel 1A", "Enkel 1B", "Enkel 2A", "Enkel 2B".

irgendwelche Vorschläge?

2

Es gibt keine native Möglichkeit, diese AFAIK durchzuführen. Der einfachste Weg wird sein:

  • um einfach alle Seiten in der Hierarchie der übergebenen Seiten-ID abzufragen

  • geben Sie dann alle übergeordneten IDs ( $ post_parent-Eigenschaft des Post-Objekts ) 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, deren ID im Array der übergeordneten ID enthalten ist, wird einfach übersprungen und ausgeschlossen

  • jede Seite, deren ID nicht im übergeordneten ID-Array enthalten ist, wird zum Erstellen eines neuen Arrays verwendet. Diese Seiten sind die Seiten der untersten Ebene

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

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, die Sie benötigen, um die Enkelkinder von zu erhalten.)

$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();
}
2
Pieter Goosen

Benutze 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 '<pre>' . print_r($grandchild, true) . '</pre>';
1
John Priestakos

Damit Sie sich ein Bild machen können, haben Sie diesen Code noch 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.

0
1inMillion