Eltern ausblenden, wenn keine Kinder vorhanden sind

Der Codex bietet eine Möglichkeit, die Kinder- und Elternseite zur Verwendung als Untermenü anzuzeigen. Dieser Code zeigt jedoch die übergeordnete Seite in der Liste an, auch wenn das übergeordnete Element keine untergeordneten Elemente enthält. Wie kann ich diesen Code ändern, so dass er nur angezeigt wird, wenn der Elternteil Seiten hat?

functionen.php

if(!function_exists('get_post_top_ancestor_id')){ /** * Gets the id of the topmost ancestor of the current page. Returns the current * page's id if there is no parent. * * @uses object $post * @return int */ function get_post_top_ancestor_id(){ global $post; if($post->post_parent){ $ancestors = array_reverse(get_post_ancestors($post->ID)); return $ancestors[0]; } return $post->ID; }} 

Aufruf es:

 '','include'=>get_post_top_ancestor_id()) ); ?> '','depth'=>1,'child_of'=>get_post_top_ancestor_id()) ); ?> 

Solutions Collecting From Web of "Eltern ausblenden, wenn keine Kinder vorhanden sind"

 < ?php if ($post->post_parent) { //We are a child, print out sub menu wp_list_pages( array('title_li'=>'','include'=>$post->post_parent) ); wp_list_pages( array('title_li'=>'','depth'=>1,'child_of'=>$post->post_parent) ); } //We are not a child but do we have children $children = wp_list_pages(array('child_of' => $post->ID, 'echo' => 0)); if ( !empty($children) ) { //If so print out the sub menu wp_list_pages( array('title_li'=>'','include'=>$post->ID) ); wp_list_pages( array('title_li'=>'','depth'=>1,'child_of'=>$post->ID) ); } //Not a child and not a parent so show nothing and continue ?> 

Ich habe das getestet und es funktioniert wie du erwähnt hast, ich konnte diese function nicht herausfinden, aber vielleicht kann jemand eine bessere Lösung mit dieser function posten.

Ich habe einen anderen Weg genommen und das mit CSS getriggers. Vielleicht nicht so robust, aber für eine schnelle Reparatur bei Bedarf, hier ist, was ich verwendet habe:

 html .main-navigation li.menu-item-263{ display: none; } html .main-navigation li.menu-item-263.menu-item-has-children{ display: inline-block; } 

Menüeintrag 263 ist mein übergeordneter Menüeintrag, der manchmal keine Kinder hatte (für Nichtmitglieder, die nicht angemeldet sind, da kein Zugriff auf untergeordnete Seiten möglich ist). Ich denke, es bricht, wenn sich meine Menü-IDs ändern, und ich müsste das CSS wiederholen, um mit anderen Menüs umgehen zu können … also nicht perfekt, aber schnell und einfach, und wahrscheinlich wird nichts kaputt gehen oder eine Menge neuer Tests erfordern.

Nun zu den offensichtlichen Sachen, für die Nicht-Entwickler, die das lesen:

Ich habe das oben in meiner theme style.css Datei platziert. Um die Menü-ID zu erhalten, klicke ich mit der rechten Maustaste in FireFox und wähle “inspect element” – die ID wird in der class des Menü-Elements sein. Die ersten drei Zeilen des obigen Codes verbergen den Menüeintrag mit dieser ID, die letzten drei Zeilen überschreiben das (zeigen sie an), wenn die class “menu-item-has-children” gesetzt ist (nur wenn sie untergeordnete Elemente hat).

Diese Lösung wurde von MichaelH unter folgendem Link geschrieben: http://wordpress.org/support/topic/how-to-only-list-pages-if-they-have-no-children .

Dies verwendet keine Listenseiten, sondern stattdessen get_pages, daher ist es möglicherweise nicht 100% relevant. Ich habe diesen Code leicht modifiziert, indem ich vor “leer” ein Ausrufezeichen gesetzt habe. Sie können es entfernen, um zu sehen, wie es funktioniert.

 < ?php //get all 'first level' pages, then iterate through those results, //then for each result, see if there are child pages, and if there //are no child pages for that page, then display $pages = get_pages('parent=0'); foreach ($pages as $page) { $child = get_pages('child_of='.$page->ID); if (!empty($child)) { ?> 
  • < ?php echo $page->post_title;?>
  • < ?php } } ?>