3

I've been playing around with Wordpress' menu functionality (wp_nav_menu and wp_list_pages) to build a menu for my site. It's coming along, but I'm still having some trouble getting the behaviour I'd like.

What I'd like is something like the sidebar menu on this website (not WP): http://www.fairfood.org/facts/sustainability-agenda/

When you click on a subpage that has children, the menu displays those children: http://www.fairfood.org/facts/production-chains/

I currently have this code:

            <?php // sidebar menu
        if ($post->post_parent) {
            $ancestors=get_post_ancestors($post->ID);
            $root=count($ancestors)-1;
            $parent = $ancestors[$root];
        } else {
            $parent = $post->ID;
        }

        $children = wp_list_pages("title_li=&child_of=". $parent ."&echo=0");

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

This works, but this shows the children that all the subpages have, not just the children of the current page. An example of what I mean: http://test.fairfood.org/facts/

Any have any idea to make this work?

2
  • As long as you call it late enough $wp_query should be able to give you the ID using get_queried_object_id(), so this should work.. $children = wp_list_pages("title_li=&child_of=" . $wp_query->get_queried_object_id() . "&echo=0");
    – t31os
    Feb 23, 2011 at 17:04
  • even this could help wordpress.stackexchange.com/q/19507/6038
    – Matus
    Jun 10, 2011 at 10:40

1 Answer 1

0

If you dont mind using a plugin I can tell you how I have gotten this to work in the past.

  1. Add the following code to your functions.php
    function get_root_parent($page_id) {
    global $wpdb;
    $parent = $wpdb->get_var("SELECT post_parent FROM $wpdb->posts WHERE post_type='page' AND ID = '$page_id'");
    if ($parent == 0) return $page_id;
    else return get_root_parent($parent);
    }
    
  2. Add the following to header.php between the close of head and open of body in a php wrapper
    <?php
    $GLOBALS["parentId"] = get_root_parent($post->ID);
    ?>
    
  3. Download and install the fold pages plugin: http://www.webspaceworks.com/resources/wordpress/30/

  4. Add the following code to your sidebar.php
    <ul>
    <?php
    $thispage = $wp_query->post;
    if ($thispage->post_parent!=0) {
            wswwpx_fold_page_list("sort_column=menu_order&child_of=".$GLOBALS["parentId"]."&title_li=&amp;child_of=".$thispage->post_parent);
          } else {
            wswwpx_fold_page_list("sort_column=menu_order&child_of=".$GLOBALS["parentId"]."&title_li=&amp;child_of=".$thispage->ID);
          }?>
        </ul>
    
1
  • This looks great! I'm going to check it out now. Thank you so much for your reply!
    – user3201
    Feb 23, 2011 at 14:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.