Главная Новости

Как вывести подкатегории в категориях и записях Wordpress?


Опубликовано: 07.09.2018

видео Как вывести подкатегории в категориях и записях Wordpress?

Создание и настройка категорий в Woocommerce #1

Сегодня столкнулся с довольно нетривиальной задачкой. Как вам известно у меня на поддомене termins.evgmoskalenko.com есть проект — «Терминология». Словарь: seo, html, css и интернет терминов.



Дак вот на днях задумал сделать одно очень интересное решение, реализовать вывод подкатегорий:

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

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


Woocommerce: отображение товаров с определённой категории

Звучит не совсем понятно, но дальше Вы поймете, зачем я все так усложнил, и зачем мне такая навигация. Давайте представим, что есть категория на сайте — « Интернет термины ». У данной категории есть подкатегории, которые позиционируются, как алфавитный рубрикатор.

То есть, если есть термин « Поисковые системы », начинается на букву «П», есть смысл поместить данный термин в категорию « Интернет термины » + в дочернюю ей категорию «П» , что делает навигацию на сайте, а также поиск необходимой статьи куда приятней, быстрей и проще.

Такое хитрое решение можно применять на любом сайте, где структура примерно следующая:

Категория 1

Подкатегория 1.1 Подкатегория 1.2 Подкатегория 1.3 Подкатегория 1.4 Подкатегория 1.5

Категория 2

Подкатегория 2.1 Подкатегория 2.2

и так далее.

Задумал такую реализацию, чтобы такие подрубрики (дочерние категории wordpress) показывались на всех страничках связанных с термином, в частности: в родительских категориях, подкатегориях родительской категории, а также на самой странице термина, статьи, записи. Которая непосредственно находится в дочерней категории.

Для реализации данного метода, нам понадобиться написать класс Walker для wp_list_categories + вывод wp_list_category для категорий, подкатегорий, записей.

Вывод дочерних категорий в wordpress

Вставляем данный код в то место, где хотим выводить подкатегории (дочерние категории в WordPress). Это может быть: header , sidebar , или же footer вашего сайта.

<?php $category = get_the_category(); if (is_category()) { $this_category = get_category($cat); if($this_category->category_parent) { $this_category = wp_list_categories( array( 'orderby' => 'name', 'show_count' => '0', 'current_category' => ''.$category[0]->cat_ID.'', 'title_li' => '', 'use_desc_for_title' => '0', 'child_of' => ''.$this_category->category_parent.'', 'echo' => '0', 'walker' => new Subcategory_Walker_Category ) ); } else { $this_category = wp_list_categories( array( 'orderby' => 'name', 'depth' => '1', 'show_count' => '0', 'current_category' => ''.$category[0]->cat_ID.'', 'title_li' => '', 'use_desc_for_title' => '0', 'child_of' => ''.$this_category->cat_ID.'', 'echo' => '0', 'walker' => new Subcategory_Walker_Category ) ); } } elseif ( is_single()) { if($category[0]->category_parent) { $this_category = wp_list_categories( array( 'orderby' => 'name', 'show_count' => '0', 'current_category' => ''.$category[0]->cat_ID.'', 'title_li' => '', 'use_desc_for_title' => '0', 'child_of' => ''.$category[0]->category_parent.'', 'echo' => '0', 'walker' => new Subcategory_Walker_Category ) ); } else { $this_category = wp_list_categories( array( 'orderby' => 'name', 'show_count' => '0', 'current_category' => ''.$category[0]->cat_ID.'', 'title_li' => '', 'use_desc_for_title' => '0', 'child_of' => ''.$category[0]->cat_ID.'', 'echo' => '0', 'walker' => new Subcategory_Walker_Category ) ); } } ?> <?php if(is_category() || is_single()) { ?> <!-- Показываем наши подкатегории сугубо в категориях и записях --> <div> <div> <?php foreach((get_the_category()) as $childcat) { $parentcat = $childcat->category_parent; echo get_cat_name($parentcat); //Вывод названия родительской категории, если есть такая необходимость } ?> </div> <ul> <?php echo $this_category; //Вывод подкатегорий ?> </ul> </div> <?php } ?>

Класс Walker для wp_list_categories

Класс Walker для wp_list_categories используется для построения меню, стилизации, добавления своих классов в список категорий. Вставляем данный код в файлик functions.php :

class Subcategory_Walker_Category extends Walker_Category { function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { extract($args); $cat_name = esc_attr( $category->name ); $cat_name = apply_filters( 'list_cats', $cat_name, $category ); $link = '<a href="' . esc_url( get_term_link($category) ) . '" '; if ( $use_desc_for_title == 0 || empty($category->description) ) $link .= 'title="' . esc_attr( sprintf(__( 'View all posts filed under %s' ), $cat_name) ) . '"'; else $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"'; $link .= '>'; $link .= $cat_name . '</a>'; if ( !empty($feed_image) || !empty($feed) ) { $link .= ' '; if ( empty($feed_image) ) $link .= '('; $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $feed_type ) ) . '"'; if ( empty($feed) ) { $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; } else { $title = ' title="' . $feed . '"'; $alt = ' alt="' . $feed . '"'; $name = $feed; $link .= $title; } $link .= '>'; if ( empty($feed_image) ) $link .= $name; else $link .= "<img src='$feed_image'$alt$title" . ' />'; $link .= '</a>'; if ( empty($feed_image) ) $link .= ')'; } if ( !empty($show_count) ) $link .= ' (' . intval($category->count) . ')'; if ( 'list' == $args['style'] ) { $output .= "\t<li"; $class = 'cat-item'; // Your custom class if ($depth) $class .= ''; if ( !empty($current_category) ) { $_current_category = get_term( $current_category, $category->taxonomy ); if ( $category->term_id == $current_category ) $class .= ' current-cat'; elseif ( $category->term_id == $_current_category->parent ) $class .= ' current-cat-parent'; } $output .= ' class="' . $class . '"'; $output .= ">$link\n"; } else { $output .= "\t$link<br />\n"; } } }

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

Делайте навигацию предельно понятно и удобно для своих посетителей. Даже если реализация довольно сложная и муторная.

Все вопросы, предложения и просьбы, пишите в комментариях к статье. :-)