Мне нужно исключить категорию и ее подкатегории в сообщениях. Это код, над которым я работаю, и он работает:
<?php $categories = wp_get_post_terms($post->ID, 'category'); $categories = wp_list_filter($categories, array('slug'=>'regione'), 'NOT'); $categories = wp_list_filter($categories, array('slug'=>'lazio'), 'NOT'); $categories = wp_list_filter($categories, array('slug'=>'rm'), 'NOT'); if (!empty($categories)) { ?> <ul class="category"> <?php foreach ($categories as $category) { $cat = get_category($category); echo '<li><a href="' . get_category_link($category) . '">' . $cat->name . '</a></li>'; } ?> </ul>
Хотя в категории «regione» более 20 подкатов, и у каждого подката есть от 5 до 10 других подкатов: какое-либо предложение о том, как лучше всего исключить основную категорию и ее детей?
Я отвечаю на вопрос, как через 6 месяцев, поэтому я ожидаю, что качество моего ответа не будет соответствовать стандартам WPSE и, следовательно, понравится обратная связь от другого опыта гуру WPSE.
Добавьте к функции functions.php следующую функцию
function filter_category_list_by_slug( $slug, $categories ) { $excluded_parent = get_category_by_slug( $slug ); $excluded_cats = get_categories( array( 'child_of' => $excluded_parent->term_id ) ); $excluded_cats[] = $excluded_parent; $filtered = array(); $matched = false; foreach ($categories as $category ) { $matched = false; foreach( $excluded_cats as $ex_cat ) { if ( $category->term_id == $ex_cat->term_id ) { $matched = true; } } if ( ! $matched ) { $filtered[] = $category; } } return $filtered; }
И фильтр списка категорий выглядит следующим образом:
$categories = wp_get_post_terms($post->ID, 'category'); $categories = filter_category_list_by_slug( 'regione', $categories ); $categories = filter_category_list_by_slug( 'lazio', $categories ); $categories = filter_category_list_by_slug( 'rm', $categories );