Как получить заголовок текущего пункта меню в виде переменной?
Это возможно сделать с помощью фильтра 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? Пробовал разные варианты, но пока безрезультатно..!

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

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

Вы можете использовать функцию 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;

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

Я не совсем уверен, что правильно понял.
Текст "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), чтобы получить заголовок для конкретного пункта меню.

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

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