Понадобилось не так давно реализовать одну довольно интересную задачу. Суть в том что нужно было вывести список дочерних рубрик в виде меню в сайдбар. Но не просто вывести дочерние рубрики на странице рубрики, а реализовать именно как меню, т.е. где бы мы не находились в пределах родительской рубрики, мы всегда должны видеть дочерние рубрики именно родительской рубрики первого уровня, а не текущей рубрики.
И даже находясь на странице поста мы должны видеть дочерние рубрики именно родителя первого уровня. На первый взгляд показалось довольно не сложно, но потом начали вылазить баги, то один, то другой.
Начался поиск решения на просторах интернета, и как оказалось ни чего подобного нет. После долгих экспериментов был сделан «корявенький» но рабочий код, правда с ограничением вложенности.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php if (is_category()) { ?> <div class="sidebar-menu"> <div class="title">Подкатегории</div> <ul class="sub_cat"> <?php global $post; $category = get_the_category( get_the_ID() ); $cat = get_category(get_query_var('cat'),false); $cat_parent = $cat->parent; // ID родительской категории $current_cat = get_query_var('cat'); // ID текущей категории $cat_top = $category[]->parent; $ancestors = get_ancestors($cat_top, 'category'); $ancestors_cat = $ancestors[]; $cat1 = $categories[]->parent; $ancestors1 = get_ancestors($cat1, 'category'); $ancestors_cat1 = $ancestors1[]; if ($cat_parent == ) { wp_list_categories('depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$current_cat); } elseif ($ancestors[]) { wp_list_categories("depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$ancestors_cat); } elseif ($ancestors[1]) { wp_list_categories("depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$ancestors_cat1); } else { wp_list_categories("depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$cat_parent); } ?> </ul> </div> <?php } elseif ( is_single()) { ?> <div class="sidebar-menu"> <div class="title">Подкатегории</div> <ul class="sub_cat"> <?php global $post; $categories = get_the_category( $post->ID ); $vl1 = $categories[]->category_parent; $cat = $categories[]->cat_ID; $ancestors = get_ancestors($cat, "category'); $ancestors_cat = $ancestors[]; $cat1 = $categories[]->parent; $ancestors1 = get_ancestors($cat1, 'category'); $ancestors_cat1 = $ancestors1[]; if ($ancestors[1]) { wp_list_categories('depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$ancestors_cat1); } elseif ($ancestors[]) { wp_list_categories("depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$ancestors_cat); } else { wp_list_categories("depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$cat); } ?> </ul> </div> <?php } ?> |
Код действительно рабочий, но уж очень громоздкий. После общения с коллегами по цеху, код был переработан и в итогу получилось довольно компактное решение.
Кстати, со слов большинства вебмастеров стоимость аренды сервера в российской зоне намного ниже зарубежных, но по качеству они практически равноценны.
Данный код добавляем в functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function cat_menu_mailrucp() { global $cat; $current_cat = $cat; // ID текущей категории if ( "' === $cat ) { // На странице поста $current_cat = get_the_category( get_the_ID() )[]->cat_ID; } $cat_top = $current_cat; // ID самой верхней родительской категории while ( get_category( $cat_top )->category_parent ) { $cat_top = get_category( $cat_top )->category_parent; } echo '<ul class="children">'; echo '<li class="cat-item cat-tem-' . intval( $cat_top ) . '">'; echo '<a href="' . get_category_link($cat_top) . '">' . get_cat_name($cat_top) . '</a>'; echo '<ul class="children">'; wp_list_categories( 'hide_empty=0&title_li=&show_count=0&child_of=" . $cat_top ); echo "</ul>'; echo '</li>'; echo '</ul>'; } |
И вызываем в любом нужном месте, в данном случае в сайдбаре.
1 |
<?php if (is_category()|| is_single()) { cat_menu_mailrucp(); } ?> |
Введем условие что бы вызывать функцию только на страницах категорий и на страницах поста.
Ну и можно дополнить не большим jquery, для того что бы не показывать блок если в рубрике нет подрубрик.
1 2 3 |
if ( $(".sidebar-menu li").hasClass("cat-item-none") ) { $(".sidebar-menu").css("display", "none"); } |