Вопрос или проблема
Вот мой код, он должен фильтровать по категориям, он отображает все записи при клике на любую галочку, я не знаю, как это исправить, я перепробовал всё.
<form id="filter">
<?php
if( $terms = get_terms( 'category', 'orderby=name' ) ) : // для упрощения я использую стандартные категории
foreach ( $terms as $term ) :
echo '<input type="checkbox" name="category[]" value="' . $term->term_id . '" class="br">' . $term->name;
echo '';
endforeach;
endif;
?>
<div class="filter-output"></div>
</form>
Вот js (замечен внутри страницы-шаблона)
jQuery('#filter .br').click(function(){
// Объявление массива
var choices = {};
jQuery('.contents').remove();
jQuery('.filter-output').empty();
jQuery('input[type=checkbox]:checked').each(function() {
if (!choices.hasOwnProperty(this.name))
choices[this.name] = [this.value];
else
choices[this.name].push(this.value);
});
console.log(choices);
jQuery.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type :'POST',
data : {
'action' : 'call_post', // Имя PHP функции
'choices' : choices,
},
success: function (result) {
jQuery('.filter-output').append(result);
// Для тестирования - Результат (можно позже удалить)
//console.log(Resultaat);
//console.log(Keuzes);
},
error: function(err){
// Для тестирования - Ошибка (можно позже удалить)
console.log(err);
console.log(choices);
}
});
})
functions.php
add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');
function call_post(){
// Получение данных AJAX:
$choices = $_POST['choices'];
$meta_query = array('relation' => 'OR');
foreach($choices as $Key=>$Value){
if(count($Value)){
foreach ($Value as $Inkey => $Invalue) {
$meta_query[] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => '=' );
}
}
}
$args = array(
'post_type' => 'post',
'meta_query' =>$meta_query
);
$query = new WP_Query($args);
//if( ! empty ($params['template'])) {
////$template = $params['template'];
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
the_title();
endwhile;
wp_reset_query();
else :
wp_send_json($query->posts);
endif;
//}
die(); }
Пожалуйста, кто-нибудь помогите, я пытался сделать это с вчерашнего дня и безуспешно!
Это работает в моем проекте
if (!empty($Value)){
$meta_array = array('relation'=>'OR');
foreach ($Value as $key => $Inkey ) {
array_push($meta_array,
array(
'key' => 'your_key',
'value' => $value->term_id,
'compare' => 'EXISTS'
)
);
}
}
Ответ или решение
Чтобы решить вашу проблему с фильтрацией постов по категориям с помощью AJAX в WordPress, необходимо внести несколько изменений в ваш код. Основная проблема заключается в том, что вы используете meta_query
, чего не следует делать, если хотите фильтровать посты по категориям. Вместо этого следует использовать аргумент tax_query
, который позволяет фильтровать записи по терминологии таксономий, например, категории.
Вот исправленный код для вашего проекта:
1. Код HTML и JavaScript в шаблоне
Здесь вам не нужно вносить изменения, только убедитесь, что используете правильный класс для чекбоксов и что admin-ajax.php
правильно подключен.
2. Ваш файл функций functions.php
Измените функцию call_post
следующим образом:
add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');
function call_post() {
// Получение данных AJAX
$choices = $_POST['choices'];
// Подготовка массива для tax_query
$tax_query = array('relation' => 'OR');
if (!empty($choices['category'])) {
foreach ($choices['category'] as $term_id) {
$tax_query[] = array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => intval($term_id) // Приведение к целому числу для безопасности
);
}
}
// Аргументы для WP_Query
$args = array(
'post_type' => 'post',
'tax_query' => $tax_query
);
// Создаём новый запрос к постам
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()): $query->the_post();
the_title('<h2>', '</h2>'); // Оберните заголовок в форматированный элемент
endwhile;
wp_reset_postdata();
else :
echo 'Нет записей для отображения'; // Сообщение, если записей нет
endif;
die(); // Завершение работы функции
}
Что было изменено:
- Использование
tax_query
: Заменилиmeta_query
наtax_query
для фильтрации по категориям. - Подготовка массива терминов: Мы добавляем массив с условиями таксономии, используя
term_id
непосредственно. - Улучшена безопасность: При обработке идентификаторов терминов мы используем
intval()
для предотвращения инъекций. - Результат обработки: Добавлена обработка вывода, когда нет записей, чтобы пользователь знал, что фильтрация привела к отсутствию результатов.
Заключение
Теперь, когда вы измените код на вышеизложенный, ваш AJAX-фильтр должен работать корректно, и посты будут фильтроваться по выбранным вами категориям. Не забудьте обновить и протестировать ваш код после внесённых изменений.