php查找具有类名的菜单项并插入标记
我创建了一个wordpress菜单,其中一个菜单项的类为“wishlist”。使用wordpress“wp\u nav\u menu\u items”过滤器,我可以在一个长字符串中获得所有菜单项的整个标记:php查找具有类名的菜单项并插入标记,php,regex,wordpress,Php,Regex,Wordpress,我创建了一个wordpress菜单,其中一个菜单项的类为“wishlist”。使用wordpress“wp\u nav\u menu\u items”过滤器,我可以在一个长字符串中获得所有菜单项的整个标记: public function wishlist_count( $items, $args ) { var_dump($items); return $items; } 我正在寻找使用php的最佳方法,首先只查找类为'wishlist'的菜单项,然后在该菜单项中插入一些自
public function wishlist_count( $items, $args ) {
var_dump($items);
return $items;
}
我正在寻找使用php的最佳方法,首先只查找类为'wishlist'的菜单项,然后在该菜单项中插入一些自定义标记。然后在返回$items字符串之前,将更新后的标记添加回$items字符串
下面是$items字符串输出的内容:
<li id="menu-item-10" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10">
<a href="http://localhost/powell/shop/">Shop</a>
<ul class="sub-menu">
<li id="menu-item-14" class="wishlist menu-item menu-item-type-post_type menu-item-object-page menu-item-14">
<a href="http://localhost/powell/wishlist/">Wishlist</a>
</li>
</ul>
</li>
所以..除非我完全误解了这个问题,否则这个问题和评论中有很多(错误的)地方
首先,您不需要编写特殊函数来查看$items
,wordpress已经以
然后,在菜单中有一个专门针对css类的过滤器,名为nav\u menu\u css\u class
使用将遵循以下原则:
function my_special_nav_class( $classes, $item ) {
if ( is_single() && $item->title == 'Blog' ) {
$classes[] = 'special-class';
}
return $classes;
}
然后应用过滤器
add_filter( 'nav_menu_css_class', 'my_special_nav_class', 10, 2 );
也就是说,你也可以通过UI来实现
在外观>菜单中
,单击屏幕选项
选项卡
在“显示高级菜单属性”下,检查CSS类
现在展开任何菜单项以显示CSS类(可选)文本输入
现在,如果您想注入更复杂的标记
add_filter('wp_nav_menu_items','some_added_function', 10, 2);
function some_added_function( $nav, $args ) {
if( $args->theme_location == 'primary' )// target the menu
// add markup
return $nav."<li class='menu-header-search'><form action='http://example.com/' id='searchform' method='get'><input type='text' name='s' id='s' placeholder='Search'></form></li>";
return $nav;
}
所有这些假设都是假设您想在
php
中这样做,就像您在原始问题中所写的那样,而不是动态地(动态地)在客户端。因此,如果我没有误读你的问题,我也不需要js
或jQuery
。那么$item是什么样子的呢?在这种情况下,为什么要使用php?JavaScript似乎是实现这一点的最佳工具,没有任何问题。jQuery肯定会做到这一点……但我仍然对如何在PHP中实现这一点感兴趣。看来我在Wordpress的钩子里有了我需要的所有数据/信息。使用jQuery时,我必须为js设置本地化的vars,因为代码中还有更多内容,比如获取“登录用户id”和“用户愿望列表计数”,这必须传递给js。虽然问题不大,但我很好奇PHP是否能帮我解决这个问题。我想你需要重新阅读这个问题。我说我已经用“愿望列表”类创建了菜单项。但是,您提到的“wp_get_nav_menu_items()”函数可能非常有用。很高兴将项目分成一个数组,而不是一个长字符串。@乔治,那么我不明白什么?您是否需要执行我提到的任何过滤器都无法执行的操作?插入标记在示例中..就像我上面提到的,您错过了问题的第一部分。其次,我不需要向整个菜单添加类或标记。第三,我没有尝试更新link属性。我需要做的是找到一个具有“wishlist”类的特定菜单项,并向其中添加标记。就像我提到的,你提到的“wp_get_nav_menu_items()”函数应该会起作用,谢谢。因为我可以在每个菜单项上运行一个循环,首先检查是否有类“wishlist”,然后我知道只在该链接上添加我的特殊标记。好吧,在我看来,wp\u nav\u菜单项
可以满足您的需要。当然,它需要根据您的需要进行调整,我没有这样做(只是一个如何针对单个菜单项的示例)。
add_filter( 'nav_menu_link_attributes', function( $atts, $item )
{
if( isset( $item->classes ) )
{
$atts['class'] = join(
' ',
array_filter(
$item->classes,
function( $val )
{
return 'li-class-' !== substr( $val, 0, strlen( 'li-class-' ) );
}
)
);
}
return $atts;
}, 10, 2 );