Php str_替换wordpress菜单

Php str_替换wordpress菜单,php,wordpress,menu,Php,Wordpress,Menu,我有以下超链接的菜单 1) Our Work 2) Clients 3) About Us 4) Contact 我的问题是,如何防止以下代码不替换“客户端”中的li 它输出“Caents”,尽管我确实需要它停止输出菜单中的标记 <nav> <?php // first let's get our nav menu using the regular wp_nav_menu() function with special parameters $cleanmenu = w

我有以下超链接的菜单

1) Our Work
2) Clients
3) About Us
4) Contact
我的问题是,如何防止以下代码不替换“客户端”中的
li

它输出“Caents”,尽管我确实需要它停止输出菜单中的
  • 标记

    <nav>
    <?php 
    
    // first let's get our nav menu using the regular wp_nav_menu() function with special parameters
    $cleanmenu = wp_nav_menu( array( 
    'container' => false, // this is usually a div outside the menu ul, we don't need it
    'depth'       => 0,
    'sort_column' => 'menu_order, post_title',
    'echo' => false, // don't display it just yet
    ) );
    
    // Find the closing bracket of each li and the opening of the link, then all instances of "li"
    $find = array('><a','li');
    // Replace the former with nothing (a.k.a. delete) and the latter with "a"
    $replace = array('','a');
    echo str_replace( $find, $replace, $cleanmenu );
    
    ?>
    </nav>
    
    
    
    我不建议这样解析html。花些时间学习PHP DOM扩展。它很灵活。下面是一个示例,它实现了您想要的功能,并演示了使用php解析html的一些基本方法:

        <nav>
        <?php 
    
        $cleanmenu = wp_nav_menu( array( 
            'container' => false,
            'depth'       => 0,
            'sort_column' => 'menu_order, post_title',
            'echo' => false,
        ) );
    
        $html = '';     
    
        libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $dom->preserveWhiteSpace = false;
        $dom->loadHTML($cleanmenu);
        $listItems = $dom->getElementsByTagName('li');
        foreach($listItems as $li) {
            $id = $li->getAttribute('id');
            $class = $li->getAttribute('class');
            $href = $li->getElementsByTagName('a')->item(0)->getAttribute('href');
            $text = $li->getElementsByTagName('a')->item(0)->nodeValue;
            $html .= '<a id="' . $id . '" class="' . $class . '" href="' . $href . '">' . $text . '</a>'.PHP_EOL;
        }
        echo $html;
    
        ?>
        </nav>
    
    
    保留空白=假;
    $dom->loadHTML($cleanmenu);
    $listItems=$dom->getElementsByTagName('li');
    foreach($li列出项目){
    $id=$li->getAttribute('id');
    $class=$li->getAttribute('class');
    $href=$li->getElementsByTagName('a')->item(0)->getAttribute('href');
    $text=$li->getElementsByTagName('a')->item(0)->nodeValue;
    $html.=''.PHP\u EOL;
    }
    echo$html;
    ?>
    
    您应该使用WordPress提供的工具来创建所需的输出,而不是使用字符串替换对输出进行黑客攻击

    要去掉
  • 标记,您可以创建一个自定义菜单漫游器。这个walker基本上是直接从输出中删除注释和
  • class Walker_Custom_Menu extends Walker {
        var $db_fields = array(
            'parent' => 'menu_item_parent', 
            'id'     => 'db_id' 
        );
        function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
            $output .= sprintf( "\n<a href='%s'%s>%s</a>",
                $item->url,
                ( $item->object_id === get_the_ID() ) ? ' class="current"' : '',
                $item->title
            );
        }
    
    }
    
    生成的输出:

    <nav>
    <a href='http://test'>Our Work</a>
    <a href='http://Test'>Clients</a>
    <a href='http://test'>About Us</a>
    <a href='http://test'>Contact</a></nav>
    
    
    
    即使你成功地做到了这一点,你最终也会得到额外的收尾
    和一堆神秘地包裹在
    标签中的锚。不确定你在这里想做什么,但似乎有更好的方法。删除
  • 标签的目的是什么?最终,我尝试在没有
    • 标签的情况下显示我的Wordpress菜单。它应该只显示,然后显示每个“”。这就是我现在拥有的。它可以工作,但不显示当前的菜单项?这是否也会输出当前的菜单项?不确定,如果不进一步测试它,walker只包含一行将类“current”添加到当前项。您可以轻松地修改它以输出所有需要的内容。
      <nav>
      <a href='http://test'>Our Work</a>
      <a href='http://Test'>Clients</a>
      <a href='http://test'>About Us</a>
      <a href='http://test'>Contact</a></nav>