У меня есть меню следующих гиперссылок.
1) Our Work
2) Clients
3) About Us
4) Contact
У меня вопрос, как я могу предотвратить следующий код, чтобы не заменить li
в «Клиенты»?
Он выводит «Caents», хотя мне нужно прекратить выводить <li>
теги в меню.
<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. Это довольно гибкий. Вот пример, который делает то, что вы хотите, и иллюстрирует некоторые основные методы анализа html с помощью php:
<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>
Вместо того, чтобы взламывать вывод с заменой строк, вы должны использовать инструменты, которые WordPress дает вам для создания желаемого результата.
Чтобы избавиться от <li>
теги вы можете создать пользовательское меню ходунка. Этот ходок в основном прямо из этот пример, Я просто удалил комментарии и <li>
из вывода:
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
);
}
}
Теперь вы можете использовать этот ходунки в своем wp_nav_menu()
вызов:
$cleanmenu = wp_nav_menu( array(
'container' => false,
'depth' => 0,
'sort_column' => 'menu_order, post_title',
'echo' => false,
'before' => '',
'after' => '',
// use <nav> instead of <ul> to enclose the menu.
'items_wrap' => '<nav>%3$s</nav>',
// use the cusom walker here
'walker' => new Walker_Custom_Menu()
) );
Сгенерированный выход:
<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>