@smurzak3

Как правильно реализовать фильтр произвольных типов записей на WP?

Есть шаблон archive.php. В нём выводятся произвольные типы записей books.
62265928d7fe4203925348.png
Для этого типа записи я присвоил таксономию
'taxonomies' => ['category'],
Как будет правильней реализовать фильтр по категории? Я пробовал через js, т.е задавать атрибуты и по ним выводить нужные посты, но если у поста есть 2 категории, то логика ломается. Через ajax вряд ли получится, т.к это не форма, и категории выводятся вот так
<div class="genre-block">
                        <div class="title">Жанры</div>
                        <ul class="genre__container">   
                            <?php wp_list_categories('child_of=6&hide_empty=0&title_li=0'); ?>
                        </ul>
                    </div>
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ответы на вопрос 2
@SkyMass
Добрый день. Для начала вам нужно сделать отдельный шаблон archive-books.php и в нём стандартный цикл вордпресс заменить на wp_query Про wp_query смотрите тут. Потом где вы выводите категории, делаете форму с методом GET

А потом берете из параметров данные и подставляете в запрос. Примерно так:

$default = array(
							'post_type' 		=> 'books',
							'post_status' 		=> 'publish',
							'posts_per_page' 	=> 12,
							'tax_query' 	=> [
								'relation' 	=> 'AND',
								
							],

						);
							

								if ( ! empty($_GET['books_cat'])) {

									$books_cat_arr = [];

									foreach ($_GET['books_cat'] as $key => $elem) {

										$books_cat_arr[] = $key;

									}

									$default['tax_query'][] = [
										'taxonomy' => 'category',
										'field' => 'slug',
										'terms' => $books_cat_arr,
									];

								}

							}

							$query = new WP_Query( $default );
							
							if ( $query->have_posts() ) {
							
								while ( $query->have_posts() ) {
									$query->the_post();
									
									get_template_part( 'template-parts/content', 'new-buildings-list' );
						
									$count_buildings =  $query->found_posts;
								}
							
							} else {
						
								get_template_part( 'template-parts/content', 'none' );
							
							}
							
							wp_reset_postdata();
Ответ написан
Комментировать
artzolin
@artzolin Куратор тега WordPress
php, WordPress разработка сайтов artzolin.ru
Для SEO, да и вообще по логике проще всего сделать с помощью активных ссылок на таксономии. И правильно вам подсказывают, что для кастомного типа записи лучше зарегистрировать свои таксономии, только называл бы я ее genres

Получить элементы таксономий можно с помощью запроса get_terms()

$terms = get_terms( [
	'taxonomy' => 'genres',
	'hide_empty' => false,
] );

if ( $terms ) {
	echo '<ul class="genres-list">';
	foreach ( $terms as $key => $term ) {
		echo '<li><a href="' . get_term_link( $term->term_id, $term->taxonomy ) . '">' . $term->name . '</a></li>';
	}
	echo '</ul>';
}


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

if ( is_post_type_archive( 'book' ) ) {
	// ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы