Personalizarea structurii HTML pentru sub-meniu în Custom Nav Walker

19 mai 2014, 13:02:30
Vizualizări: 17.6K
Voturi: 1

Am configurat Custom Nav Walker și funcționează corect cu elementele principale ale meniului, afișându-le așa cum doresc.

Totuși, același HTML este aplicat și elementelor sub-menu, ceea ce nu este ceea ce vreau.

Încerc să obțin următorul stil pentru sub-menu:

<ul>
    <li>
        <h2 class="dropdown-text">Blog 1</h2>
    </li>
    <li>
        <h2 class="dropdown-text">Blog 2</h2>
    </li>
    <li>
        <h2 class="dropdown-text">Blog 3</h2>
    </li>
    <li>
        <h2 class="dropdown-text">Blog 4</h2>
    </li>
</ul>

Iată structura HTML pentru întreaga navigație:

<div class="postit-surround">
<a href="#">
    <div class="postit">
        <div class="pin">
            <img src="<?php echo get_template_directory_uri(); ?>/assets/drawing-pin.png" alt="Țintă" title="Țintă">
        </div>
        <div class="postit-title">
            <h1 class="nav-title-text">Produse</h1>
        </div>
        <div class="corner-peel">
            <img src="<?php echo get_template_directory_uri(); ?>/assets/corner-flick-cyan.png" alt="Colț îndoit" title="Colț îndoit">
        </div>
    </div>
</a>
<div class="navigation-dropdown">
    <ul>
        <li>
            <h2 class="dropdown-text">Produs 1</h2>
        </li>
        <li>
            <h2 class="dropdown-text">Produs 2</h2>
        </li>
        <li>
            <h2 class="dropdown-text">Produs 3</h2>
        </li>
        <li>
            <h2 class="dropdown-text">Produs 4</h2>
        </li>
        <li>
            <h2 class="dropdown-text">Produs 5</h2>
        </li>
    </ul>
</div>
</div>

Iată apelul HTML pentru wp_nav_menu:

<div class="navigation-container">
<?php 

$walker = new my_nav_walker;
wp_nav_menu( array( 'theme_location' => 'header-menu', 'menu' => 'ul', 'menu_class' => 'navigation', 'menu_id' => '', 'walker' => $walker ) ); 

?>
</div>

Iată construcția pentru Custom Walker HTML: (NOTĂ: Sunt începător în asta, așa că va fi cam haotic...)

class my_nav_walker extends Walker {
       function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

            $direct = get_template_directory_uri();

            $item_output = $args->before;
            $item_output .= '<div class="postit-surround">';
            $item_output .= '<a'. $attributes .'>';
            /** Acest filtru este documentat în wp-includes/post-template.php */

            $item_output .= '<div class="postit">
                                    <div class="pin">';
            $item_output .= '<img src="' . $direct . '/assets/drawing-pin.png" alt="Țintă" title="Țintă">
                                    </div>
                                    <div class="postit-title">
                                            <h1 class="nav-title-text">';
            $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;

            $item_output .= '</h1>
                            </div>
                                    <div class="corner-peel">
                                            <img src="' . $direct . '/assets/corner-flick-green.png" alt="Colț îndoit" title="Colț îndoit">
                                    </div>
                            </div>';
            $item_output .= '</a>';
            $item_output .= '</div>';
            $item_output .= $args->after;

        }    

} // Walker_Nav_Menu

Iată CSS-ul dacă este necesar:

Link PasteBin

Nu sunt sigur dacă construcția este corectă pentru a obține stilizarea separată pe care o doresc.

Ce recomandați?

Există alternative?

Critică constructivă asupra codului? (Nu fi prea dur! :P)

EDITARE -----:

Am făcut mai multe cercetări pentru a înțelege codul PHP și acum realizez unde începe definirea începutului și sfârșitului sub-meniu (cu start_lvl și end_lvl), dar încă nu înțeleg cum să separ ce cod merge la panourile de navigare părinte și care merge la sub-meniu.

Iată ce încerc să obțin cu afișarea navigării: http://jsfiddle.net/TPD5L/

15
Comentarii

"Critică constructivă asupra codului?". Foarte bine formulat. ;)

Pieter Goosen Pieter Goosen
19 mai 2014 13:10:26

@PieterGoosen Mulțumesc :) Chiar și eu am senzații neplăcute când văd codul, doar știe Dumnezeu ce gândesc majoritatea oamenilor care îl văd!

Mallander Mallander
19 mai 2014 13:13:59

ce metodă suprascrii? și nu cred că ai nevoie de un walker personalizat, poți obține același rezultat folosind funcția wp_nav_menu cu argumentele corespunzătoare, te rog postează codul complet inclusiv numele metodelor din walker-ul tău personalizat

MortalViews MortalViews
19 mai 2014 14:47:47

@MortalViews Întrebarea a fost editată pentru a include CODUL COMPLET al Custom Walker și apelul HTML wp_nav_menu.

Mallander Mallander
19 mai 2014 14:55:27

Bună, când extinzi clasa părinte, nu este necesar să incluzi nicio metodă pe care nu o suprascrii. verifică: exemplul general http://codex.wordpress.org/Class_Reference/Walker

MortalViews MortalViews
19 mai 2014 15:00:34

@MortalViews Poți să elaborezi? Nu înțeleg multe din acestea :)

Mallander Mallander
19 mai 2014 15:02:03

verifică exemplul din Meniul General @ http://codex.wordpress.org/Class_Reference/Walker și de asemenea http://codex.wordpress.org/Function_Reference/wp_nav_menu

MortalViews MortalViews
19 mai 2014 15:02:50

Mulțumesc pentru asta, dar nu înțeleg cum îmi permite să separ HTML-ul pentru elementele de nivel superior și sub-meniul.

Mallander Mallander
19 mai 2014 15:06:09

cum este structura ta de meniu? este? <ul><li><a>Servicii</a><ul clas='submenu'><li><a>Vânătoare de lupi</a></li><li><a>Vânătoare de cai</a></li></ul></li></ul> adică: ElementMeniuPrincipal->elemente sub-meniul

MortalViews MortalViews
19 mai 2014 15:22:51

O să adaug asta la întrebare

Mallander Mallander
19 mai 2014 15:27:26

@MortalViews Am adăugat.

Mallander Mallander
19 mai 2014 15:36:30

Te rog să te uiți la Walker-ul original și să elimini toate metodele din walker-ul tău care sunt identice cu cele din original. Când folosești extend ai un fel de relație părinte/copil. Nu e nevoie să duplici metodele care există deja în părinte decât dacă vrei să le modifici. După ce faci asta, o să mă uit din nou. Momentan este prea mult cod inutil.

s_ha_dum s_ha_dum
19 mai 2014 15:51:56

@s_ha_dum E mai bine acum? Am eliminat tot ce nu era necesar pentru generarea structurii HTML.

Mallander Mallander
19 mai 2014 15:55:54

Mai bine, dar ai eliminat prea mult. Trebuie să păstrezi definițiile metodelor pentru metodele pe care le folosești - partea cu function start_el(...).

s_ha_dum s_ha_dum
19 mai 2014 16:00:08

@s_ha_dum Acum ar trebui să fie în regulă. Totuși, când testez asta pe site-ul meu local, primesc: pastebin

Mallander Mallander
19 mai 2014 16:04:44
Arată celelalte 10 comentarii
Toate răspunsurile la întrebare 1
8

Soluție: Copiați și lipiți codul de mai jos în funcția dvs. și apoi în șablon folosiți

my_nav_menu($menu_location);  

//introduceți acest cod în fișierul de funcții

class MY_Menu_Walker_Ext extends Walker {  

    var $tree_type = array('post_type', 'taxonomy', 'custom');  
    var $db_fields = array('parent' => 'menu_item_parent', 'id' => 'db_id');  

    function start_el(&$output, $object, $depth = 0, $args = array(), $current_object_id = 0) {  
        $output .="<li><h2 class='dropdown-text'>{$object->title}</h2>";  
    }  

    function end_el(&$output, $object, $depth = 0, $args = array()) {  
        $output.='</li>';  
    }  

}  

class my_custom_menu {  

    public $menu;  
    public $menuItems;  
    public $parents;  
    public $walker;  

    public function __construct($menu_location) {  
        $this->setMenu($menu_location);  
        $this->getMenuItems();  
        $this->getParents();  

        $this->walker = new MY_Menu_Walker_Ext();  
    }  

    public function drawMenu() {  

    }  

    public function setMenu($menu_location) {  

        $this->menu = $this->getMenuByLocation($menu_location);  
    }  

    protected function getMenuByLocation($menu_location) {  
        $locations = get_nav_menu_locations();  

        $menu = null;  
        if ($locations && isset($locations[$menu_location])) {  
            $menu = wp_get_nav_menu_object($locations[$menu_location]);  
        }  

        return $menu;  
    }  

    public function get() {  

    }  

    public function getMenuItems() {  
        if ($this->menuItems)  
            return $this->menuItems;  
        $this->menuItems = wp_get_nav_menu_items($this->menu);  

        return $this->menuItems;  
    }  

    public function getParents() {  
        if ($this->parents)  
            return $this->parents;  
        $parents = array();  

        foreach ($this->menuItems as $item) {  
            if ($item->menu_item_parent == 0) {  
                array_push($parents, $item);  
            }  
        }  

        $this->parents = $parents;  
        return $this->parents;  
    }  

    public function getChild($parent_id) {  

        $childs = array();  

        foreach ($this->menuItems as $item) {  
            if ($parent_id == $item->menu_item_parent) {  
                $item->menu_item_parent = 0;  

                array_push($childs, $item);  
                foreach ($this->menuItems as $item1) {  
                    if ($item->ID == $item1->menu_item_parent) {  
                        array_push($childs, $item1);  
                    }  
                }  
            }  
        }  

        return $childs;  
    }  

    public function draw() {  
        echo "<div class='postit-surround'>";  

        foreach ($this->parents as $item) {  
            $this->displayParentHTML($item->title);  
            $this->drawChildren($this->getChild($item->ID));  
        }  
        echo "</div>";  
    }  

    public function displayParentHTML($title) {  
        ?>  
        <a href="#">  
            <div class="postit">  
                <div class="pin">  
                    <img src="<?php echo get_template_directory_uri(); ?>/assets/drawing-pin.png" alt="Țintă grafică" title="Țintă pentru fixare meniu">  
                </div>  
                <div class="postit-title">  
                    <h1 class="nav-title-text"><?php echo $title ?></h1>  
                </div>  
                <div class="corner-peel">  
                    <img src="<?php echo get_template_directory_uri(); ?>/assets/corner-flick-cyan.png" alt="Colț desprins" title="Efect colț desprins">  
                </div>  
            </div>  
        </a>  
        <?php  
    }  

    public function drawChildren($children) {  
        $defaults = array('menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '',  
            'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',  
            'depth' => 0, 'walker' => '', 'theme_location' => '');  
        $args = array(  
            'theme_location' => 'header-menu',  
            'container' => 'div',  
            'container_class' => 'navigation-dropdown',  
            'items_wrap' => '<ul >%3$s</ul>',  
            'depth' => 0,  
        );  
        $args = wp_parse_args($args, $defaults);  

        echo "<div class='navigation-dropdown'><ul>";  
        echo $this->walker->walk($children, 2, $args);  
        echo "</ul></div>";  
    }  

}  

function my_nav_menu($name = null) {  
    $myMenu = new my_custom_menu($name);  
    $myMenu->draw();  
}  
19 mai 2014 15:58:32
Comentarii

Mulțumesc, asta funcționează bine de unul singur, dar mă chinui să văd cum să integrez asta cu Walker-ul meu de nivel înalt pentru a obține structura generală menționată în întrebare?

Mallander Mallander
19 mai 2014 16:20:19

Nu te-am înțeles. Nu ai nevoie de un alt Walker de nivel înalt.

MortalViews MortalViews
19 mai 2014 16:22:10

înlocuiește clasa ta my_nav_walker cu aceasta. și în template-ul unde vrei să afișezi meniul de navigare. copiază și lipește codul din a doua secțiune. notă: output-ul va include și div-ul container

MortalViews MortalViews
19 mai 2014 16:23:24

Nu sunt sigur că înțelegi ce vreau să obțin cu navigația (am fost foarte neclar în întrebarea mea, îmi pare rău pentru asta) Uită-te la acest fiddle: http://jsfiddle.net/TPD5L/

Mallander Mallander
19 mai 2014 16:25:58

bine, partea de html pentru 'postit' ar trebui inclusă în șablon. <div post it>< codul post it></> Aici apelezi meniul de navigare </div>

MortalViews MortalViews
19 mai 2014 16:28:27

NU ar trebui să încerci să obții întregul html din wp_nav_menu. folosește wp_nav_menu doar pentru partea de 'meniu'. restul ar trebui inclus în codul șablonului, mă înțelegi?

MortalViews MortalViews
19 mai 2014 16:29:56

Deci, în loc să folosești wp_nav_menu pentru a obține elementele de meniu de nivel superior, folosește-l doar pentru a obține elementele copil?

Mallander Mallander
19 mai 2014 16:36:40

hai să continuăm această discuție în chat

MortalViews MortalViews
19 mai 2014 16:38:52
Arată celelalte 3 comentarii