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.

I have a client that wanted two "main menus" and we needed to programmatically display whichever menu contained the current page. How can I do that?

Ex: We're on the "About" page. Figure out which of the two menus contains the "About" page and show that one.

share|improve this question
    
can I ask why they wanted two main menus? Sounds odd, or like they didn't want this, this is just their idea on how to implement what they actually want –  Tom J Nowell Dec 10 '12 at 18:23
    
I'm not thrilled with needing to do this, but what they asked for both in site structure and design required two menus for two mostly independent sections of the site. I'm guessing that this function could be used for some other stuff too, and I was surprised that I didn't find anything like it when I first looked. –  mrwweb Dec 10 '12 at 22:21

1 Answer 1

up vote 4 down vote accepted

Here's the function I wrote to figure this out. You give it a menu slug/name/ID and post/page ID and it returns TRUE if that post/page is in the specified menu and FALSE otherwise. Then it was just simply a matter of a quick if/else statement to check against the two menus and display the correct one.

/**
 * Check if post is in a menu
 *
 * @param $menu menu name, id, or slug
 * @param $object_id int post object id of page
 * @return bool true if object is in menu
 */
function cms_is_in_menu( $menu = null, $object_id = null ) {

    // get menu object
    $menu_object = wp_get_nav_menu_items( esc_attr( $menu ) );

    // stop if there isn't a menu
    if( ! $menu_object )
        return false;

    // get the object_id field out of the menu object
    $menu_items = wp_list_pluck( $menu_object, 'object_id' );

    // use the current post if object_id is not specified
    if( !$object_id ) {
        global $post;
        $object_id = get_queried_object_id();
    }

    // test if the specified page is in the menu or not. return true or false.
    return in_array( (int) $object_id, $menu_items );

}

Example Usage:

if( cms_is_in_menu( 'main-menu' ) ) {
    // do something like wp_nav_menu( $args );
}
share|improve this answer
    
Nice snippet. I needed to use it to serve up a different header image depending on the menu the page was assigned to. Thanks! –  Stephen S. May 5 at 18:31

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.