I have built a custom menu in WordPress that contains links to posts and pages. I am adding it to my header using this line of code:
<?php
wp_nav_menu(
array(
'theme_location' => 'primary',
'depth' => 0,
'menu_class' => 'nav-menu',
)
);
?>
My problem is, if I add a child page to the top level ones on the menu, they don’t automatically appear as sublinks on the nav. I know I can create them manually each time by rebuilding the menu, but I would like to be able to just add a child page in the pages section and have it show up in the nav without having to go to the menu and build it there also, if that makes sense?
I’ve tried using depth => 0, but that didn’t work. Is there a way to have child pages show up without having to build it into the custom menu?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
here is how:
/**
* auto_child_page_menu
*
* class to add top level page menu items all child pages on the fly
* @author Ohad Raz <<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f190959c989fb19390989f8594839f9485df989f979e">[email protected]</a>>
*/
class auto_child_page_menu
{
/**
* class constructor
* @author Ohad Raz <<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94f5f0f9fdfad4f6f5fdfae0f1e6faf1e0bafdfaf2fb">[email protected]</a>>
* @param array $args
* @return void
*/
function __construct($args = array()){
add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
}
/**
* the magic function that adds the child pages
* @author Ohad Raz <<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f796939a9e99b795969e99839285999283d99e999198">[email protected]</a>>
* @param array $items
* @return array
*/
function on_the_fly($items) {
global $post;
$tmp = array();
foreach ($items as $key => $i) {
$tmp[] = $i;
//if not page move on
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//if not parent page move on
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id) );
foreach ((array)$children as $c) {
//set parent menu
$c->menu_item_parent = $i->ID;
$c->object_id = $c->ID;
$c->object = 'page';
$c->type = 'post_type';
$c->type_label = 'Page';
$c->url = get_permalink( $c->ID);
$c->title = $c->post_title;
$c->target = '';
$c->attr_title = '';
$c->description = '';
$c->classes = array('','menu-item','menu-item-type-post_type','menu-item-object-page');
$c->xfn = '';
$c->current = ($post->ID == $c->ID)? true: false;
$c->current_item_ancestor = ($post->ID == $c->post_parent)? true: false; //probbably not right
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0