Отображение только одной категории на странице портфолио. НО фильтрация оставшихся категорий с изотопом

Я построил тему WordPress для изотопов, которая до сих пор работает отлично:

Все, что размещено в портфолио персонализированного типа, отображается на главной странице и можно фильтровать по таксономии «портфельная категория» с использованием плагина Isotope JQuery.

Все идет нормально.

Однако я хочу сделать небольшое улучшение.

Я хочу, чтобы на главной странице отображались элементы портфеля FEATURED. Например, только элементы портфеля с классификацией таксономии «признакам». Эта часть, которую я легко выполнила с помощью пользовательского запроса (см. Фрагмент кода ниже).

Проблема, с которой я сталкиваюсь, – отображать фильтруемые кнопки. Я не хочу, чтобы фильтруемая кнопка говорила «Featured» (игнорирует точку), и я не хочу, чтобы появлялись таксономии, которые не применимы к каким-либо признакам (потому что если щелкнуть, все отображаемые элементы портфеля будут исчезают).

Вот мой текущий запрос, чтобы показать элементы портфеля. Здесь нет проблем:

<?php // Query the portfolio posts $args = array( 'post_type' => 'portfolio', 'portfolio-category' => 'featured', 'posts_per_page' => -1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); ?> <!-- PORTFOLIO ITEM --> <?php endwhile; ?> 

И вот код, который я имею в настоящее время, который выводит фильтруемые таксономии. Это то, что нужно решать.

 <?php $terms = get_terms('portfolio-category'); $count = count($terms); echo '<li class="filtering"><a href="#" title="" data-filter="*" class="button-primary">All</a></li>'; if ( $count > 0 ){ foreach ( $terms as $term ) { $termname = strtolower($term->name); $termname = str_replace(' ', '-', $termname); echo '<li class="filtering"><a href="#" title="" data-filter=".'.$termname.'">'.$term->name.'</a></li>'; } } ?> 

Большое спасибо!

Solutions Collecting From Web of "Отображение только одной категории на странице портфолио. НО фильтрация оставшихся категорий с изотопом"

Вы можете просто получить условия из текущего запроса. Для этого вы можете использовать wp_get_object_terms() , но он ожидает идентификаторы, которые мы можем извлечь, используя wp_list_pluck() в свойстве объектов объектов запроса. Кажется, вам нужны только имена, которые мы можем извлечь снова с помощью wp_list_pluck() из результата wp_get_object_terms() . И последнее, но не менее важное: возвращаемый массив может иметь дубликаты, поэтому мы делаем его уникальным с помощью array_unique() . Таким образом, это выглядит несколько следующим образом:

 $args = array( 'post_type' => 'portfolio', 'portfolio-category' => 'featured', 'posts_per_page' => -1 ); $loop = new WP_Query( $args ); $loop_posts = $loop->posts; $loop_posts_ids = wp_list_pluck( $loop_posts, 'ID' ); $loop_term_objects = wp_get_object_terms( $loop_posts_ids, 'portfolio-category' ); $loop_term_names_not_unique = wp_list_pluck( $loop_term_objects, 'name' ); $loop_term_names_unique = array_unique( $loop_term_names_not_unique ); 

Оттуда вы можете создать свои кнопки фильтров для этого конкретного запроса. Просто удалите featured термин из массива или пропустите вывод для него в вашем цикле foreach чтобы он не отображался.


Редактировать:

Ниже некоторого кода для тестирования, а точнее, доказательства концепции метода. Он вернет имена терминов в пост-архиве post post aka »Страница для сообщений« и отдельные просмотры сообщений post post – в противном случае на других страницах он будет пустым. Вы можете поместить это в свой файл functions.php – вам нужен PHP 5.3 ++ из-за анонимной функции.

 add_action( 'shutdown', function () { global $wp_query; echo '<pre>'; foreach ( array_unique( wp_list_pluck( wp_get_object_terms( wp_list_pluck( $wp_query->posts, 'ID' ), 'category' ), 'name' ) ) as $term_name ) { print_r( $term_name . '<br>' ); } echo '</pre>'; }); 

@ialocin много спасибо. У меня есть работа. Вот мой полный код на основе вашего:

 <?php $args = array( 'post_type' => 'portfolio', 'portfolio-category' => 'featured', 'posts_per_page' => -1 ); $loop = new WP_Query( $args ); $loop_posts = $loop->posts; $loop_posts_ids = wp_list_pluck( $loop_posts, 'ID' ); $loop_term_objects = wp_get_object_terms( $loop_posts_ids, 'portfolio-category' ); $loop_term_names_not_unique = wp_list_pluck( $loop_term_objects, 'name' ); $loop_term_names_unique = array_unique( $loop_term_names_not_unique ); echo '<li class="filtering"><a href="#" title="" data-filter="*" class="button-primary">All</a></li>'; // start loop foreach ( $loop_term_names_unique as $term ) { $termfilter = strtolower($term); $termfilter = str_replace(' ', '-', $termfilter); echo '<li class="filtering"><a href="#" title="" data-filter=".'.$termfilter.'">'.$term.'</a></li>'; } // end loop ?> 

Все, что мне нужно выяснить, теперь удаляет «признакам» из массива, поэтому сама категория портфеля не отображается как фильтруемая статья.

Огромное спасибо.