Автоматическое добавление дочерних страниц в навигационное меню
Я создал пользовательское меню в WordPress, которое содержит ссылки на записи и страницы. Добавляю его в шапку с помощью этого кода:
<?php
wp_nav_menu(
array(
'theme_location' => 'primary',
'depth' => 0,
'menu_class' => 'nav-menu',
)
);
?>
Проблема в том, что когда я добавляю дочернюю страницу к верхнеуровневым страницам в меню, они не появляются автоматически в виде подпунктов навигации. Я знаю, что могу создавать их вручную каждый раз, перестраивая меню, но хотелось бы просто добавлять дочернюю страницу в разделе страниц, чтобы она автоматически появлялась в меню без необходимости вручную добавлять её туда.
Я пробовал использовать depth => 0
, но это не сработало. Есть ли способ отображать дочерние страницы без необходимости добавлять их в пользовательское меню вручную?
вот как:
/**
* auto_child_page_menu
*
* класс для автоматического добавления дочерних страниц в меню верхнего уровня
* @author Ohad Raz <admin@bainternet.info>
*/
class auto_child_page_menu
{
/**
* конструктор класса
* @author Ohad Raz <admin@bainternet.info>
* @param array $args
* @return void
*/
function __construct($args = array()){
add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
}
/**
* магическая функция, добавляющая дочерние страницы
* @author Ohad Raz <admin@bainternet.info>
* @param array $items
* @return array
*/
function on_the_fly($items) {
global $post;
$tmp = array();
foreach ($items as $key => $i) {
$tmp[] = $i;
//если не страница, пропускаем
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//если не родительская страница, пропускаем
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id) );
foreach ((array)$children as $c) {
//устанавливаем родительское меню
$c->menu_item_parent = $i->ID;
$c->object_id = $c->ID;
$c->object = 'page';
$c->type = 'post_type';
$c->type_label = 'Страница';
$c->url = get_permalink( $c->ID);
$c->title = $c->post_title;
$c->target = '';
$c->attr_title = '';
$c->description = '';
$c->classes = array('','menu-item','menu-item-type-post_type','menu-item-object-page');
$c->xfn = '';
$c->current = ($post->ID == $c->ID)? true: false;
$c->current_item_ancestor = ($post->ID == $c->post_parent)? true: false; //вероятно не совсем правильно
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();

Это работает отлично, большое спасибо за вашу помощь, Bainternet! Очень признателен.

Извините за вопрос, но как мне это использовать? Вставить в functions.php и вызывать из места, где должно быть меню?

Да, просто добавьте это в файл functions.php и нажмите сохранить!

Хорошая попытка, но это НЕ РАБОТАЕТ! Это добавляет ВСЕ дочерние страницы под родительским элементом верхнего уровня, как если бы они были дочерними элементами 1-го уровня. Дочерние страницы 2-го и 3-го уровня также добавляются под родительским элементом верхнего уровня. Полностью испортило мою навигацию.

Извините, я не могу опубликовать чистый ответ, потому что у меня недостаточно репутации на этом сайте. Для заинтересованных людей я добавил немного кода для улучшения этой функции.
Я добавил еще одно условие для добавления класса к родительскому элементу списка, например: if (count($children)>0) $i->classes[] = 'menu-item-has-children';
