Як отримати назву пункту поточного меню як змінну?


10

Чи можна отримати пункт поточного меню у вигляді змінної php?

Я перелічую категорії музеїв через пункт меню «музеї, які ми підтримуємо», тож я хотів би отримати «музеї, які ми підтримуємо», і десь їх відображати?

Будь-яка допомога вдячна!

Відповіді:


15

Це можливо, фільтруючи wp_nav_menu_objects, що найпростіше перевірити, який пункт є поточним пунктом меню, оскільки WordPress вже додав класи для вас .

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

Тепер ви можете використовувати цю нову глобальну змінну замість звичайного заголовка. Простий приклад:

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

Звичайно, це працює лише в тому випадку, якщо перед відображенням заголовка відобразиться меню. Якщо вам це потрібно раніше (можливо, в <title>елементі?), Слід спочатку відтворити меню, а потім відобразити його пізніше .


привіт Ян, просто цікаво, чи є спосіб створити масив дітей $ menu_item-> поточних елементів? Спробував кілька речей, але не дуже далеко ..!
v3nt

вдалося це за допомогою вашого фільтра - відповідь нижче. Ура!
v3nt

Ян Фабрі / Я намагався використовувати wpse16243_wp_nav_menu_objectsідентифікатор поточного меню. Але це не консистент. Перемикання між домашньою сторінкою та пунктом меню не дає мені завжди правильного пункту меню - воно на зразок "відстає". Будь-яка пропозиція щодо того, як я можу отримати поточний ідентифікатор меню?
Стівен

Чи є причина, з якою ви передмовте ім'я функції wpse16243? Я бачу цей дивний тип імені досить поширеним, і мені цікаво, що це все. Відмова: Wordpress noob.
Стівен Уоткінс

2
@Steve: Просто унікальний префікс: WordPress Stack Exchange question number 16243. Якщо люди безпосередньо копіюють цей код, він не буде конфліктувати з іншими плагінами, які можуть мати однакові імена функцій.
Ян Фабрі

4

Можна використовувати wp_get_nav_menu_items(). Ось зразок 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;
}

Потім викличте functionз назвою місця в меню нав ви хочете використовувати:

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

Я не впевнений, що точно слідую.

"Музеї, які ми підтримуємо" породжуються заголовком публікації, заголовком сторінки, заголовком категорії тощо (або, якщо ви користуєтеся користувацьким меню навігації, це може бути власний заголовок).

Що ви намагаєтесь зробити з цим текстом? Де ви намагаєтесь його відобразити? Я припускаю, що ви намагаєтесь відобразити його на сторінці індексу категорій (оскільки ви вказали, що це є current-menu-item)? Якщо так, просто зателефонуйте, <?php single_cat_title(); ?>щоб вивести заголовок категорії.

Якщо вам потрібна додаткова інформація про категорії, ви можете використовувати щось на зразок:

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

Що робить доступними такі змінні:

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

Якщо ви де - то інше , ніж Категорія Index Page, вам необхідно пройти $ CATID до цих функцій.

Редагувати:

Оскільки ви вказали, що "Музеї, які ми підтримуємо" - це власна назва меню, найпростішим підходом було б перейменувати Категорію з "Музеї" на "Музеї, які ми підтримуємо" (зауважте: ви можете залишити слизьку museumsбез змін). Однак це означатиме, що "Музеї, які ми підтримуємо" відображатиметься як назва категорії, де б вона не була виведена у вашому шаблоні. Якщо це прийнятно, то ніяких турбот.

В іншому випадку вам доведеться скористатися чимось на зразок wp_get_nav_menu_items()( Codex ref ), щоб схопити заголовок для конкретного пункту меню.


ей чіп - його ця сторінка; bfami.modernactivity.co.uk/category/museum, в основному кішка - "музей", але я хочу показати "МУЗЕЇ, ЩО МИ ПІДТРИМУЄМО", що є навігаційною міткою (власна назва), встановленою на сторінці меню. Думаєте, чи можна якось схопити це?
v3nt

Це допомагає. Дивіться мою відповідь редагувати. У вас є кілька варіантів: перейменуйте Категорію або використовуйте wp_get_nav_menu_items().
Чіп Беннетт

ура чіп - щойно змінив назву категорії в підсумку! Просто подумав, що буде простий спосіб схопити мітку меню ...
v3nt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.