it-swarm.com.de

Generieren Sie ein Menü, in dem alle untergeordneten Seiten des übergeordneten Elements der obersten Ebene angezeigt werden

Ich habe den Code dieser Antwort verwendet, um ein Widget zu generieren, das alle Unterseiten der übergeordneten Seite anzeigt:

if (is_page()) {
  global $wp_query;

  if( empty($wp_query->post->post_parent) ) {
    $parent = $wp_query->post->ID;
  } else {
    $parent = $wp_query->post->post_parent;
  }

  if(wp_list_pages("title_li=&child_of=$parent&echo=0" )) {
    wp_list_pages("title_li=&child_of=$parent&echo=1" );
  }
}

Mir ist jetzt klar, dass das nicht klappt, wenn ich auf einer Enkelseite bin, in der die Onkel und Tanten nicht angezeigt werden, nur die Eltern.

Ich verstehe nicht, wie ich diesen Code anpassen kann, um mehr als zwei Ebenen des Menübaums anzuzeigen.

Hilfe geschätzt.

2
Steve

Hier ist eine Funktion, die das übergeordnete Element der obersten Ebene zusammen mit allen untergeordneten Elementen der aktuellen Seite ausgibt. Hilfreiche Menüklassen werden zur Ausgabe hinzugefügt. Z.B. page_item_has_children, current_page_item, current_page_ancestor usw.

Diese Lösung ist basierend auf einem der Beispiele in der Dokumentation für wp_list_pages() und diese Antwort hier auf WPSE, die auf dasselbe Beispiel verweist.

/**
 * Use wp_list_pages() to display parent and all child pages of current page.
 */
function wpse_get_ancestor_tree() {
    // Bail if this is not a page.
    if ( ! is_page() ) {
      return false;
    }

    // Get the current post.
    $post = get_post();

    /**
     * Get array of post ancestor IDs.
     * Note: The direct parent is returned as the first value in the array.
     * The highest level ancestor is returned as the last value in the array.
     * See https://codex.wordpress.org/Function_Reference/get_post_ancestors
     */
    $ancestors = get_post_ancestors( $post->ID );

    // If there are ancestors, get the top level parent.
    // Otherwise use the current post's ID.
    $parent = ( ! empty( $ancestors ) ) ? array_pop( $ancestors ) : $post->ID;

    // Get all pages that are a child of $parent.
    $pages = get_pages( [
                     'child_of' => $parent,
                     ] );

    // Bail if there are no results.
    if ( ! $pages ) {
        return false;
    }

    // Store array of page IDs to include latere on.
    $page_ids = array();
    foreach ( $pages as $page ) {
        $page_ids[] = $page->ID;
    }

    // Add parent page to beginning of $page_ids array.
    array_unshift( $page_ids, $parent );

    // Get the output and return results if they exist.
    $output = wp_list_pages( [
        'include'  => $page_ids,
        'title_li' => false,
        'echo'     => false,
    ] );

    if ( ! $output ) {
        return false;
    } else { 
        return '<ul class="page-menu ancestor-tree">' . PHP_EOL .
                            $output . PHP_EOL .
                        '</ul>' . PHP_EOL;
    }
}

Verwendung:

echo wpse_get_ancestor_tree();

Beispielseitenstruktur:

Parent Page
  Child Page 01
  Child Page 02
  Child Page 03
    Grandchild Page
      Great Grandchild Page
  Child Page 04
  Child Page 05

Beispielausgabe (aktuelle Seite: Urenkel Seite)

<ul class="page-menu ancestor-tree">
    <li class="page_item page-item-1088 page_item_has_children current_page_ancestor">
        <a href="http://example.com/parent-page/">Parent Page</a>
        <ul class="children">
            <li class="page_item page-item-1090">
                <a href="http://example.com/parent-page/child-page-01/">Child Page 01</a>
            </li>
            <li class="page_item page-item-1092">
                <a href="http://example.com/parent-page/child-page-02/">Child Page 02</a>
            </li>
            <li class="page_item page-item-1094 page_item_has_children current_page_ancestor">
                <a href="http://example.com/parent-page/child-page-03/">Child Page 03</a>
                <ul class="children">
                    <li class="page_item page-item-1102 page_item_has_children current_page_ancestor current_page_parent">
                        <a href="http://example.com/parent-page/child-page-03/grandchild-page/">Grandchild Page</a>
                        <ul class="children">
                            <li class="page_item page-item-3066 current_page_item">
                                <a href="http://example.com/parent-page/child-page-03/grandchild-page/great-grandchild-page/">Great Grandchild Page</a>
                            </li>
                        </ul>
                </li>
            </ul>
        </li>
        <li class="page_item page-item-1096">
            <a href="http://example.com/parent-page/child-page-04/">Child Page 04</a>
        </li>
        <li class="page_item page-item-1098">
            <a href="http://example.com/parent-page/child-page-05/">Child Page 05</a>
        </li>
    </ul>
    </li>
</ul>
3
Dave Romsey

Ich glaube, Sie greifen derzeit nur nach dem Elternteil und suchen nicht nach dem Ahnen der obersten Ebene.

Versuchen Sie, Folgendes zu ersetzen:

  if( empty($wp_query->post->post_parent) ) {
    $parent = $wp_query->post->ID;
  } else {
    $parent = $wp_query->post->post_parent;
  }

mit:

if ($post->post_parent) {
    $ancestors=get_post_ancestors($post->ID);
    $root=count($ancestors)-1;
    $parent = $ancestors[$root];
} else {
    $parent = $post->ID;
}

Wie folgt: https://css-tricks.com/snippets/wordpress/find-id-of-top-most-parent-page/

2
Alex Davison

richtiger Code:

if( empty($wp_query->post->post_parent) ) {
    $parent = $wp_query->post->ID;
} else {
    $ancestors=get_post_ancestors($wp_query->post->ID);
    $parent = $ancestors[count($ancestors)-1];
}

es greift auf die oberste Seite der aktuellen Seite zu.

0
T.Todua