¿Cómo obtener el título del current-menu-item como variable?

3 may 2011, 17:48:43
Vistas: 33.6K
Votos: 10

¿Es posible obtener el current-menu-item como una variable PHP?

Estoy listando la categoría museos a través del elemento de menú 'museos que apoyamos', así que me gustaría obtener la parte de 'museos que apoyamos' y mostrarla en algún lugar.

¡Cualquier ayuda es apreciada!

0
Todas las respuestas a la pregunta 4
5
15

Esto es posible filtrando wp_nav_menu_objects, que es el lugar más fácil para verificar qué elemento es el elemento actual del menú, porque WordPress ya ha agregado las clases por ti.

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

Ahora puedes usar esta nueva variable global en lugar del título normal. Ejemplo 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;
}

Por supuesto, esto solo funciona si muestras el menú antes de mostrar el título. Si lo necesitas antes (tal vez en el elemento <title>?), deberías primero renderizar el menú y luego mostrarlo más tarde.

4 may 2011 16:33:14
Comentarios

hola Jan - me pregunto si hay alguna manera de crear un array de los elementos hijos de $menu_item->current. Intenté varias cosas pero no logro avanzar mucho..!

v3nt v3nt
19 jul 2011 14:00:24

lo conseguí con la ayuda de tu filtro - respuesta abajo. ¡Gracias!

v3nt v3nt
19 jul 2011 15:59:51

Jan Fabry / Intenté usar wpse16243_wp_nav_menu_objects para recuperar el ID del menú actual. Pero no es consistente. Cambiar entre la página de inicio y un elemento del menú no siempre me da el elemento correcto - como que "se retrasa". ¿Alguna sugerencia sobre cómo puedo recuperar el ID del menú actual?

Steven Steven
15 ago 2011 23:00:46

¿Hay alguna razón por la que antepongas el nombre de la función con wpse16243? Veo este tipo de nombre extraño bastante común y me pregunto de qué se trata. Aviso: novato en WordPress.

Stephen Watkins Stephen Watkins
28 ene 2012 17:32:32

@Steve: Simplemente un prefijo único: WordPress Stack Exchange pregunta número 16243. Si la gente copia directamente este código, no entrará en conflicto con otros plugins que puedan compartir los mismos nombres de función.

Jan Fabry Jan Fabry
29 ene 2012 12:47:12
0

Puedes usar wp_get_nav_menu_items(). Aquí tienes un ejemplo de 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) {
            // Verifica si este elemento del menú enlaza a la página actual
            if ($items[$k]->object_id == $post->ID) {
                $name = $items[$k]->title;
                break;
            }
        }

    }
    return $name;
}

Luego llama a la function con el nombre de la ubicación del menú de navegación que deseas usar:

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

echo $menu_name;
26 jul 2014 06:01:12
0
add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
    // Recorre los elementos del menú ordenados
    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;

    // Y 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" );

    // Recorre los resultados del menú
    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' " );

        // Recorre los elementos secundarios del menú
        foreach ( $myrowsb as $menu_itemb ) {

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

        }

    }

    return $pmIDs;
}
19 jul 2011 16:00:12
3

No estoy seguro de entender exactamente.

El texto "Museos que Apoyamos" se genera a partir de un Título de Entrada, Título de Página, Título de Categoría, etc. (o, si estás usando un Menú de Navegación Personalizado, podría ser un Título personalizado).

¿Qué estás intentando hacer con este texto? ¿Dónde intentas mostrarlo? Asumo que estás intentando mostrarlo en la Página de Índice de Categoría (ya que indicas que es current-menu-item)? Si es así, simplemente llama a <?php single_cat_title(); ?> para mostrar el Título de la Categoría.

Si necesitas información adicional de la categoría, puedes usar algo como:

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

Lo cual hace disponibles las siguientes variables:

$currentcat=>cat_ID // ID de la Categoría
$currentcat=>cat_name // Nombre de la Categoría (Igual que el Título)
$currentcat=>category_nicename // Slug de la Categoría
$currentcat=>category_description // Descripción de la Categoría
$currentcat=>category_count // Conteo de la Categoría (# de Entradas con esta Categoría)

Si estás en algún lugar diferente a la Página de Índice de Categoría, necesitarás pasar el $catid a estas funciones.

EDITADO:

Como indicaste que "Museos que Apoyamos" es un Título de Menú personalizado, el enfoque más fácil sería renombrar la Categoría de "Museos" a "Museos que Apoyamos" (nota: puedes dejar el slug, museums, sin cambios). Sin embargo, hacer esto significaría que "Museos que Apoyamos" se mostraría como el Título de Categoría dondequiera que se muestre en tu plantilla. Si eso es aceptable, entonces no hay problema.

De lo contrario, tendrás que usar algo como wp_get_nav_menu_items() (Referencia del Codex) para obtener el Título del elemento específico del menú.

3 may 2011 18:35:54
Comentarios

oye chip - es esta página ; http://bfami.modernactivity.co.uk/category/museum/ básicamente la categoría es 'museum' pero quiero mostrar 'MUSEUMS WE SUPPORT' que es la etiqueta de navegación (título personalizado) configurada en la página de menús. ¿Crees que es posible obtener eso de alguna manera?

v3nt v3nt
3 may 2011 18:44:29

Eso ayuda. Mira mi edición de la respuesta. Tienes un par de opciones: renombrar la Categoría, o usar wp_get_nav_menu_items().

Chip Bennett Chip Bennett
3 may 2011 19:11:53

gracias chip - al final simplemente cambié el título de la categoría! Solo pensé que habría una forma fácil de obtener la etiqueta del menú...

v3nt v3nt
3 may 2011 20:02:26