Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Previously, I was able to selectively load child pages for a currently-selected parent page using logic such as:

if(  $post->post_parent ) {
  $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
} else {
  $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
}

if ($children) { ?>
   <ul id="subnav">
     <?php echo $children; ?>
   </ul>
<?php 
} else {
}

There doesn't seem to be a native way to do this using the new register_nav_menus()/wp_nav_menu() functionality. Anyone know how I could patch this together at this point?

Here's a screenshot of what I'm trying to achieve:

Drop down Child menu screenshot

share|improve this question
    
This is tough, since wp_nav_menu doesn't relate to page hierarchy (or pages at all, for that matter). I don't know enough about menus to answer this now, but this is a very interesting question. –  John P Bloch Aug 18 '10 at 21:31
    
I don't fully understand the question. What are you trying to accomplish? I see the code but I don't get the context. Got a site that does want? A screenshot? –  MikeSchinkel Aug 18 '10 at 21:39
    
He wants to add child items of top level menu items conditionally (i.e. only if that tree structure is active) in the new nav menu api. –  John P Bloch Aug 18 '10 at 21:40
    
@John P. Bloch - What does "only if the tree structure is active" mean? Are we talking Pages only? What about Posts, Categories, Tags, Custom Posts, etc? Does he want to do it on the client via jQuery or in the server? I guess I'd rather not assume and I'd like to hear more about the actual use-case. –  MikeSchinkel Aug 18 '10 at 21:45
    
@MikeSchinkel In this particular case, I think we may be talking pages only, but that doesn't matter anyway; the solution will still be the same. I think ZaMoose wants it done server-side. –  John P Bloch Aug 18 '10 at 21:55

2 Answers 2

up vote 7 down vote accepted

I created a Widget named Page Sub Navigation (clever I know) that is working for me.

If you install this, you can just drag the widget to one of your widget areas and BAM it works.

<?php
/*
Plugin Name: Page Sub Navigation
Plugin URI: http://codegavin.com/wordpress/sub-nav
Description: Displays a list of child pages for the current page
Author: Jesse Gavin
Version: 1
Author URI: http://codegavin.com
*/

function createPageSubMenu()
{
  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;
    }

    $title = get_the_title($parent);

    if(wp_list_pages("title_li=&child_of=$parent&echo=0" )) {
      echo "<div id='submenu'>";
      echo "<h3><span>$title</span></h3>";
      echo "<ul>";
      wp_list_pages("title_li=&child_of=$parent&echo=1" );
      echo "</ul>";
      echo "</div>";
    }
  }
}


function widget_pageSubNav($args) {
  extract($args);
  echo $before_widget;
  createPageSubMenu();
  echo $after_widget;
}

function pageSubMenu_init()
{
  wp_register_sidebar_widget("cg-sidebar-widget", __('Page Sub Navigation'), 'widget_pageSubNav');
}
add_action("plugins_loaded", "pageSubMenu_init");
?>

Or if you just want the juicy parts...

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" );
  }
}

UPDATE

I found another plugin that does essentially the same thing (and maybe does it better, I don't know). http://wordpress.org/extend/plugins/subpages-widget/

share|improve this answer
    
This is SO, so close to what I need. The only problem is that it misbehaves when BuddyPress is active. –  ZaMoose Aug 19 '10 at 14:38

you could do a css hack to do this (2 ways that I would try)

1 this is the easiest way I can think of do make the css display the items in the subnavigation.

.current-menu-ancestor ul {display:inline;}
.current-menu-parent ul (display:inline;}

2 assuming that your theme supports body classes you could create a nav menu for each "sub nav", and set them to display beneath the main navigation - then edit your stylesheet to only show the subnav div's using something like this:

.child-menu-about, .child-menu-leadership {display:none;}
body.page-id-YOUR_ABOUT_PAGE_ID .child-menu-about {display:inline;}
body.category-YOUR-CATEGORY-SLUG  .child-menu-leadership {display:inline;}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.