scottb
  • 0
Гуру

Отфильтровать дочерние элементы категории «без категорий» вне цикла?

  • 0

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

Как я могу убедиться, что любой вызов 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>
Share
  1. Привет @ Скотт Б :

    ОБНОВЛЕНИЕ ИЗ ПРЕДЫДУЩЕГО ОТВЕТА : Из-за ваших явно плохих навыков понимания прочитанного (!), Где я пропустил требование отфильтровать детей (спасибо @Adam BlackStrom за привлечение внимания к моей оплошности), я изменил предоставленный код.


    Я думаю, вы хотите использовать list_terms_exclusions хук фильтра. Добавьте это в свой плагин (или другие, нуждающиеся в том же, добавьте в конец functions.php файла вашей темы):

    function my_list_terms_exclusions($exclusions,$args) {
      $children = implode(',',get_term_children(1,'category'));
      $children = (empty($children) ? '' : ",$children");
      return $exclusions . " AND (t.term_id NOT IN (1{$children}))";
    }
    

    Конечно, приведенное выше повлияет на все списки категорий, которые вам могут не понадобиться, поэтому вам может потребоваться проверить значения в $args массиве или, что более вероятно, проверить другое глобальное состояние, чтобы добавить критерии фильтра только в том контексте (контекстах), в котором вам это нужно..

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

    PS Также я согласен с Адамом. Если возможно, используйте пользовательскую таксономию.

    • 0
    • Ах, я пропустил этот фильтр, когда читал get_terms() ! Может быть, это в сочетании с get_term_children() является ответом; Я предполагаю, что ваш код по-прежнему будет возвращать дочерние элементы «Без категории».

      • 0
    • @Adam: Не знаю, как ответить, поэтому просто объясню. Я взял код @Scott B и запустил операторы echo + exit, чтобы вывести значение $exclusions . Это было " AND ( t.term_id <> 1 )" и без $cat_args['exclude_tree'] = 1; него было пустым, что сказало мне, чтобы фильтр добавил его. Читая код, казалось, что он исключает все, что относится к категории cat=1 . Я не исследовал и не тестировал дальше этого.

      • 0
    • Верно, он правильно исключает term_id 1 («Без категории»), но по-прежнему будет показывать дочерние категории. Чтобы работать на Скотта, вам также необходимо явно исключить все дочерние категории «Без категорий».

      • 0
    • @Adam Адам, возможно, я что-то упускаю, но, читая комментарии @Scott B, кажется, что ему нужно исключить родителя только потому, что он заявляет. Возможно, он поможет нам и уточнит, какое из этих решений соответствует его конкретному варианту использования.

      • 0
    • В своем вопросе он спрашивает: «Как я могу убедиться, что любой вызов wp_list_categories() исключает дочерние категории под «некатегоризированным» cat_id = 1?»

      • 0
    • HI EAMann, спасибо за быстрый ответ. Теперь я могу без проблем исключать категории, передавая родительский идентификатор. См. мой код выше, аргумент exclude_tree делает именно это. Тем не менее, это МОЙ собственный плагин, поэтому я могу позволить себе такую ​​роскошь. Я пытаюсь (продолжение…)

      • 0
    • … заставьте это исключение в файлах моей темы, чтобы категория всегда исключалась из любого вызова wp_list_categories…

      • 0
    • @EAMann : как вы, вероятно, поняли, вам придется передавать $args по ссылке (т.е. использовать &$args ), чтобы приведенный выше код работал, за исключением того, что WordPress передал значение при запуске apply_filter(), поэтому, к сожалению, вы не можете этого сделать.

      • 0
    • @MikeSchinkel… да, вот где я застрял с этим решением…

      • 0
    • Адам, ты прав. Если бы я знал, как создавать свои собственные таксономии, это был бы правильный путь. Как бы то ни было, использование встроенной системы категорий было быстрым и простым способом сделать это с минимальными побочными эффектами 🙂 Я рассмотрю ваше предложение по обновлению моей темы…

      • 0
  2. Новый ответ на основе комментариев ОП:

    Нет фильтра или хука, который можно использовать с wp_list_categories, но есть фильтр для get_categories функции, которую он вызывает.

    Функция get_categories делает этот вызов:

    $taxonomy = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args );
    

    Переменная $args в этом случае представляет собой массив, изначально созданный из, wp_list_categories а затем объединенный с ним 'taxonomy' => 'category' . Таким образом, вы должны иметь возможность добавить сюда фильтр, чтобы всегда устанавливать exclude_tree='1' .

    Только не забудьте указать, что ваша функция принимает два параметра:

    function exclude_children($taxonomy, $args) {
        $args['exclude_tree'] => '1';
    }
    
    add_filter('get_categories_taxonomy', 'exclude_children', 10, 2);
    
    • 0
  3. Вот некоторый код, который нужно изменить get_terms(), чтобы исключить «Без категории» и любые дочерние элементы:

    // modify the term list to exclude "Uncategorized" and any children
    function no_uncategorized( $terms, $taxonomies, $args ) {
        global $my_excluded_categories;
    
        $uncategorized = term_exists( 'Uncategorized', 'category' );
    
        $my_excluded_categories = get_term_children( $uncategorized['term_id'], 'category' );
        $my_excluded_categories[] = $uncategorized['term_id'];
    
        $terms = array_filter( $terms, 'no_uncategorized_filter' );
    
        return $terms;
    }
    
    // used by array_filter to exclude anything in the excluded categories
    function no_uncategorized_filter( $category ) {
        global $my_excluded_categories;
        return !in_array( $category->term_id, $my_excluded_categories );
    }
    
    // only done during template_redirect (the public-facing site)
    function do_template_redirect() {
        add_filter( 'get_terms', 'no_uncategorized', 10, 3 );
    }
    add_action( 'template_redirect', 'do_template_redirect' );
    

    Я думаю, что реальный ответ, однако, заключается в том, чтобы не использовать категории, вместо этого зарегистрировать свою собственную таксономию. Больше никаких скрытых категорий, только частная таксономия, которая не подхватывается wp_list_categories() .

    • 0

Оставить ответ

You must login to add an answer.