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

3 мая 2011 г., 17:48:43
Просмотры: 33.6K
Голосов: 10

Возможно ли получить текущий пункт меню (current-menu-item) в виде PHP переменной?

Я отображаю категорию музеев через пункт меню 'museums we support', поэтому хотел бы получить часть 'museums we support' и отобразить её где-нибудь?

Буду благодарен за любую помощь!

0
Все ответы на вопрос 4
5
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>), вам следует сначала отрендерить меню, а затем отобразить его позже.

4 мая 2011 г. 16:33:14
Комментарии

Привет, Ян - интересно, есть ли способ создать массив дочерних элементов $menu_item->current? Пробовал разные варианты, но пока безрезультатно..!

v3nt v3nt
19 июл. 2011 г. 14:00:24

справился с помощью твоего фильтра - ответ ниже. Спасибо!

v3nt v3nt
19 июл. 2011 г. 15:59:51

Jan Fabry / Я пытался использовать wpse16243_wp_nav_menu_objects для получения ID текущего меню. Но это работает нестабильно. При переключении между главной страницей и пунктом меню не всегда возвращается правильный ID меню - есть как бы "задержка". Есть идеи, как можно получить ID текущего меню?

Steven Steven
15 авг. 2011 г. 23:00:46

Есть ли причина, по которой вы добавляете префикс wpse16243 к имени функции? Я довольно часто встречаю такие странные имена и интересуюсь, что они означают. Примечание: новичок в WordPress.

Stephen Watkins Stephen Watkins
28 янв. 2012 г. 17:32:32

@Steve: Это просто уникальный префикс: WordPress Stack Exchange, вопрос номер 16243. Если люди напрямую копируют этот код, это предотвратит конфликты с другими плагинами, которые могут использовать такие же имена функций.

Jan Fabry Jan Fabry
29 янв. 2012 г. 12:47:12
0

Вы можете использовать функцию wp_get_nav_menu_items(). Вот пример функции:

<?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) {
            // Проверяем, ссылается ли этот пункт меню на текущую страницу
            if ($items[$k]->object_id == $post->ID) {
                $name = $items[$k]->title;
                break;
            }
        }

    }
    return $name;
}

Затем вызовите функцию, указав название области для меню навигации, которое вы хотите использовать:

<?php
$menu_name = my_get_menu_item_name( 'NAV_MENU_LOCATION_NAME' ); // например, 'primary'

echo $menu_name;
26 июл. 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 )
{
    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;
}
19 июл. 2011 г. 16:00:12
3

Я не совсем уверен, что правильно понял.

Текст "Museums We Support" (Музеи, которые мы поддерживаем) генерируется из заголовка записи, заголовка страницы, заголовка категории и т.д. (или, если вы используете пользовательское меню навигации, это может быть пользовательский заголовок).

Что вы пытаетесь сделать с этим текстом? Где вы хотите его отобразить? Я предполагаю, что вы пытаетесь отобразить его на странице архива категории (поскольку вы указываете, что это current-menu-item)? Если так, просто используйте <?php single_cat_title(); ?> для вывода заголовка категории.

Если вам нужна дополнительная информация о категории, вы можете использовать что-то вроде:

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

Что сделает доступными следующие переменные:

$currentcat=>cat_ID // ID категории
$currentcat=>cat_name // Название категории (то же, что и заголовок)
$currentcat=>category_nicename // Слаг категории
$currentcat=>category_description // Описание категории
$currentcat=>category_count // Количество записей в категории

Если вы находитесь не на странице архива категории, вам нужно будет передать $catid в эти функции.

РЕДАКТИРОВАНИЕ:

Поскольку вы указали, что "Museums We Support" — это пользовательский заголовок меню, самый простой подход — это переименовать категорию с "Museums" (Музеи) на "Museums We Support" (Музеи, которые мы поддерживаем) (примечание: вы можете оставить слаг museums без изменений). Однако это означает, что "Museums We Support" будет отображаться как заголовок категории везде, где он выводится в вашем шаблоне. Если это приемлемо, то проблем нет.

В противном случае вам придётся использовать что-то вроде wp_get_nav_menu_items() (Ссылка на Codex), чтобы получить заголовок для конкретного пункта меню.

3 мая 2011 г. 18:35:54
Комментарии

эй, chip - вот эта страница: http://bfami.modernactivity.co.uk/category/museum/. В общем, категория называется 'museum', но я хочу отображать 'MUSEUMS WE SUPPORT' (музеи, которые мы поддерживаем) — это метка навигации (пользовательский заголовок), заданный на странице меню. Думаешь, есть способ как-то это получить?

v3nt v3nt
3 мая 2011 г. 18:44:29

Это проясняет ситуацию. Смотри мою правку в ответе. У тебя есть пара вариантов: переименовать категорию или использовать wp_get_nav_menu_items().

Chip Bennett Chip Bennett
3 мая 2011 г. 19:11:53

спасибо, chip — в итоге просто изменил название категории! Просто думал, что есть простой способ получить метку меню...

v3nt v3nt
3 мая 2011 г. 20:02:26