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>