php找到一个带有类名的菜单项并插入标记

时间:2015-09-19 00:30:33

标签: php regex wordpress

我创建了一个wordpress菜单,其中包含一个具有“wishlist”类的菜单项。使用wordpress 'wp_nav_menu_items'过滤器,我可以在一个长字符串中获取所有菜单项的整个标记:

public function wishlist_count( $items, $args ) {
    var_dump($items);
    return  $items;
}

我正在寻找使用php的最佳方法,首先只找到类'wishlist'的菜单项,然后在该菜单项中插入一些自定义标记。然后在返回之前将更新的标记添加回$ 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>

1 个答案:

答案 0 :(得分:1)

所以......除非我完全误解了这个问题,否则在这个问题和评论中会有很多(错误的)。

首先 - 您不需要编写特殊功能来查看$items,wordpress已经以wp_get_nav_menu_items()

的形式提供了这个功能

然后,您对名为nav_menu_css_class

的菜单中的css类有一个特殊的过滤器

用法将与

一致
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实现这一点..

Appearance > Menus中,点击Screen Options标签

Show advanced menu properties下,检查CSS类。

现在展开任何菜单项以显示CSS Classes(可选)文本输入。

现在,如果你想注入更复杂的标记

    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;
    }

当然这取决于您的标记,因为如果您只需要更改某些链接属性,则会有另一个过滤器nav_menu_link_attributes

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 );

所有这些假设你想在php中这样做,就像你在原始问题中写的那样,而不是动态 - 即时 - 客户端。所以不需要jsjQuery - 再次,假设我没有误读你的问题。