Jak uzyskać tytuł bieżącego menu jako zmienną?


10

Czy można uzyskać bieżący element menu jako zmienną php?

Wymieniam kategorię muzeów poprzez pozycję menu „muzea, które wspieramy”, więc chciałbym dostać trochę „muzeów, które wspieramy” i wyświetlić je gdzieś?

Każda pomoc doceniona!

Odpowiedzi:


15

Jest to możliwe dzięki filtrowaniu wp_nav_menu_objects, które jest najłatwiejszym miejscem do sprawdzenia, który element jest bieżącym elementem menu, ponieważ WordPress już dla ciebie dodał klasy .

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

Możesz teraz używać tej nowej zmiennej globalnej zamiast normalnego tytułu. Prosty przykład:

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

Oczywiście działa to tylko wtedy, gdy wyświetlasz menu przed wyświetleniem tytułu. Jeśli potrzebujesz go wcześniej (może w <title>elemencie?), Powinieneś najpierw wyrenderować menu, a następnie wyświetlić je później .


cześć Jan - zastanawiam się, czy istnieje sposób na utworzenie tablicy elementów potomnych $ menu_item-> aktualnych przedmiotów? Próbowałem kilku rzeczy, ale nie za daleko ...!
v3nt

poradziłeś sobie z tym za pomocą swojego filtra - odpowiedz poniżej. Twoje zdrowie!
v3nt

Jan Fabry / Próbowałem użyć wpse16243_wp_nav_menu_objectsdo pobrania bieżącego identyfikatora menu. Ale to nie jest konsekwentne. Przełączanie między stroną główną a pozycją menu nie zawsze daje mi prawidłową pozycję menu - to rodzaj „opóźnień”. Wszelkie sugestie dotyczące tego, jak mogę pobrać bieżący identyfikator menu?
Steven

Czy istnieje powód, dla którego poprzedzasz nazwę funkcji wpse16243? Widzę ten dziwny typ nazwy dość powszechny i ​​zastanawiam się, o co w tym wszystkim chodzi. Uwaga: Wordpress noob.
Stephen Watkins

2
@Steve: Tylko wyjątkowy prefix: WordPress Stack Exchange question number 16243. Jeśli ludzie bezpośrednio skopiują ten kod, nie będzie konfliktował z innymi wtyczkami, które mogą mieć takie same nazwy funkcji.
Jan Fabry

4

Możesz użyć wp_get_nav_menu_items(). Oto próbka 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;
}

Następnie wywołujemy functionz nazwy lokalizacji w menu nawigacyjnym chcesz używać:

<?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

Nie jestem pewien, czy dokładnie podążam.

„Obsługiwane przez nas muzea” jest generowane przez tytuł postu, tytuł strony, tytuł kategorii itp. (Lub, jeśli korzystasz z niestandardowego menu nawigacji, może to być niestandardowy tytuł).

Co próbujesz zrobić z tym tekstem? Gdzie próbujesz to wyświetlić? Zakładam, że próbujesz wyświetlić go na stronie indeksu kategorii (skoro to zaznaczasz current-menu-item)? Jeśli tak, wystarczy zadzwonić, <?php single_cat_title(); ?>aby wyświetlić tytuł kategorii.

Jeśli potrzebujesz dodatkowych informacji o kategorii, możesz użyć czegoś takiego:

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

Który udostępnia następujące zmienne:

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

Jeśli jesteś gdzieś inny niż kategoria Indeks Page, musisz zdać $ CatID do tych funkcji.

EDYTOWAĆ:

Ponieważ zaznaczyłeś, że „Muzea, które obsługujemy” to niestandardowy tytuł menu, najłatwiejszym sposobem byłoby zmienić nazwę kategorii z „Muzea” na „Muzea, które obsługujemy” (uwaga: możesz pozostawić ślimak museumsbez zmian). Oznaczałoby to jednak, że „Obsługiwane przez nas muzea” będzie wyświetlane jako tytuł kategorii, gdziekolwiek indziej może zostać wyświetlony w szablonie. Jeśli jest to do zaakceptowania, nie martw się.

W przeciwnym razie będziesz musiał użyć czegoś takiego jak wp_get_nav_menu_items()( Kodeks odniesienia ), aby zdobyć tytuł dla konkretnego elementu menu.


hej chip - to jest ta strona; bfami.modernactivity.co.uk/category/museum, więc w zasadzie kot to „muzeum”, ale chcę pokazać „MUZEA WSPIERAMY”, która jest etykietą nawigacyjną (niestandardowy tytuł) ustawioną na stronie menu. Myślisz, że można to jakoś złapać?
v3nt

To pomaga. Zobacz moją odpowiedź edytuj. Masz kilka opcji: zmień nazwę kategorii lub użyj wp_get_nav_menu_items().
Chip Bennett

cheers chip - w końcu zmieniłem tytuł kategorii! Pomyślałem, że będzie łatwy sposób na
zdobycie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.