Для WordPress существует много плагинов, расширяющих функционал стандартного меню. Однако когда нужно отступить от стандартного меню и сделать что-то лучше, не всегда подходят даже плагины. На этот случай можно сделать своё меню.
Для одного из проектов я создал своё специфическое боковое меню (sidebar), удовлетворяющее присутствием нужных мне функций.
Собрал я это меню из различных хаков, разбросанных по просторам Интернета. Спасибо большое тем людям, которые их писали. Я доработал эти PHP коды и соединил вместе, чтобы получить специальное меню для WordPress:
Как вывести подразделы в меню на сайте
Для того, чтобы не дублировать вывод меню через виджеты и через шаблон, надо будет подкорректировать свой шаблон и убрать лишнее. Этот полный PHP код нужно вставить в файл Sidebar.php шаблона своего сайта на WordPress. Там же в Sidebar можно убрать другой код, ответственный за вывод меню.
Перенимаем общий стиль шаблона для виджетов сайта. Делаем так, чтобы меню выводилось только в Записях и Разделах, которые имеют Подразделы. Это нужно, чтобы не было лишнего вывода на Главной странице, на страницах Поиска и в тегах, где нет подразделов.
<aside id="archives" class="widget">
Теперь выводим заголовок, в котором должно быть название родительского (главного) раздела.
// Вывод родительской категории "0"
$separator = '';
// Не показывать заголовок в разделах, где нет подразделов для статьи:
$excludedcats = array(176,130,152,160);
$count = 0;
$categories = get_the_category();
foreach($categories as $category) {
$count++;
if ($category->category_parent == 0) {
if ( !in_array($category->cat_ID, $excludedcats) ) {
echo $separator . '' . $category->name.''; }
$separator = ' , ';
}} ?>
</h3>
Теперь, в зависимости от типа страницы выводим подразделы меню. Используем PHP для вывода подразделов в WordPress для типа страниц «Запись».
<?php
// Показывает подразделы главного раздела на страницах ЗАПИСЕЙ в WordPress
echo '<ul>';
$post_child_cat = array();
foreach((get_the_category()) as $cat) {
$args = array( 'child_of' => $cat->cat_ID );
$categories = get_categories( $args );
if( $categories ) foreach( $categories as $category ) {
echo '<li class="cat-item cat-item-'.$category->term_id.'">'.
'<a title="'.$category->description.'" href="';
echo bloginfo('url');
echo '/category/'.$cat->slug.'/'.$category->slug.'">'.
$category->name.'</a></li>';
}
}
echo '</ul>';
?>
<?php endif; ?>
А если пользователь находится в подразделах главного раздела WordPress, то выводим те же самые разделы, что и в записях. Однако для этой задачи уже нужен иной PHP код:
<?php
// Показывает подразделы главного раздела на страницах РАЗДЕЛОВ в WordPress
if (is_category()) {
$this_category = get_category($cat);
}
if($this_category->category_parent)
$this_category = wp_list_categories (
$args = array(
'orderby' => 'title',
'show_count' => 0,
'title_li' => 0,
'use_desc_for_title' => 1,
'child_of' => $this_category->category_parent,
'echo' => 0,
));
else
$this_category = wp_list_categories (
$args = array(
'orderby' => 'title',
'depth' => 1,
'show_count' => 0,
'title_li' => 0,
'use_desc_for_title' => 1,
'child_of' => $this_category->cat_ID,
'echo' => 0,
'show_option_none' => 0, // Если в категории нет разделов, не выводить надпись об этом
));
if ($this_category) { ?>
<ul><?php echo $this_category; ?></ul>
<?php } ?>
<?php endif; ?>
И в конце закрываем стиль:
<?php endif; ?>
После этого меню теперь выводим все остальные ссылки меню, которые будут и на Главной странице и на всех остальных. Это ссылки меню на главные разделы сайта.
<h3 class="widget-title">Главные разделы</h3>
<ul>
<?php
$args = array(
'title_li' => 0,
'orderby' => 'name',
'show_count' => 0,
'use_desc_for_title' => 0,
'exclude' => '130,193,177,227,228,205,204,206', // исключаем ненужные категории
'hide_empty' => 1,
// не обязательные
'depth' => 1, // 0 - выводит все, 2 - не выводит третью вложенность
);
wp_list_categories($args);
?>
</ul>
</aside>