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.

Where you can add your menu in under appearance > menus, I have descriptions in. In my page, I want to be able to echo out that description. Not in the menu, but in my page. How can I access this information?

EDIT:

@toscho

How do I edit my custom walker? Does the object $item have access to the page excerpt?

class description_walker extends Walker_Nav_Menu
{
        function start_el(&$output, $item, $depth, $args)
  {
    global $language;
       global $wp_query;
     global $post;
     global $polish_name;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
       $class_names = $value = '';

       $classes = empty( $item->classes ) ? array() : (array) $item->classes;

       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
       $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

       $prepend = '<strong>';
       $append = '</strong>';


        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
      if($language=="polish"){
           $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->description, $item->ID ).$append;

       }else{
        $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
       }


        $item_output .= '</a>';
        $item_output .= $args->after;


        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
        }
}
share|improve this question
    
Why don’t you use the page excerpt? –  toscho Jan 6 '13 at 22:12
    
because I need to use it in the menu as well, when wp_nav_menu is called. I have a custom walker. –  Nicola Jan 6 '13 at 22:16
    
@toscho As it turns out I need to use the excerpt this now. Could you take a look at this question please? –  Nicola Jan 8 '13 at 16:12

2 Answers 2

up vote 1 down vote accepted

I don’t like the idea to parse the menu items again. As an alternative solution I suggest to store the description during the first run:

add_filter( 'walker_nav_menu_start_el', 'wpse_78483_get_current_items_description', 10, 2 );

/**
 * Get nav items description.
 *
 * @wp-hook walker_nav_menu_start_el
 * @param   string $item_output
 * @param   object $item
 * @return  string
 */
function wpse_78483_get_current_items_description( $item_output = NULL, $item = NULL )
{
    static $desc = '';

    // The function is NOT called during nav menu rendering, but later.
    if ( 'walker_nav_menu_start_el' !== current_filter() )
        return $desc;

    // The function is called during wp_nav_menu().

        // description is set
    if ( ! empty ( $item->description )
        // and an URL is available
        and ! empty ( $item->url )
        // and it is the current page
        and parse_url( $item->url, PHP_URL_PATH ) === $_SERVER['REQUEST_URI']
        )
    {
        // copy the description into our static internal variable
        $desc = $item->description;
        // remove this filter, it is not needed anymore
        remove_filter( 'walker_nav_menu_start_el', __FUNCTION__ );
    }

    // return unchanged item markup
    return $item_output;
}

Explanation

The function does two things:

  1. It acts as a filter called inside of wp_nav_menu(). Here, it is called until it hits the current page. Then the description is stored internally in $desc.
  2. It acts as a getter for the description: If you call this function without parameter after the navigation menu has been rendered you get the value of the description, if there is one.

The downside is: it would not work for a menu call too late, in a footer for example.
The advantage: you save time.

You can get the description later any time by calling the function without a parameter:

print wpse_78483_get_current_items_description();

As a follow-up, here is a second way to use it:

$desc = wpse_78483_get_current_items_description();

if ( empty ( $desc ) )
{
    the_excerpt();
}
else
{
    print wpautop( $desc );
}

Extra tip: You can enable the excerpt editor box for pages:

add_action( 'wp_loaded', 'wpse_78483_page_excerpt' );

function wpse_78483_page_excerpt()
{
    add_post_type_support( 'page', 'excerpt' );
}
share|improve this answer
    
thank you. I don't really understand how it works but it does so thanks! –  Nicola Jan 6 '13 at 23:03
1  
@Nicola Sorry, you are right. I have made an update with a better explanation and inline docs. –  toscho Jan 6 '13 at 23:14
    
thanks, I updated my question to show that I want all pages to store the alt text in excerpt –  Nicola Jan 8 '13 at 20:24

Found the answer on a google cached website.

So to access the current page's navigation item description - just call the function echo wps_get_menu_description()

function wps_get_menu_description( ) {
global $post;

// Default
$defaults = array(
    'echo' => false,
    'format' => '',
    'description' => '',
    'location' => 'primary',
    'classes' => 'post-description'
);

$args = wp_parse_args( $args, $defaults );
extract( $args , EXTR_SKIP );

// Get menu
$menu_locations = get_nav_menu_locations();
$nav_items = wp_get_nav_menu_items( $menu_locations[ $location ] );

// Cycle through nav items
foreach ( $nav_items as $nav_item ) {

    if ( ( is_page() || is_single() || is_archive() ) && ( $nav_item->object_id == $post->ID ) ) {
        $description = $nav_item->description;
    }

}


    $output = $description;

return $output;
}
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.