Продолжаем обсуждать WP. Столкнулся сегодня с проблемой рубрик. Ну то, что нормальных и нужных операций с рубриками в WP наблюдается полнейшее отсутствие, уже никому не секрет. Существует масса плугинов, которые помогают восстановить порядок с рубриками и выводить их не только по ID, name (Default), slug, count и term_group, то есть простое ORDER BY из таблицы рубрик, но и в своём порядке, устанавливаемым чуть ли не перетаскиванием мыши.
Но это ладно, это не критично, порядок не страшно. Страшно стало то, когда меня попросили сделать так, чтобы дочерние рубрики появлялись только когда активна родительская… Оказалось, что такого или никому не надо было ранее в сети, то ли на это было забито, но готового решения я не нашёл. Понятное дело, что WP выводит рубрики простой функцией wp_list_categories(), которая может оказывается многое, но вот именно это у нас не предусмотрено. Единственное что там есть — exclude, который может удалять ненужные рубрики.
Вот у нему и зацепимся. то есть нам надо будет динамически узнавать иерархию рубрик (а кроме как через данные в БД это не сделать никак) и вывести в exclude ид рубрик, которые надо скрыть, через запятую.
Собственно это и делаем следующей вставкой прямо в «sidebar.php» (ну или в то место, где выводятся рубрики)
<!--?php //Пытаемся получить ID активной рубрики в данный момент $this_category = get_category($cat); $this_category_id = $this_category->cat_ID;<br ?--> //Если такое ID есть, то есть больше нуля if ($this_category_id > 0) : //Проверяем, в дочерней ли мы рубрике $is_this_child_category = $wpdb->get_col ('SELECT parent FROM wp_term_taxonomy WHERE term_id='.$this_category_id); //Если дочерняя, то база вернёт ID родительской, или 0, если это родительская рубрика. //В зависимости от этого назначаем конкретно родительскую рубрику if ($is_this_child_category[0] > 0) : $parent_category = $is_this_child_category[0]; else : $parent_category = $this_category_id; endif; //Теперь просто выбираем из базы данных все ID дочерних рубрик, кроме текущей $exept_this_child_categories = $wpdb->get_col ('SELECT term_id FROM wp_term_taxonomy WHERE taxonomy="category" AND parent!=0 AND parent !='.$parent_category); else : //А это нам нужно, чтобы скрывать все дочерние рубрики по умолчанию $exept_this_child_categories = $wpdb->get_col ('SELECT term_id FROM wp_term_taxonomy WHERE taxonomy="category" AND parent!=0'); endif; //Теперь полученные массивы от базы превращаем в текст, каждый элемент разделяем запятой $exclude_list = implode (',', $exept_this_child_categories); //Ну и собственно итог этого всего – выводим рубрики, за исключением дочерних неактивных wp_list_categories('orderby=id&hide_empty=0&title_li=&exclude='.$exclude_list); ?>