Como obter o título do item de menu atual como variável?


10

É possível obter o item de menu atual como uma variável php?

Estou listando a categoria museus através do item de menu 'museus que apoiamos', então eu gostaria do bit 'museus que apoiamos' e o exibia em algum lugar?

Qualquer ajuda apreciada!

Respostas:


15

Isso é possível com a filtragem wp_nav_menu_objects, que é o local mais fácil para verificar qual item é o item de menu atual, porque o WordPress já adicionou as classes para você .

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

Agora você pode usar essa nova variável global em vez do título normal. Exemplo simples:

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

Obviamente, isso só funciona se você exibir o menu antes de exibir o título. Se você precisar mais cedo (talvez no <title>elemento?), Primeiro renderize o menu e depois exiba-o mais tarde .


olá Jan - apenas imaginando se existe uma maneira de criar uma matriz dos filhos de $ menu_item-> dos itens atuais? Tentei várias coisas, mas não fui muito longe ..!
v3nt 19/07/11

conseguiu isso com a ajuda do seu filtro - responda abaixo. Felicidades!
v3nt

Jan Fabry / Tentei usar wpse16243_wp_nav_menu_objectspara recuperar o ID do menu atual. Mas não é consistente. Alternar entre a página inicial e um item de menu nem sempre me fornece o item de menu correto - é um tipo de "atraso". Alguma sugestão sobre como recuperar o ID do menu atual?
Steven

Existe uma razão pela qual você precede o nome da função wpse16243? Eu vejo esse tipo estranho de nome bastante comum e me perguntando o que é isso tudo. Isenção de responsabilidade: Wordpress noob.
Stephen Watkins

2
@ Steve: Apenas um prefixo único: WordPress Stack Exchange question number 16243. Se as pessoas copiarem diretamente esse código, ele não entrará em conflito com outros plugins que podem compartilhar os mesmos nomes de função.
Jan Fabry

4

Você pode usar wp_get_nav_menu_items(). Aqui está uma amostra 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;
}

Em seguida, chamar o functioncom o nome do local do menu de navegação que você deseja usar:

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

echo $menu_name;

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

0

Não tenho certeza se sigo exatamente.

Os "Museus que apoiamos" são gerados por um título da postagem, título da página, título da categoria etc. (ou, se você estiver usando um menu de navegação personalizado, pode ser um título personalizado).

O que você está tentando fazer com este texto? Onde você está tentando exibi-lo? Suponho que você esteja tentando exibi-lo na página de índice de categoria (já que você indica current-menu-item). Nesse caso, basta ligar <?php single_cat_title(); ?>para gerar o título da categoria.

Se você precisar de informações adicionais sobre a categoria, poderá usar algo como:

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

O que disponibiliza as seguintes variáveis:

$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)

Se você estiver em outro lugar que não seja a página de índice de categoria, precisará passar o $ catid para essas funções.

EDITAR:

Como você indicou que "Museus que apoiamos" é um título de menu personalizado, a abordagem mais fácil seria renomear a categoria de "Museus" para "Museus que apoiamos" (nota: você pode deixar a lesma museumsinalterada). No entanto, isso significaria que "Museus que apoiamos" seria exibido como o título da categoria em qualquer outro lugar em que possa ser exibido no seu modelo. Se isso é aceitável, então não se preocupe.

Caso contrário, você precisará usar algo como wp_get_nav_menu_items()( ref do Codex ) para obter o título do item de menu específico.


ei chip - é esta página; bfami.modernactivity.co.uk/category/museum Então, basicamente, o gato é 'museu', mas eu quero mostrar os 'MUSEUS QUE APOIAMOS', que é o rótulo de navegação (título personalizado) definido na página de menus. Acha que é possível entender isso de alguma forma?
v3nt

Isso ajuda. Veja minha resposta editar. Você tem algumas opções: renomeie a categoria ou use wp_get_nav_menu_items().
Chip Bennett

cheers chip - acabou de mudar o título da categoria no final! Apenas pensei que haveria uma maneira fácil de agarrar o rótulo menu ...
v3nt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.