Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php查找具有类名的菜单项并插入标记_Php_Regex_Wordpress - Fatal编程技术网

php查找具有类名的菜单项并插入标记

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'的菜单项,然后在该菜单项中插入一些自

我创建了一个wordpress菜单,其中一个菜单项的类为“wishlist”。使用wordpress“wp\u nav\u menu\u items”过滤器,我可以在一个长字符串中获得所有菜单项的整个标记:

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