¿Cómo obtener el título del elemento del menú actual como variable?

10

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

Estoy enumerando la categoría museos a través del elemento del menú 'museos que apoyamos', así que me gustaría obtener el bit 'museos que apoyamos' y mostrarlo en algún lugar.

Cualquier ayuda apreciada!

v3nt
fuente

Respuestas:

15

Esto es posible mediante el filtrado wp_nav_menu_objects, que es el lugar más fácil para verificar qué elemento es el elemento del menú actual, porque WordPress ya agregó las clases por usted .

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 puede 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 visualiza el menú antes de mostrar el título. Si lo necesita antes (¿tal vez en el <title>elemento?), Primero debe renderizar el menú y luego mostrarlo más tarde .

Jan Fabry
fuente
hola Jan: ¿me pregunto si hay una manera de crear una matriz de $ menu_item-> hijos de elementos actuales? Intenté varias cosas pero no llegué muy lejos ...!
v3nt
logró esto con la ayuda de su filtro: responda a continuación. ¡Salud!
v3nt
Jan Fabry / Intenté usar wpse16243_wp_nav_menu_objectspara recuperar la ID del menú actual. Pero no es consistente. Cambiar entre la página de inicio y un elemento de menú no siempre me da el elemento de menú correcto, es como "retrasos". ¿Alguna sugerencia sobre cómo puedo recuperar la ID del menú actual?
Steven
¿Hay alguna razón por la que prefacio el nombre de la función con wpse16243? Veo este extraño tipo de nombre bastante común y me pregunto de qué se trata. Descargo de responsabilidad: Wordpress noob.
Stephen Watkins
2
@Steve: Sólo un prefijo único: WordPress Stack Exchange question number 16243. Si las personas copian directamente este código, no entrará en conflicto con otros complementos que puedan compartir los mismos nombres de funciones.
Jan Fabry
4

Puedes usar wp_get_nav_menu_items(). Aquí hay una muestra 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;
}

Luego llame al functioncon el nombre de la ubicación del menú de navegación que desea utilizar:

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

echo $menu_name;
Giraldi
fuente
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
fuente
0

No estoy seguro de seguir exactamente.

Los "Museos que respaldamos" se generan mediante un Título de publicación, Título de página, Título de categoría, etc. (o, si está utilizando un Menú de navegación personalizado, podría ser un Título personalizado).

¿Qué intentas hacer con este texto? ¿Dónde intentas mostrarlo? ¿Supongo que está tratando de mostrarlo en la página de índice de categoría (ya que indica que es current-menu-item)? Si es así, simplemente llame <?php single_cat_title(); ?>para generar el Título de categoría.

Si necesita información de categoría adicional, puede usar algo como:

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

Lo que pone a disposición las siguientes variables:

$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 estás en un lugar otro que la categoría Índice de Página, que tendrá que pasar el $ catid a estas funciones.

EDITAR:

Dado que indicó que "Museos que respaldamos" es un título de menú personalizado, el enfoque más sencillo sería cambiar el nombre de la categoría de "Museos" a "Museos que respaldamos" (nota: puede dejar la babosa museums, sin cambios). Sin embargo, hacerlo significaría que los "Museos que apoyamos" se mostrarán como el Título de la categoría en cualquier otro lugar en el que pueda aparecer en su plantilla. Si eso es aceptable, entonces no se preocupe.

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

Chip Bennett
fuente
hola chip - es esta página; bfami.modernactivity.co.uk/category/museum, así que básicamente el gato es 'museo' pero quiero mostrar 'MUSEOS QUE APOYAMOS', que es la etiqueta de navegación (título personalizado) establecida en la página de menús. ¿Crees que es posible agarrar eso de alguna manera?
v3nt
Eso ayuda. Ver mi respuesta editar. Tiene un par de opciones: cambie el nombre de la categoría o use wp_get_nav_menu_items().
Chip Bennett
cheers chip: ¡acabo de cambiar el título de categoría al final! Solo pensé que habría una manera fácil de tomar la etiqueta del menú ...
v3nt