У меня есть несколько служебных категорий, которые используются только моей темой. Чтобы помочь разделить эти категории, я помещаю их все как дочерние элементы некатегоризированных.
Как я могу убедиться, что любой вызов wp_list_categories() исключает дочерние категории под «некатегоризированным» cat_id = 1?
Я хочу, чтобы это работало, даже если вызов wp_list_categories() исходит от стороннего плагина, который я не контролирую.
Возможно, я могу поместить фильтр в functions.php, который перехватывает любой вызов функции wp_list_categories() для присоединения exlude_tree = ‘1’ к аргументам.
Например, в моем собственном виджете плагина категорий я использую это…
<ul>
<?php
$cat_args['title_li'] = '';
$cat_args['exclude_tree'] = 1;
wp_list_categories(apply_filters('widget_categories_args', $cat_args));
?>
</ul>
Привет @ Скотт Б :
ОБНОВЛЕНИЕ ИЗ ПРЕДЫДУЩЕГО ОТВЕТА : Из-за ваших явно плохих навыков понимания прочитанного (!), Где я пропустил требование отфильтровать детей (спасибо @Adam BlackStrom за привлечение внимания к моей оплошности), я изменил предоставленный код.
Я думаю, вы хотите использовать
list_terms_exclusions
хук фильтра. Добавьте это в свой плагин (или другие, нуждающиеся в том же, добавьте в конецfunctions.php
файла вашей темы):Конечно, приведенное выше повлияет на все списки категорий, которые вам могут не понадобиться, поэтому вам может потребоваться проверить значения в
$args
массиве или, что более вероятно, проверить другое глобальное состояние, чтобы добавить критерии фильтра только в том контексте (контекстах), в котором вам это нужно..Если у вас есть конкретные сведения о том, где вам нужна помощь в ограничении, задайте дополнительный вопрос, чтобы мы могли помочь.
PS Также я согласен с Адамом. Если возможно, используйте пользовательскую таксономию.
Ах, я пропустил этот фильтр, когда читал
get_terms()
! Может быть, это в сочетании сget_term_children()
является ответом; Я предполагаю, что ваш код по-прежнему будет возвращать дочерние элементы «Без категории».@Adam: Не знаю, как ответить, поэтому просто объясню. Я взял код @Scott B и запустил операторы
echo
+exit
, чтобы вывести значение$exclusions
. Это было" AND ( t.term_id <> 1 )"
и без$cat_args['exclude_tree'] = 1;
него было пустым, что сказало мне, чтобы фильтр добавил его. Читая код, казалось, что он исключает все, что относится к категорииcat=1
. Я не исследовал и не тестировал дальше этого.Верно, он правильно исключает term_id 1 («Без категории»), но по-прежнему будет показывать дочерние категории. Чтобы работать на Скотта, вам также необходимо явно исключить все дочерние категории «Без категорий».
@Adam Адам, возможно, я что-то упускаю, но, читая комментарии @Scott B, кажется, что ему нужно исключить родителя только потому, что он заявляет. Возможно, он поможет нам и уточнит, какое из этих решений соответствует его конкретному варианту использования.
В своем вопросе он спрашивает: «Как я могу убедиться, что любой вызов wp_list_categories() исключает дочерние категории под «некатегоризированным» cat_id = 1?»
HI EAMann, спасибо за быстрый ответ. Теперь я могу без проблем исключать категории, передавая родительский идентификатор. См. мой код выше, аргумент exclude_tree делает именно это. Тем не менее, это МОЙ собственный плагин, поэтому я могу позволить себе такую роскошь. Я пытаюсь (продолжение…)
… заставьте это исключение в файлах моей темы, чтобы категория всегда исключалась из любого вызова wp_list_categories…
@EAMann : как вы, вероятно, поняли, вам придется передавать
$args
по ссылке (т.е. использовать&$args
), чтобы приведенный выше код работал, за исключением того, что WordPress передал значение при запускеapply_filter()
, поэтому, к сожалению, вы не можете этого сделать.@MikeSchinkel… да, вот где я застрял с этим решением…
Адам, ты прав. Если бы я знал, как создавать свои собственные таксономии, это был бы правильный путь. Как бы то ни было, использование встроенной системы категорий было быстрым и простым способом сделать это с минимальными побочными эффектами 🙂 Я рассмотрю ваше предложение по обновлению моей темы…
Новый ответ на основе комментариев ОП:
Нет фильтра или хука, который можно использовать с
wp_list_categories
, но есть фильтр дляget_categories
функции, которую он вызывает.Функция
get_categories
делает этот вызов:Переменная
$args
в этом случае представляет собой массив, изначально созданный из,wp_list_categories
а затем объединенный с ним'taxonomy' => 'category'
. Таким образом, вы должны иметь возможность добавить сюда фильтр, чтобы всегда устанавливатьexclude_tree='1'
.Только не забудьте указать, что ваша функция принимает два параметра:
Вот некоторый код, который нужно изменить
get_terms()
, чтобы исключить «Без категории» и любые дочерние элементы:Я думаю, что реальный ответ, однако, заключается в том, чтобы не использовать категории, вместо этого зарегистрировать свою собственную таксономию. Больше никаких скрытых категорий, только частная таксономия, которая не подхватывается
wp_list_categories()
.