Comment obtenir le titre de l'élément de menu actuel en tant que variable?

10

Est-il possible d'obtenir l'élément de menu actuel en tant que variable php?

J'énumère la catégorie musées via l'élément de menu «musées que nous soutenons», donc j'aimerais avoir le bit «musées que nous soutenons» et l'afficher quelque part?

Toute aide appréciée!

v3nt
la source

Réponses:

15

Cela est possible en filtrant wp_nav_menu_objects, qui est l'endroit le plus simple pour vérifier quel élément est l'élément de menu actuel, car WordPress a déjà ajouté les classes pour vous .

add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
    foreach ( $sorted_menu_items as $menu_item ) {
        if ( $menu_item->current ) {
            $GLOBALS['wpse16243_title'] = $menu_item->title;
            break;
        }
    }
    return $sorted_menu_items;
}

Vous pouvez maintenant utiliser cette nouvelle variable globale au lieu du titre normal. Exemple simple:

add_filter( 'single_cat_title', 'wpse16243_single_cat_title' );
function wpse16243_single_cat_title( $cat_title )
{
    if ( isset( $GLOBALS['wpse16243_title'] ) ) {
        return $GLOBALS['wpse16243_title'];
    }
    return $cat_title;
}

Bien sûr, cela ne fonctionne que si vous affichez le menu avant d'afficher le titre. Si vous en avez besoin plus tôt (peut-être dans l' <title>élément?), Vous devez d' abord rendre le menu, puis l'afficher plus tard .

Jan Fabry
la source
bonjour Jan - je me demande simplement s'il existe un moyen de créer un tableau des enfants $ menu_item-> des éléments actuels? J'ai essayé plusieurs choses mais pas très loin ..!
v3nt
géré cela à l'aide de votre filtre - réponse ci-dessous. À votre santé!
v3nt
Jan Fabry / J'ai essayé d'utiliser wpse16243_wp_nav_menu_objectspour récupérer l'ID de menu actuel. Mais ce n'est pas cohérent. Basculer entre la page d'accueil et un élément de menu ne me donne pas toujours un élément de menu correct - c'est une sorte de "retard". Une suggestion sur la façon de récupérer l'ID de menu actuel?
Steven
Y a-t-il une raison pour laquelle vous préférez le nom de la fonction wpse16243? Je vois ce type de nom étrange assez commun et je me demande de quoi il s'agit. Avis de non-responsabilité: Wordpress noob.
Stephen Watkins
2
@ Steve: Juste un préfixe unique: WordPress Stack Exchange question number 16243. Si les gens copient directement ce code, il n'entrera pas en conflit avec d'autres plugins qui pourraient partager les mêmes noms de fonction.
Jan Fabry
4

Vous pouvez utiliser wp_get_nav_menu_items(). Voici un exemple function:

<?php
function my_get_menu_item_name( $loc ) {
    global $post;

    $locs = get_nav_menu_locations();

    $menu = wp_get_nav_menu_object( $locs[$loc] );

    if($menu) {

        $items = wp_get_nav_menu_items($menu->term_id);

        foreach ($items as $k => $v) {
            // Check if this menu item links to the current page
            if ($items[$k]->object_id == $post->ID) {
                $name = $items[$k]->title;
                break;
            }
        }

    }
    return $name;
}

Appelez ensuite le functionavec le nom d'emplacement du menu de navigation que vous souhaitez utiliser:

<?php
$menu_name = my_get_menu_item_name( 'NAV_MENU_LOCATION_NAME' ); // eg. 'primary'

echo $menu_name;
Giraldi
la source
2
add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
    foreach ( $sorted_menu_items as $menu_item ) {

        if ($menu_item->current ) {
            $GLOBALS['currentMenuTitle'] = $menu_item->title;
            $GLOBALS['currentMenuID'] = $menu_item->ID;



            break;
        }
    }


    return $sorted_menu_items;
}


function get_menu_items_children( $menu_item_id='' )
{   
    global $wpdb;

      //     AND meta_key='_menu_item_menu_item_parent'

    $myrows = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta JOIN $wpdb->posts ON $wpdb->postmeta.post_id=$wpdb->posts.id WHERE meta_value = '".$menu_item_id."' AND meta_key='_menu_item_menu_item_parent' ORDER BY $wpdb->posts.menu_order ASC" );


    foreach ( $myrows as $menu_item ) {

        $sc = get_object_vars($menu_item);  

        $myrowsb = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE post_id = '".$sc['post_id']."' AND meta_key='_menu_item_object_id' " );

        foreach ( $myrowsb as $menu_itemb ) {

            $scb = get_object_vars($menu_itemb);    
            $pmIDs[] = $scb['meta_value'];

        }

    }


    return $pmIDs;
}
v3nt
la source
0

Je ne suis pas sûr de suivre exactement.

Les «musées que nous soutenons» sont générés par un titre de publication, un titre de page, un titre de catégorie, etc. (ou, si vous utilisez un menu de navigation personnalisé, il peut s'agir d'un titre personnalisé).

Qu'essayez-vous de faire avec ce texte? Où essayez-vous de l'afficher? Je suppose que vous essayez de l'afficher sur la page d'index des catégories (puisque vous l'indiquez current-menu-item)? Si oui, appelez simplement <?php single_cat_title(); ?>pour afficher le titre de la catégorie.

Si vous avez besoin d'informations supplémentaires sur les catégories, vous pouvez utiliser quelque chose comme:

$cat = get_the_category();
$currentcat = $cat[0];

Ce qui met à disposition les variables suivantes:

$currentcat=>cat_ID // Category ID
$currentcat=>cat_name // Category Name (Same as Title)
$currentcat=>category_nicename // Category Slug
$currentcat=>category_description // Category Description
$currentcat=>category_count // Category Count (# of Posts w/ this Category)

Si vous êtes dans un endroit autre que la catégorie Index page, vous devez passer la catId $ à ces fonctions.

ÉDITER:

Puisque vous avez indiqué que "Museums We Support" est un titre de menu personnalisé, l' approche la plus simple serait de renommer la catégorie de "Museums" en "Museums We Support" (remarque: vous pouvez laisser le slug museumsinchangé). Cependant, cela signifierait que "Museums We Support" serait affiché comme titre de catégorie partout où il pourrait être affiché dans votre modèle. Si cela est acceptable, alors ne vous inquiétez pas.

Sinon, vous devrez utiliser quelque chose comme wp_get_nav_menu_items()( référence Codex ) afin de saisir le titre de l'élément de menu spécifique.

Chip Bennett
la source
hey chip - c'est cette page; bfami.modernactivity.co.uk/category/museum donc en gros le chat est «musée» mais je veux montrer le «MUSÉES NOUS SOUTENONS» qui est l'étiquette de navigation (titre personnalisé) définie dans la page des menus. Vous pensez qu'il est possible de saisir cela d'une manière ou d'une autre?
v3nt
Qui aide. Voir ma réponse modifier. Vous avez deux options: renommer la catégorie ou utiliser wp_get_nav_menu_items().
Chip Bennett
cheers chip - vient de changer le titre de la catégorie à la fin! Je pensais juste qu'il y aurait un moyen facile de saisir l'étiquette du menu ...
v3nt