Фильтр вывода записей в 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.png5c9b62ce2c516425275124.png

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

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

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

Войти через центр авторизации
Похожие вопросы