WP_Nav_Walker 扩展,需要知道子菜单项的数量
WP_Nav_Walker extending, need to know count of Sub Menu Items
我这里有 2 个不同的显示器。 1 个用于移动设备,另一个用于桌面设备。我需要为菜单中的 1 个菜单项(最后 1 个)输出不同的 html。例如,给定以下菜单结构:
- Menu Item 1
-- Child 1
-- Child 2
-- Child 3
- Menu Item 2
-- Child 1
-- Child 2
-- Child 3
-- Child 4
- Menu Item 3
-- Child 1
-- Child 2
-- Child 3
-- Child 4
-- Child 5
-- Child 6
我需要能够为桌面输出以下结构:
<ul>
<li>Menu Item 1
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
</ul>
</li>
<li>Menu Item 2
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
<li>Child 4</li>
</ul>
</li>
<li>Menu Item 3
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
</ul>
</li>
<li>
<ul>
<li>Child 4</li>
<li>Child 5</li>
<li>Child 6</li>
</ul>
</li>
</ul>
具有 $depth === 0
的最后一个父菜单项需要分成两半分成单独的项目。但在移动端显示时,它不需要分成两半,它应该适合移动显示。
所以我有 2 个不同的 WP_Nav_Walker
扩展 类。 1 个用于移动设备,另一个用于处理菜单的桌面设备,但我面临的问题是如何获取子菜单项的总数。我知道如何使用 $args->has_children
知道菜单是否有子项,但如何获得子项的总数??
我创建了一个变量来了解我在 end_el
函数中的哪个子菜单项:
class Custom_Nav_Walker extends Walker_Nav_Menu {
function __construct() {
$this->boxitem_index = 0;
}
public function start_lvl(&$output, $depth = 0, $args = array())
{
if ($depth === 0 && $this->menu_type == 'header')
{
echo '<pre>', var_dump($item), '</pre>';
}
}
}
我还设置了一个名为 menu_type
的自定义 属性,它在附加到此处最后一个菜单的 start_el
函数中设置,因此我能够知道它是我想要的菜单。
基本上,我需要将它分成两半,而不是 3,但我不知道一半是多少。当然,我不想对最后一项执行 if 语句。因此,了解最后一个父菜单有多少项 $depth === 1 会有所帮助。这可能吗?
我为 $item
得到的输出是这样的:
object(WP_Post)#723 (40) {
["ID"]=>
int(73)
["post_author"]=>
string(1) "1"
["post_date"]=>
string(19) "2016-07-14 18:09:44"
["post_date_gmt"]=>
string(19) "2016-07-14 18:09:44"
["post_content"]=>
string(0) ""
["post_title"]=>
string(11) "Quick Links"
["post_excerpt"]=>
string(0) ""
["post_status"]=>
string(7) "publish"
["comment_status"]=>
string(6) "closed"
["ping_status"]=>
string(6) "closed"
["post_password"]=>
string(0) ""
["post_name"]=>
string(13) "quick-links-3"
["to_ping"]=>
string(0) ""
["pinged"]=>
string(0) ""
["post_modified"]=>
string(19) "2016-07-21 17:12:08"
["post_modified_gmt"]=>
string(19) "2016-07-21 17:12:08"
["post_content_filtered"]=>
string(0) ""
["post_parent"]=>
int(0)
["guid"]=>
string(30) "http://0b90b21a.ngrok.io/?p=73"
["menu_order"]=>
int(12)
["post_type"]=>
string(13) "nav_menu_item"
["post_mime_type"]=>
string(0) ""
["comment_count"]=>
string(1) "0"
["filter"]=>
string(3) "raw"
["db_id"]=>
int(73)
["menu_item_parent"]=>
string(1) "0"
["object_id"]=>
string(2) "73"
["object"]=>
string(6) "custom"
["type"]=>
string(6) "custom"
["type_label"]=>
string(11) "Custom Link"
["title"]=>
string(11) "Quick Links"
["url"]=>
string(0) ""
["target"]=>
string(0) ""
["attr_title"]=>
string(0) ""
["description"]=>
string(0) ""
["classes"]=>
array(5) {
[0]=>
string(0) ""
[1]=>
string(9) "menu-item"
[2]=>
string(21) "menu-item-type-custom"
[3]=>
string(23) "menu-item-object-custom"
[4]=>
string(22) "menu-item-has-children"
}
["xfn"]=>
string(0) ""
["current"]=>
bool(false)
["current_item_ancestor"]=>
bool(false)
["current_item_parent"]=>
bool(false)
}
您可以使用此筛选器函数为每个项目获取两个额外的属性 _children_count
和 _parent_children_count
,稍后您可以在菜单步行器中对其进行评估:
function my_wp_nav_menu_objects_filter($sorted_menu_items) {
foreach($sorted_menu_items as &$item) {
$item->_children_count = 0;
for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) {
if($sorted_menu_items[$i]->menu_item_parent == $item->ID) {
$item->_children_count++;
}
}
}
foreach($sorted_menu_items as &$item) {
$item->_parent_children_count = 0;
for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) {
if($item->menu_item_parent == $sorted_menu_items[$i]->ID) {
$item->_parent_children_count = $sorted_menu_items[$i]->_children_count;
break;
}
}
}
unset($item);
return $sorted_menu_items;
}
add_filter('wp_nav_menu_objects', 'my_wp_nav_menu_objects_filter' );
奇怪的是,$sorted_menu_items 数组似乎是从 从 1.
开始的数字索引
在新属性前添加 _
作为伪命名空间,以避免与未来可能的官方属性发生冲突。
我这里有 2 个不同的显示器。 1 个用于移动设备,另一个用于桌面设备。我需要为菜单中的 1 个菜单项(最后 1 个)输出不同的 html。例如,给定以下菜单结构:
- Menu Item 1
-- Child 1
-- Child 2
-- Child 3
- Menu Item 2
-- Child 1
-- Child 2
-- Child 3
-- Child 4
- Menu Item 3
-- Child 1
-- Child 2
-- Child 3
-- Child 4
-- Child 5
-- Child 6
我需要能够为桌面输出以下结构:
<ul>
<li>Menu Item 1
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
</ul>
</li>
<li>Menu Item 2
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
<li>Child 4</li>
</ul>
</li>
<li>Menu Item 3
<ul>
<li>Child 1</li>
<li>Child 2</li>
<li>Child 3</li>
</ul>
</li>
<li>
<ul>
<li>Child 4</li>
<li>Child 5</li>
<li>Child 6</li>
</ul>
</li>
</ul>
具有 $depth === 0
的最后一个父菜单项需要分成两半分成单独的项目。但在移动端显示时,它不需要分成两半,它应该适合移动显示。
所以我有 2 个不同的 WP_Nav_Walker
扩展 类。 1 个用于移动设备,另一个用于处理菜单的桌面设备,但我面临的问题是如何获取子菜单项的总数。我知道如何使用 $args->has_children
知道菜单是否有子项,但如何获得子项的总数??
我创建了一个变量来了解我在 end_el
函数中的哪个子菜单项:
class Custom_Nav_Walker extends Walker_Nav_Menu {
function __construct() {
$this->boxitem_index = 0;
}
public function start_lvl(&$output, $depth = 0, $args = array())
{
if ($depth === 0 && $this->menu_type == 'header')
{
echo '<pre>', var_dump($item), '</pre>';
}
}
}
我还设置了一个名为 menu_type
的自定义 属性,它在附加到此处最后一个菜单的 start_el
函数中设置,因此我能够知道它是我想要的菜单。
基本上,我需要将它分成两半,而不是 3,但我不知道一半是多少。当然,我不想对最后一项执行 if 语句。因此,了解最后一个父菜单有多少项 $depth === 1 会有所帮助。这可能吗?
我为 $item
得到的输出是这样的:
object(WP_Post)#723 (40) {
["ID"]=>
int(73)
["post_author"]=>
string(1) "1"
["post_date"]=>
string(19) "2016-07-14 18:09:44"
["post_date_gmt"]=>
string(19) "2016-07-14 18:09:44"
["post_content"]=>
string(0) ""
["post_title"]=>
string(11) "Quick Links"
["post_excerpt"]=>
string(0) ""
["post_status"]=>
string(7) "publish"
["comment_status"]=>
string(6) "closed"
["ping_status"]=>
string(6) "closed"
["post_password"]=>
string(0) ""
["post_name"]=>
string(13) "quick-links-3"
["to_ping"]=>
string(0) ""
["pinged"]=>
string(0) ""
["post_modified"]=>
string(19) "2016-07-21 17:12:08"
["post_modified_gmt"]=>
string(19) "2016-07-21 17:12:08"
["post_content_filtered"]=>
string(0) ""
["post_parent"]=>
int(0)
["guid"]=>
string(30) "http://0b90b21a.ngrok.io/?p=73"
["menu_order"]=>
int(12)
["post_type"]=>
string(13) "nav_menu_item"
["post_mime_type"]=>
string(0) ""
["comment_count"]=>
string(1) "0"
["filter"]=>
string(3) "raw"
["db_id"]=>
int(73)
["menu_item_parent"]=>
string(1) "0"
["object_id"]=>
string(2) "73"
["object"]=>
string(6) "custom"
["type"]=>
string(6) "custom"
["type_label"]=>
string(11) "Custom Link"
["title"]=>
string(11) "Quick Links"
["url"]=>
string(0) ""
["target"]=>
string(0) ""
["attr_title"]=>
string(0) ""
["description"]=>
string(0) ""
["classes"]=>
array(5) {
[0]=>
string(0) ""
[1]=>
string(9) "menu-item"
[2]=>
string(21) "menu-item-type-custom"
[3]=>
string(23) "menu-item-object-custom"
[4]=>
string(22) "menu-item-has-children"
}
["xfn"]=>
string(0) ""
["current"]=>
bool(false)
["current_item_ancestor"]=>
bool(false)
["current_item_parent"]=>
bool(false)
}
您可以使用此筛选器函数为每个项目获取两个额外的属性 _children_count
和 _parent_children_count
,稍后您可以在菜单步行器中对其进行评估:
function my_wp_nav_menu_objects_filter($sorted_menu_items) {
foreach($sorted_menu_items as &$item) {
$item->_children_count = 0;
for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) {
if($sorted_menu_items[$i]->menu_item_parent == $item->ID) {
$item->_children_count++;
}
}
}
foreach($sorted_menu_items as &$item) {
$item->_parent_children_count = 0;
for($i=1, $l=count($sorted_menu_items); $i<=$l; ++$i) {
if($item->menu_item_parent == $sorted_menu_items[$i]->ID) {
$item->_parent_children_count = $sorted_menu_items[$i]->_children_count;
break;
}
}
}
unset($item);
return $sorted_menu_items;
}
add_filter('wp_nav_menu_objects', 'my_wp_nav_menu_objects_filter' );
奇怪的是,$sorted_menu_items 数组似乎是从 从 1.
开始的数字索引
在新属性前添加 _
作为伪命名空间,以避免与未来可能的官方属性发生冲突。