Как получить заголовок текущего элемента меню как переменную?

10

Возможно ли получить current-menu-item как переменную php?

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

Любая помощь приветствуется!

v3nt
источник

Ответы:

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-> current items? Пробовал несколько вещей, но не очень далеко ..!
3
удалось это с помощью вашего фильтра - ответьте ниже. Ура!
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;
}
v3nt
источник
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()( ссылка на Кодекс ), чтобы получить заголовок для определенного пункта меню.

Чип Беннетт
источник
эй чип - это эта страница; bfami.modernactivity.co.uk/category/museum, так что в основном кошка - это «музей», но я хочу показать «MUSEUMS WE SUPPORT», которая представляет собой навигационную метку (пользовательский заголовок), установленную на странице меню. Думаешь, можно как-нибудь это схватить?
v3nt
Что помогает. Смотрите мой ответ изменить. У вас есть пара вариантов: переименовать категорию или использовать wp_get_nav_menu_items().
Чип Беннетт
ура чип - просто поменял название категории в итоге! Просто подумал, что будет простой способ получить ярлык меню ...
v3nt