The Dragon's Nest

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

30.11.2009 от Dandr


Недавно я писал, как можно вывести список подкатегорий одной из категорий в WP. Увы, сегодня обнаружил один косяк в этом алгоритме, из-за которого пришлось перекраивать функцию.
Предположим, у нас есть следующая структура категорий:

Родительская категория 1
-подкатегория 1.1
--подкатегория 1.1.1
--подкатегория 1.1.2
-подкатегория 1.2
--подкатегория 1.2.1
--подкатегория 1.2.1
-подкатегория 1.3
Родительская категория 2
-подкатегория 2.1
--подкатегория 2.1.1
Родительская категория 3
-подкатегория 3.1
--подкатегория 3.1.1

Так вот, если я захочу вывести все дочерние категории “Родительской категории 1″ вот этим кодом, то я увижу следующее:

-подкатегория 1.1
--подкатегория 1.1.1
--подкатегория 1.1.2
-подкатегория 1.2
--подкатегория 1.2.1
--подкатегория 1.2.1
-подкатегория 1.3

потому как 1.1.2 является дочерней по отношению к родительской категории 1. Честно говоря, для меня это было неожиданностью, потому как в моём понимании это “внучатые” подкатегории и видеть я их в этом списке совершенно не хотел.
Кодекс мне на сей раз ничем не помог, пришлось крутить массив с индексами категорий и отсеивать ненужное.
В итоге, я получил следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// формирование сортированного массива с названиями подкатегорий
function mc_subcats ($parent_cat) {
	$parent_id = get_cat_id($parent_cat); //получаем id родительской категории
	$all_cats_ids = get_all_category_ids(); //получаем id ВСЕХ категорий
	sort( $all_cats_ids);
	foreach ( $all_cats_ids as $cat_id ) {
		$temp = true;
		if (cat_is_ancestor_of($parent_id, $cat_id)) {  //проверяем, является ли категория с cat_id дочерней по отношению к $parent_id
 			$child_cats_temp[] = $cat_id; //если дочерняя, то добавляем id  во временный массив 
 			foreach ( $child_cats_temp as $parent_temp ) { //перебираем поэлементно временный массив
 				if (cat_is_ancestor_of($parent_temp, $cat_id)) {
 					$temp = false; //если категория с cat_id является дочерней по отношению к хотя бы одному из элементов временного массива, ставим переключатель в положение ложь
 				}
 			}
 			if ($temp) {
 				$child_cats[] = get_cat_name($cat_id);
 			}
 		}
	}
	sort( $child_cats ); 
	return $child_cats; //возвращаем сортированный массив названий подкатегорий
}

Т.е. “внучатые” подкатегории отсеиваются методом двойного перебора. Теперь этот код возвращает массив со следующими названиями подкатегорий:

-подкатегория 1.1
-подкатегория 1.2
-подкатегория 1.3

Более элегантного решения этой задачи я не нашёл.

Связанные записи


Рубрики: HOWTO | 29 комментариев


29 комментариев

Накукрыскин — 30 ноября 2009 @ 0:42

O_О
ОМГ!!!!!!!!!!!
Виджеты – Рубрики – “Отображать иерархию” О_О

Dandr — 30 ноября 2009 @ 0:46

Накукрыскин, во-первых, я нигде не говорил про виджеты. Я ими банально не буду пользоваться;
во-вторых, эти подкатегории мне нужне не для отображения в сайдбаре;
в-третьих, как я уже писал ранее, мне нужен не html-список подкатегорий, а массив с их названиями или id для дальнейшей обработки.

Накукрыскин — 30 ноября 2009 @ 0:50

пыщь -_- сплю. хто здесь?)))))

Dandr — 30 ноября 2009 @ 0:51

Накукрыскин, а я тебе говорил – иди спать)))

gonzogames.ru — 27 февраля 2010 @ 1:12

Подскажите, пожалуйста, как изменить ваш код, чтобы решить следующую задачу.

допустим, мы находимся в посте, который относится к категориям:
1.
1.1
1.1.1

то есть к примеру сообщение про яблоню относится к категориям
деревья
лиственные
яблони

как можно извлечь id самой внучатой категории, то есть в нашем случае 1.1.1

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

на странице сообщения о грушах – про остальные груши и тд.

заранее спасибо.

Dandr — 26 марта 2010 @ 22:31

@ gonzogames.ru:
так вот сразу и не скажу… Надо кодекс пошерстить…

Перспективный блоггер — 16 апреля 2010 @ 1:20

Чувствую, что это практически то, что я так долго искал!!!! Автор, очень нужна ваша помощь. Вопрос состоит в следующем:

как сделать на странице категории вывод всех постов из каждой подкатегорий данной категории:

Страница с категорией 1:
–подкатегория 1.1
—-post 1 подкатегории 1.1, в который входит title подкатегории 1.1
—-post 2 подкатегории 1.1, в который входит title подкатегории 1.1

–подкатегория 1.2
—-post 1 подкатегории 1.2, в который входит title и the_content подкатегории 1.2
….. и т.д.

Тема на форуме здесь: http://mywordpress.ru/support/viewtopic.php?pid=70370#p70370

Некоторые прикидки по решению вопроса уже там изложил, туда же скопировал ваше решение, не сердитесь, пожалуйста. Вместе с вашими наработками точно все получится, но очень нужно довести до конечного итога! Пожалуйста, если найдете время, посмотрите. Большое спасибо!

Dandr — 16 апреля 2010 @ 20:54

Перспективный блоггер :

Автор, очень нужна ваша помощь.

Сомневаюсь, что смогу помочь. Что-то я подзабросил свои начинания и из башки всё очень быстро выветрилось. Да и лето на носу, не до того)))
В общих чертах:
определяем текущую категорию;
создаём массив подкатегорий (по моему коду?);
проверяем количество подкатегорий и зацикливаем по количеству оных;
в теле цекла перебираем подкатегории из массива и делаем запрос по аналогии со стандартным выводом постов, но для каждой подкатегории.
Собственно, всё. :)

Dandr — 16 апреля 2010 @ 20:56

ЗЫ за ссылочку спасибо: лишней не будет))

Перспективный блоггер — 16 апреля 2010 @ 21:26

На здоровье. Ю.Б. там уже и решение предложил ) Так что все в шоколаде )

Dandr — 16 апреля 2010 @ 22:35

Перспективный блоггер :

Так что все в шоколаде )

Вот и чудно))

Перспективный блоггер — 19 апреля 2010 @ 6:27

Поторопился с выводами. В итоге твой кусок кода сейчас для меня оказался самым полезным, вот только хоть убей не удается вернуть из функции $child_cats, хотя в функции и есть return $child_cats;, но почему-то не работает.

Если дописать внутри функции echo count($child_cats), а затем вызвать функцию в произвольном месте – то работает (выводит 3 – столько дочерних категорий у той, которую я передал аргументом функции), если же написать echo count($child_cats) за пределами функции, то не работает (отдает 0 вместо 3)!!!! Замучался уже. Не подскажешь, как таки правильно вернуть массив из этой функции? Мануалы гуглил, php5 читал – не просветило…

Dandr — 19 апреля 2010 @ 7:26

@ Перспективный блоггер:
:mrgreen:
Переменные PHP.

Перспективный блоггер — 19 апреля 2010 @ 15:27

Говорю ж, мануалы читал… Мне бы только как массив вернуть из функции.

Перспективный блоггер — 19 апреля 2010 @ 18:09

Все, допер! Надо было так $my_var = mc_subcats(8); echo count($child_cats);

Спасибо! Ссылочка пригодилась :) .

jump — 26 мая 2010 @ 14:05

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

Дмитрий — 18 июня 2010 @ 9:49

У меня в WP при заходе в категории не отображаются подкатегории. А родительская категория вообще исчезает. Подскажите плиз как сделать. Тема не совсем стандартная. category.php нету

Dandr — 9 июля 2010 @ 9:22

Дмитрий, я сейчас немного отошёл от WP, поэтому не подскажу…

Николай — 16 сентября 2010 @ 17:32

У меня такая проблема.
Есть категории и подкатегории.
Есть вертикальное меню для них.
Если из меню открываю какую-то категорию, то выводятся посты и из подкатегорий.
А мне надо, чтобы из подкатегорий не выводилось. Из них надо выводить когда открываю из подменю.

Dandr — 26 сентября 2010 @ 11:13

@ Николай, разобрался?
В код вникать не хочу – немного не до того. В твоём случае достаточно перед выводом сделать проверку на родительскую категорию. Если её нет, то запись выводится. Как-то так.

Николай — 26 сентября 2010 @ 11:32

@ Dandr:
Сделал так:

$rt = get_the_category();
if ($wp_query->queried_object->parent == 0 && $wp_query->queried_object->cat_ID != ’22′) {
if ($wp_query->queried_object->cat_ID != $rt[0]->cat_ID) {
$all_cats_ids = get_all_category_ids();
$narray = (array_filter($all_cats_ids, “nopar”));
foreach ($narray as &$tmp) { $noarray .= “,-$tmp”; }
query_posts(‘cat=’.$wp_query->queried_object->cat_ID.’,-’.$rt[0]->cat_ID.”.$noarray);
}

}
function nopar($var) {
global $rt;
return ($var != $rt[0]->parent);
}

md — 8 ноября 2010 @ 19:42

Спасибо огромное :) Как раз то, над чем думал несколько дней, но так и не смог придумать. Спасибо еще раз :grin:

Dandr — 11 ноября 2010 @ 11:01

Хм… Оказывается, тема актуальна… :grin:

Boroda — 26 ноября 2010 @ 17:24

Есть рубрики, в низ записи как на основе записей из рубрик построить выпадающее горизонтальное меню?

Dandr — 28 ноября 2010 @ 23:37

@ Boroda,чо-то я нифига не понял…

Boroda — 29 ноября 2010 @ 0:51

Dandr :

@ Boroda,чо-то я нифига не понял…

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

Boroda — 29 ноября 2010 @ 0:54

@ Dandr:
Версия WordPress 2.8.6

Dandr — 30 ноября 2010 @ 23:37

@ Boroda, думаю, можно, но ковыряться лень и некогда)

Boroda — 30 ноября 2010 @ 23:43

Спасибо уже сделал.

Оставить комментарий

Текст комментария:

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.


скачать русский wordpress | 51 запросов. 0.713 секунд | /2009/11/30/vyvod-dochernix-kategorij-v-wordpress-2/
hd fly e146 michael jackson beat it sony vegas pro 11 bionic commando 2 powerpoint 2007 narod ru rtm windows 7 7601 creative 1.6 final word c c catch samsung spica gt i5700 6.68 navitel navigator 5.0 0.1069 2012 x men origins lineage 2 interlude mcdonalds rar file amd athlon 64 5400 2110 daiwa crossfire 2 5 7 music 2003 harry potter lego pc sony vegas cutting lg p500 170 2 sony vegas pro 9.0 e 5530 real steel 2011 windows 10 vegas pro 11 keygen windows 7 skachat igry torrent adidas star wars 2012 igo 2011 baby girl devil may cry 1 acer microsoft oblivion 80 90 2010 torrent google chrome windows 7 com mp3 warcraft 3.3 5 a 100 xp sp3 c lite codec warcraft cs 1.6 napoleon total war imperial torrent sony playstation portable windows xp professional x86 empire earth 3 media studio pro criminal 6.5 nfs ru chica bomb mix opera mobile 10 rus 50 2 samsung sgh i900 witu 8gb sony ericsson arc liveresult 2011 2012 windows 7 sp1 acronis ethernet gps nokia 5230 windows xp final ccleaner google chrome psp samsung s5230 mozilla firefox 3.5 rus windows 7 x86 rus autocad 2010 torrent blu ray