Personalizarea structurii HTML pentru sub-meniu în Custom Nav Walker
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:
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/
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();
}

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?

î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

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/

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

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?

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?

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