Вывод дочерних рубрик в сайдбар

Понадобилось не так давно реализовать одну довольно интересную задачу. Суть в том что нужно было вывести список дочерних рубрик в виде меню в сайдбар. Но не просто вывести дочерние рубрики на странице рубрики, а реализовать именно как меню, т.е. где бы мы не находились в пределах родительской рубрики, мы всегда должны видеть дочерние рубрики именно родительской рубрики первого уровня, а не текущей рубрики.

Вывод дочерних рубрик в сайдбар

И даже находясь на странице поста мы должны видеть дочерние рубрики именно родителя первого уровня. На первый взгляд показалось довольно не сложно, но потом начали вылазить баги, то один, то другой.

Начался поиск решения на просторах интернета, и как оказалось ни чего подобного нет. После долгих экспериментов был сделан «корявенький» но рабочий код, правда с ограничением вложенности.

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[0]->parent;
                     $ancestors = get_ancestors($cat_top, 'category');
                     $ancestors_cat = $ancestors[0];
                     $cat1 = $categories[0]->parent;
                     $ancestors1 = get_ancestors($cat1, 'category');
                     $ancestors_cat1 = $ancestors1[0];
                  if ($cat_parent == 0) {
                     wp_list_categories('depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$current_cat);
                  }
                   elseif ($ancestors[0]) {
                     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[0]->category_parent;
                          $cat = $categories[0]->cat_ID;
                          $ancestors = get_ancestors($cat, "category');
                          $ancestors_cat = $ancestors[0];
                          $cat1 = $categories[0]->parent;
                          $ancestors1 = get_ancestors($cat1, 'category');
                          $ancestors_cat1 = $ancestors1[0];
                       if ($ancestors[1]) {
                       wp_list_categories('depth=2&hide_empty=1&title_li=&show_count=0&child_of=".$ancestors_cat1);
                       }
                       elseif ($ancestors[0]) {
                       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() )[0]->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");
}
Добавить комментарий