एक कस्टम वॉकर का उपयोग करते हुए, start_el()
विधि की पहुंच है$depth
परम : जब यह 0
एक शीर्ष एक है, तो हम इस जानकारी का उपयोग आंतरिक काउंटर बनाए रखने के लिए कर सकते हैं।
जब काउंटर एक सीमा तक पहुंच जाता है, तो हम उपयोग कर सकते हैं DOMDocument
पूर्ण HTML आउटपुट से प्राप्त करने के लिए बस अंतिम तत्व जोड़ा गया है, इसे एक सबमेनू में लपेटें और इसे फिर से HTML में जोड़ें।
संपादित करें
जब तत्वों की संख्या ठीक उसी संख्या होती है जिसकी हमें आवश्यकता होती है + 1, उदाहरण के लिए हमें 5 तत्वों की आवश्यकता होती है और मेनू में 6 होते हैं, तो मेनू को विभाजित करने का कोई मतलब नहीं होता है, क्योंकि तत्व 6 तरह से होंगे। यह पता करने के लिए कोड संपादित किया गया था।
यहाँ कोड है:
class SplitMenuWalker extends Walker_Nav_Menu {
private $split_at;
private $button;
private $count = 0;
private $wrappedOutput;
private $replaceTarget;
private $wrapped = false;
private $toSplit = false;
public function __construct($split_at = 5, $button = '<a href="#">…</a>') {
$this->split_at = $split_at;
$this->button = $button;
}
public function walk($elements, $max_depth) {
$args = array_slice(func_get_args(), 2);
$output = parent::walk($elements, $max_depth, reset($args));
return $this->toSplit ? $output.'</ul></li>' : $output;
}
public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0 ) {
$this->count += $depth === 0 ? 1 : 0;
parent::start_el($output, $item, $depth, $args, $id);
if (($this->count === $this->split_at) && ! $this->wrapped) {
// split at number has been reached generate and store wrapped output
$this->wrapped = true;
$this->replaceTarget = $output;
$this->wrappedOutput = $this->wrappedOutput($output);
} elseif(($this->count === $this->split_at + 1) && ! $this->toSplit) {
// split at number has been exceeded, replace regular with wrapped output
$this->toSplit = true;
$output = str_replace($this->replaceTarget, $this->wrappedOutput, $output);
}
}
private function wrappedOutput($output) {
$dom = new DOMDocument;
$dom->loadHTML($output.'</li>');
$lis = $dom->getElementsByTagName('li');
$last = trim(substr($dom->saveHTML($lis->item($lis->length-1)), 0, -5));
// remove last li
$wrappedOutput = substr(trim($output), 0, -1 * strlen($last));
$classes = array(
'menu-item',
'menu-item-type-custom',
'menu-item-object-custom',
'menu-item-has-children',
'menu-item-split-wrapper'
);
// add wrap li element
$wrappedOutput .= '<li class="'.implode(' ', $classes).'">';
// add the "more" link
$wrappedOutput .= $this->button;
// add the last item wrapped in a submenu and return
return $wrappedOutput . '<ul class="sub-menu">'. $last;
}
}
उपयोग बहुत सरल है:
// by default make visible 5 elements
wp_nav_menu(array('menu' => 'my_menu', 'walker' => new SplitMenuWalker()));
// let's make visible 2 elements
wp_nav_menu(array('menu' => 'another_menu', 'walker' => new SplitMenuWalker(2)));
// customize the link to click/over to see wrapped items
wp_nav_menu(array(
'menu' => 'another_menu',
'walker' => new SplitMenuWalker(5, '<a href="#">more...</a>')
));
Walker_Nav_Menu
और कोडेक्स में एक उदाहरण है । आपका क्या मतलब है "मुझे नहीं पता कि वॉकर कैसे बनाया जाए"?