Adăugare automată a paginilor copil în meniul de navigare
Am creat un meniu personalizat în WordPress care conține linkuri către articole și pagini. Îl adaug în header folosind următorul cod:
<?php
wp_nav_menu(
array(
'theme_location' => 'primary',
'depth' => 0,
'menu_class' => 'nav-menu',
)
);
?>
Problema mea este că, dacă adaug o pagină copil la cele de nivel superior din meniu, acestea nu apar automat ca sublinkuri în navigație. Știu că le pot crea manual de fiecare dată reconstruind meniul, dar aș dori să pot pur și simplu să adaug o pagină copil în secțiunea de pagini și să apară în navigație fără a fi nevoie să merg în meniu și să o construiesc și acolo, dacă are sens.
Am încercat să folosesc depth => 0
, dar nu a funcționat. Există vreo modalitate de a afișa paginile copil fără a fi nevoie să le construiești în meniul personalizat?
așa se face:
/**
* auto_child_page_menu
*
* clasă pentru a adăuga automat elemente de meniu pentru toate paginile copil în meniul principal
* @author Ohad Raz <admin@bainternet.info>
*/
class auto_child_page_menu
{
/**
* constructorul clasei
* @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'));
}
/**
* funcția magică care adaugă paginile copil
* @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;
//dacă nu este pagină, treci mai departe
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//dacă nu este pagină părinte, treci mai departe
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id) );
foreach ((array)$children as $c) {
//setează meniul părinte
$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; //probabil nu este corect
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();

Funcționează perfect, mulțumesc mult pentru ajutor, Bainternet! Apreciez foarte mult.

Scuze că întreb, dar cum ar trebui să folosesc asta? să-l lipesc în functions.php și să-l apelez din locul unde ar trebui să apară meniul?

Da, pur și simplu adaugă asta în fișierul functions.php și apasă salvare!

Bun efort, dar asta NU FUNCȚIONEAZĂ! Adaugă TOATE paginile copil sub părintele de nivel superior ca și cum ar fi copii de prim nivel. Paginile copil de nivelul 2 și 3 sunt de asemenea adăugate sub părintele de nivel superior. Mi-a distrus complet navigația.

Îmi pare rău, nu pot posta un răspuns curat pentru că nu am suficiente puncte de reputație pe acest site. Pentru cei interesați, am adăugat niște cod pentru a îmbunătăți această funcție.
Am adăugat o altă condiție pentru a adăuga clasă elementului de listă părinte, de exemplu: if (count($children)>0) $i->classes[] = 'menu-item-has-children';
