Фильтр вывода записей в WordPress?

Сделал AJAX фильтр записей WordPress. Для простоты включил в него только чекбокс, который включает сортировку записей по порядку (ASC).

Вот функция-обработчик в functions.php, которая делает вывод записей через функцию get_posts():

function true_filter_function(){
    $args = array(
        'post_type'   => 'pizza',
        'order'       => 'DESC',
    );

    // условие: включено ASC - сортировка по порядку
    if ( isset( $_POST['in_order'] ) && $_POST['in_order'] == 'on' ) {
        $args['order'] = 'ASC';
    }

    echo "<pre>";
    print_r( $args  );
    echo "</pre>";

    $pizza = get_posts( $args );

    return $pizza;

}

add_action('wp_ajax_myfilter', 'true_filter_function');
add_action('wp_ajax_nopriv_myfilter', 'true_filter_function');


Это фильтр и вывод постов на странице:
<!-- Фильтр -->
                <form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
                    <label><input type="checkbox" name="in_order"/>Включить сортировку по порядку</label>
                    <button>Применить фильтр</button>
                    <input type="hidden" name="action" value="myfilter">
                </form>
                <div id="response"></div>

                <!-- Вывод постов -->
                <?php
                    $pizza = true_filter_function();

                    foreach ($pizza as $post) : setup_postdata($post); ?>
                    <div class="post__item">
                        <h1><?php the_title(); ?></h1>
                        <?php the_post_thumbnail('thumbnail'); ?>
                    </div>
                <?php endforeach; wp_reset_postdata(); ?>


jQuery-скрипт:
jQuery(function($){
    $('#filter').submit(function(){
        var filter = $(this);
        $.ajax({
            url:filter.attr('action'), // обработчик
            data:filter.serialize(), // данные
            type:filter.attr('method'), // тип запроса
            beforeSend:function(xhr){
                filter.find('button').text('Загружаю...'); // изменяем текст кнопки
            },
            success:function(data){
                filter.find('button').text('Применить фильтр'); // возвращаем текст кнопки
                $('#response').html(data);
            }
        });
        return false;
    });
});


В functions.php сделал print_r( $args );. При включении чекбокса "Включить сортировку по порядку" и нажатии на кнопку "Применить фильтр" видно, что в массиве $args меняется значение ключа 'order' с 'DESC' на 'ASC':
5c9b62c11f2a0787377663.png
5c9b62ce2c516425275124.png

но на порядок вывода записей это почему-то никак не влияет.

Подскажите, что я делаю не так?
  • Вопрос задан
  • 1613 просмотров
Решения вопроса 1
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
Несколько вопросов, которые возникли по ходу дела:
1) Вы подписались на хуки для ajax? Надо подписаться на два хука.
2) Вы вместе с запросом должны передать еще один параметр, по-моему называется action, только не action из html в теге form, этот action отработает как слаг при вызове обработки ajax, на сервере.
3) Вы проверили какой адрес получается в action, он правильный?
4) Без preventDefault нет перезагрузки страницы? В js стоит обработка события submit, при этом стандартное действие браузера Вы не отменяете, по идее должна идти перезагрузка страницы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 12:53
1000 руб./за проект
19 апр. 2024, в 12:41
8000 руб./за проект
19 апр. 2024, в 12:05
1500 руб./в час