Добавить дочерние страницы родителя в навигационную панель PHP
Я использую функцию в пользовательской теме, которая автоматически заполняет навигацию всеми дочерними страницами каждого родителя. Я нашел код на этом сайте
Это хорошо работает, но единственное, что эта функция не делает для меня, - это упорядочивать страницы в порядке, установленном в разделе Страницы в Wordpress. Я думаю, что мне нужно использовать что-то вроде "sort_column=menu_order&title_li=&child_of=" где-то в следующем коде, но я не могу ни за что в жизни разобраться куда?
/**
* auto_child_page_menu
*
* class to add top level page menu items all child pages on the fly
* @author Ohad Raz <[email protected]>
*/
class auto_child_page_menu
{
/**
* class constructor
* @author Ohad Raz <[email protected]>
* @param array $args
* @return void
*/
function __construct($args = array()){
add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
}
/**
* the magic function that adds the child pages
* @author Ohad Raz <[email protected]>
* @param array $items
* @return array
*/
function on_the_fly($items) {
global $post;
$tmp = array();
foreach ($items as $key => $i) {
$tmp[] = $i;
//if not page move on
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//if not parent page move on
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id) );
foreach ((array)$children as $c) {
//set parent menu
$c->menu_item_parent = $i->ID;
$c->object_id = $c->ID;
$c->object = 'page';
$c->type = 'post_type';
$c->type_label = 'Page';
$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; //probbably not right
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();
1
2 answers
В конце концов я нашел решение для всех, у кого есть такая же проблема:
/**
* auto_child_page_menu
*
* class to add top level page menu items all child pages on the fly
* @author Ohad Raz <[email protected]>
*/
class auto_child_page_menu
{
/**
* class constructor
* @author Ohad Raz <[email protected]>
* @param array $args
* @return void
*/
function __construct($args = array()){
add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
}
/**
* the magic function that adds the child pages
* @author Ohad Raz <[email protected]>
* @param array $items
* @return array
*/
function on_the_fly($items) {
global $post;
$tmp = array();
foreach ($items as $key => $i) {
$tmp[] = $i;
//if not page move on
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//if not parent page move on
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id, 'sort_column' => 'menu_order') );
foreach ((array)$children as $c) {
//set parent menu
$c->menu_item_parent = $i->ID;
$c->object_id = $c->ID;
$c->object = 'page';
$c->type = 'post_type';
$c->type_label = 'Page';
$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; //probbably not right
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();
1
Author: Acevandermeer, 2016-08-08 10:52:59
$items
которые передаются в эту функцию, уже отсортированы (см. здесь ). Поэтому вам придется заказать их еще раз, самостоятельно, прежде чем return $tmp;
0
Author: Krzysztof Grabania, 2016-07-29 12:27:05