В WordPress AJAX-фильтр возвращает все записи, хотя должен фильтровать по категории.

Вопрос или проблема

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

<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(); // Завершение работы функции
}

Что было изменено:

  1. Использование tax_query: Заменили meta_query на tax_query для фильтрации по категориям.
  2. Подготовка массива терминов: Мы добавляем массив с условиями таксономии, используя term_id непосредственно.
  3. Улучшена безопасность: При обработке идентификаторов терминов мы используем intval() для предотвращения инъекций.
  4. Результат обработки: Добавлена обработка вывода, когда нет записей, чтобы пользователь знал, что фильтрация привела к отсутствию результатов.

Заключение

Теперь, когда вы измените код на вышеизложенный, ваш AJAX-фильтр должен работать корректно, и посты будут фильтроваться по выбранным вами категориям. Не забудьте обновить и протестировать ваш код после внесённых изменений.

Оцените материал
Добавить комментарий

Капча загружается...