Я люблю WordPress. Я также люблю чистый семантический HTML. К сожалению, некоторые стандартные функции темы WordPress возвращают немного неопрятный код. Для меня основными виновниками являются wp_list_pages () и более новая wp_nav_menu () ; оба возвращают неупорядоченный список ссылок на страницы, обычно используемых для меню страниц и файлов сайтов, например,
<?php wp_nav_menu(array( 'depth'=>2 )); ?>
Код приводит к этой мерзости HTML для домашней страницы установки по умолчанию и страниц контактов и контактов:
<div class="menu">
<ul>
<li >
<a href="http://mysite.com/" title="Home">Home</a>
</li>
<li class="page_item page-item-2 current_page_ancestor current_page_parent">
<a href="http://mysite.com/about" title="About">About</a>
<ul class='children'>
<li class="page_item page-item-5 current_page_item">
<a href="http://mysite.com/about/contact-us" title="Contact us">Contact us</a>
</li>
</ul>
</li>
</ul>
</div>
Код действителен, но он содержит элементы, которые нам обычно не нужны:
- Строго говоря, внешний
div
Я бы предпочел либо датьul
nav
- Нам не нужен атрибут заголовка, когда наша ссылка содержит идентичный текст.
- Требуются ли нашему CSS или JavaScript хуки для классов «page_item» и «page-item-N»?
- Класс «children» для списка подссылок не обязателен — мы можем стилизовать их с помощью селектора, например «nav ul ul li».
- Классы current_page_ancestor и current_page_parent означают одно и то же, но я бы предпочел одно более короткое имя, например «open».
- Точно так же я хочу переименовать current_page_item в «active».
- Нужны ли нам полные страницы URL — мы могли бы использовать более короткие абсолютные адреса, такие как /, / about и / contact?
Есть несколько способов привести HTML в порядок, но самое простое решение заменяет строки с помощью регулярных выражений.
примечание: объект WordPress 3 Walker
В WordPress 3.0 пользовательский объект Walker может быть передан в качестве аргумента в wp_nav_menu (). Объект предоставляет код для вывода собственного пользовательского HTML-кода для каждой ссылки на страницу. Хотя это будет полезно в некоторых обстоятельствах, вам, возможно, потребуются регулярные выражения для внешнего HTML, код не обязательно будет короче и не будет работать в WordPress 2.x и ниже.
Вот код PHP для вывода более аккуратного меню HTML на 2 уровня (главное меню и подменю). В большинстве случаев он должен заменить вызов wp_nav_menu () или wp_list_pages () в файле header.php вашей темы:
echo preg_replace(array(
'/t/', // remove tabs
'/'.str_replace('//','//', get_bloginfo('url')).'/i', // remove full URL
'/current_page_items*/i',
'/current_page_ancestors*/i',
'/current_page_parents*/i',
'/page_items+/i',
'/page-item-d+s*/i',
'/childrens*/i',
'/s*class=["']["']/i', // empty classes
'/s*title="[^"]+"/i', // all titles
'/s+>/i',
'/div>/i' // change div to nav
),
array(
'',
'',
'active',
'open',
'',
'',
'',
'',
'',
'',
'>',
'nav>'
),
wp_nav_menu(array( 'menu_class'=>'', 'depth'=>2, 'echo'=>false ))
);
Если вы используете версию WordPress до версии 3, замените предпоследнюю строку «wp_nav_menu (…)» на:
"<nav><ul>n"
. wp_list_pages('depth=2&title_li=&sort_column=menu_order&echo=0')
. "</ul></nav>"
Наш конечный HTML-код намного чище и был сокращен более чем на 50%. Более длинные меню могут привести к большей экономии.
<nav>
<ul>
<li><a href="/">Home</a></li>
<li class="open">
<a href="/about">About</a>
<ul><li class="active"><a href="/about/contact-us">Contact us</a></li></ul>
</li>
</ul>
</nav>
Обратите внимание, что регулярные выражения являются мощными, но опасными. Возможно, вам придется изменить код, если вы используете более глубокую глубину страницы или у вас есть страница с именем «children» или «page_item».
Теперь нет оправдания — иди и приведи в порядок свой WordPress HTML!