Adăugare automată a paginilor copil în meniul de navigare

27 mai 2013, 08:17:06
Vizualizări: 13.9K
Voturi: 5

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?

4
Comentarii

Singura modalitate pe care o știu este atunci când meniul tău personalizat este gol, WordPress îl va completa cu toate paginile existente. Odată ce începi să adaugi pagini în interiorul acestuia, nu va continua automat.

Alexandre Lavoie Alexandre Lavoie
27 mai 2013 08:22:24

Se pare că ai o problemă cu configurarea unui component software. Te rugăm să contactezi furnizorul acelui component pentru opțiunile tale de suport, acest site este despre întrebări concrete de programare, nu despre cum să folosești un API specific unui furnizor.

hakre hakre
27 mai 2013 09:40:29

Mulțumesc pentru migrare, Toscho - nu știam că există acest forum.

Desmond Desmond
28 mai 2013 03:59:20

cod pentru meniu cu submeniu din pagini și pagini copil. Poate te ajută să construiești meniul din pagini copil și pagini copil în mod programatic.

Core Core
28 mai 2013 09:37:49
Toate răspunsurile la întrebare 1
6
14

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();
27 mai 2013 12:05:41
Comentarii

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

Desmond Desmond
29 mai 2013 14:13:04

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?

1GR3 1GR3
29 mai 2014 19:14:16

Sunt de acord cu @1GR3, cum folosim asta?

Spedwards Spedwards
1 mar. 2015 07:16:37

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

David Shaw David Shaw
23 ian. 2018 17:10:30

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.

Joe Bloggs Joe Bloggs
12 mai 2019 04:33:30

Î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';

Shad Gagnon Shad Gagnon
15 apr. 2022 01:00:33
Arată celelalte 1 comentarii