web-dev-qa-db-fra.com

Comment puis-je accéder à la "description" d'un élément de menu?

Où vous pouvez ajouter votre menu sous apparence> menus, j'ai des descriptions. Dans ma page, je veux pouvoir faire écho à cette description. Pas dans le menu, mais dans ma page. Comment puis-je accéder à cette information?

MODIFIER:

@toscho

Comment éditer mon marcheur personnalisé? Est-ce que l'objet $ item a accès à l'extrait de page?

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 );
        }
}
2
Claire

Je n’aime pas l’idée d’analyser à nouveau les éléments de menu. Comme solution alternative, je suggère de stocker la description lors de la première exécution:

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

Explication

La fonction fait deux choses:

  1. Il agit comme un filtre appelé à l'intérieur de wp_nav_menu(). Ici, il est appelé jusqu'à ce qu'il apparaisse sur la page en cours. Ensuite, la description est stockée en interne dans $desc.
  2. Il agit comme un getter pour la description: si vous appelez cette fonction sans paramètre après le menu de navigation a été affiché, vous obtenez la valeur de la description, si il existe une.

L'inconvénient est que cela ne fonctionnerait pas pour un appel de menu trop tard, dans un pied de page par exemple.
L'avantage: vous gagnez du temps.

Vous pouvez obtenir la description ultérieurement à tout moment en appelant la fonction sans paramètre:

print wpse_78483_get_current_items_description();

En guise de suivi, voici une deuxième façon de l’utiliser:

$desc = wpse_78483_get_current_items_description();

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

Conseil supplémentaire: vous pouvez activer la zone de l'éditeur d'extraits pour les pages:

add_action( 'wp_loaded', 'wpse_78483_page_excerpt' );

function wpse_78483_page_excerpt()
{
    add_post_type_support( 'page', 'excerpt' );
}
2
fuxia

Trouvé la réponse sur un site Web en cache Google.

Donc, pour accéder à la description de l'élément de navigation de la page actuelle, appelez simplement la fonction 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;
}
0
Claire