Вопрос или проблема
Я хотел бы отображать посты, когда я нажимаю на элемент с выпадающим списком
В настоящее время мой выбор OK, все мои термины отображаются, и все посты тоже.
Я просто хочу знать, возможно ли отфильтровать
Это мой выпадающий список:
<select name="soins-taxonomy">
<option value="all">Показать все</option>
<?php
// Получите термины таксономии
$terms = get_terms(
array(
'taxonomy' => 'location',
'hide_empty' => false,
'exclude' => 1
)
);
// Проверьте, существуют ли какие-либо термины
if ( ! empty( $terms ) && is_array( $terms ) ) {
// Выполните цикл и выведите их все
foreach ( $terms as $term ) { ?>
<?php echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
}
}
?>
</select>
А это мой запрос для отображения постов:
<?php
$ourCurrentPage = get_query_var('paged');
$args = array(
'order' => 'ASC',
'post_type' => 'etablissements',
'taxonomy' => 'location',
'posts_per_page' => 9,
'paged' => $ourCurrentPage
);
// Пользовательский запрос.
$query_loc = new WP_Query( $args );
// Проверьте, есть ли результаты запроса.
if ( $query_loc->have_posts() ) {
// Начните перебор результатов запроса.
while ( $query_loc->have_posts() ) {
$query_loc->the_post();?>
<!-- НАЧАЛО СТАТЬИ -->
<div class="col-xl-4 col-lg-6 col-md-6 mb-30">
<div class="single-etablissement">
<p class="single-etablissement-title"><?php the_title(); ?></p>
<p><?php the_field('eta_adress'); ?></p>
<p><?php the_field('eta_cp'); ?> - <?php the_field('eta_city'); ?></p>
<p><?php the_field('eta_country'); ?></p>
</div>
</div>
<!-- КОНЕЦ СТАТЬИ -->
<?php
} // Конец while
} // Конец if
else { echo '<p>Нет найденных новостей</p>'; } ?>
<?php wp_reset_postdata(); ?>
Вы можете использовать tax_query
для параметров таксономии для вашего WP_Query.
$term_id = $_REQUEST ['soins-taxonomy']; // или используйте $_POST или $_GET в зависимости от ситуации
$args = array(
'order' => 'ASC',
'post_type' => 'etablissements',
'tax_query' => array(
array(
'taxonomy' => 'location',
'field' => 'term_id',
'terms' => $term_id,
),
'posts_per_page' => 9,
'paged' => $ourCurrentPage
);
Надеюсь, это поможет.
<?php $location = isset($_GET['location']) ? $_GET['location'] : '';?>
<form action="" method="GET" >
<select name="location" id="location" onchange="submit();">
<option value="" <?php echo ($location == 'location') ? ' selected="selected"' : 'location'; ?>>Показать все</option>
<?php
$locations = get_categories('taxonomy=location&post_type=etablissements');
foreach ($locations as $location) :
echo '<option value="'.$location->slug.'"';
echo ($location == ''.$location->slug.'') ? ' selected="selected"' : '';
echo '>'.$location->slug.'</option>';
endforeach;
?>
</select>
</form>
$taxs = array();
if( isset($_GET['location']) && '' != $_GET['location']) {
$taxs[] = array(
'taxonomy' =>'location',
'field' => 'slug',
'terms' => $location
);
}
$args['tax_query'] = $taxs;
может быть, это вам поможет 🙂
Ответ или решение
Фильтрация постов с помощью выпадающего списка в WordPress
В этом руководстве мы рассмотрим, как с помощью выпадающего списка (dropdown select) отфильтровать посты на вашем сайте WordPress, основываясь на выбранной таксономии. Вы уже правильно настроили выбор таксономии и отображение постов, поэтому мы сосредоточимся на внедрении логики фильтрации.
Шаг 1: Настройка выпадающего списка
Ваш текущий код для создания выпадающего списка содержит все необходимые термины, что является хорошей основой. Однако необходимо добавить функциональность для фильтрации постов по выбранной категории из выпадающего списка.
Вот ваш текущий код для выпадающего списка:
<select name="soins-taxonomy">
<option value="all">Tout afficher</option>
<?php
// Получение терминов таксономии
$terms = get_terms(array(
'taxonomy' => 'location',
'hide_empty' => false,
'exclude' => 1
));
// Проверка наличия терминов
if (!empty($terms) && is_array($terms)) {
foreach ($terms as $term) {
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
}
}
?>
</select>
Для добавления функции фильтрации, вам нужно обернуть этот код в форму, которая будет отправлять запрос на сервер при изменении значения выпадающего списка. Измените ваш код следующим образом:
<form action="" method="GET">
<select name="soins-taxonomy" onchange="this.form.submit();">
<option value="all">Tout afficher</option>
<?php
$terms = get_terms(array(
'taxonomy' => 'location',
'hide_empty' => false,
'exclude' => 1
));
if (!empty($terms) && is_array($terms)) {
foreach ($terms as $term) {
echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
}
}
?>
</select>
</form>
Шаг 2: Обработка выбора и изменение WP_Query
Теперь, когда у вас есть форма для отправки выбранного значения, вы можете обработать этот ввод в вашем запросе к базе данных. Измените код вашего запроса WP_Query
, добавив параметр tax_query
для фильтрации постов по выбранному термину:
$term_id = isset($_GET['soins-taxonomy']) ? $_GET['soins-taxonomy'] : 'all';
$ourCurrentPage = get_query_var('paged');
$args = array(
'order' => 'ASC',
'post_type' => 'etablissements',
'posts_per_page' => 9,
'paged' => $ourCurrentPage,
);
// Добавление tax_query если был выбран не "Tout afficher"
if ($term_id !== 'all') {
$args['tax_query'] = array(
array(
'taxonomy' => 'location',
'field' => 'term_id',
'terms' => $term_id,
),
);
}
// Выполнение пользовательского запроса.
$query_loc = new WP_Query($args);
// Проверка наличия постов.
if ($query_loc->have_posts()) {
while ($query_loc->have_posts()) {
$query_loc->the_post();
?>
<div class="col-xl-4 col-lg-6 col-md-6 mb-30">
<div class="single-etablissement">
<p class="single-etablissement-title"><?php the_title(); ?></p>
<p><?php the_field('eta_adress'); ?></p>
<p><?php the_field('eta_cp'); ?> - <?php the_field('eta_city'); ?></p>
<p><?php the_field('eta_country'); ?></p>
</div>
</div>
<?php
}
} else {
echo '<p>Aucune actualité trouvée</p>';
}
wp_reset_postdata();
Заключение
Теперь ваш выпадающий список будет корректно фильтровать посты в зависимости от выбранного термина таксономии. При изменении выбранного элемента пользователь будет перенаправлен на ту же страницу с обновлённым списком постов. Это даёт пользователям возможность удобно находить желаемую информацию на вашем сайте.
Такой подход не только позволяет улучшить взаимодействие с пользователем, но также может положительно сказаться на SEO, благодаря увеличению времени, проведенному на сайте, и уменьшению показателя отказов.