একটি কাস্টম ওয়াকার ব্যবহার করে, start_el()
পদ্ধতিটিতে প্যারামের অ্যাক্সেস রয়েছে $depth
: যখন 0
এগারটি হয় তখন শীর্ষস্থানীয় হয় এবং আমরা অভ্যন্তরীণ কাউন্টার বজায় রাখতে এই তথ্যটি ব্যবহার করতে পারি।
যখন কাউন্টারটি একটি সীমাতে পৌঁছে যায় তখন আমরা DOMDocument
সম্পূর্ণ HTML আউটপুট থেকে কেবলমাত্র সর্বশেষ উপাদানটি যুক্ত করতে ব্যবহার করতে পারি, এটি একটি সাবমেনুতে মুড়ে এবং এটি আবার HTML এ যুক্ত করতে পারি add
সম্পাদন করা
যখন উপাদানগুলির সংখ্যা হ'ল আমাদের প্রয়োজনীয় 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
এবং কোডেক্সে একটি উদাহরণ রয়েছে । "আমি কিভাবে ওয়াকার তৈরি করতে জানি না" এর অর্থ কী?