Как исправить ajax фильтр?

160
24 января 2020, 08:40

Пишу фильтр на с использованием ajax, который выдает пост по содержанию кастомного поля.

jQuery(function(){
    jQuery('#test').submit(function(){
        var filter = jQuery('#test');
        var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
        jQuery.ajax({
            url:ajaxurl,
      data:filter.serialize(),
      type: 'POST',
success:function(data){
                jQuery('#ajax-test').html(data);
        }
        });
        return false;
    });
});

Вот сам ajax запрос, и в первую очередь грешу на него, хотя ошибок не вижу.

<form id="test">
        <input name="the-date"></input>
  <input type="hidden" name="action" value="date_filtering" />
    <button type="submit">Отфильтровать</button>
</form>
<div id="ajax-test"></div>

Форма из которой я беру данные и блок, в который вывожу результат

function events_date_filter() {
$the_date = $_POST['the-date'];
if( isset( $the_date ))
$notargs = array(
'post_type' => 'events',
'showposts' => 3,
'meta_key' => 'event_time',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
    array(
        'key' => 'event_date',
        'value' =>$the_date,
        'compare' => 'IN',
    )
)
);
query_posts( $notargs );
$query = new WP_Query( $notargs );
    if( $notargs->have_posts() ) :
        while( $notargs->have_posts() ): $notargs->the_post();
            echo '<h2>' . $notargs->post->post_title . '</h2>';
        endwhile;
        wp_reset_postdata();
    else :
        echo 'Что-то пошло не так';
    endif;
}
add_action('wp_ajax_date_filtering', 'events_date_filter');
add_action('wp_ajax_nopriv_date_filtering', 'events_date_filter');

И php обработчик. Как говорится, в теории должно работать, но нет. В ответ от admin-ajax.php получаю ошибку 400, в не зависимости от того, я делаю. С начала решил, что data передается не корректно, сделал beforeSend с console.log(data) и вроде как получил корректные данные, необходимые для передачи.

Answer 1

Ответ 400 выдаёт admin-ajax.php. Это уже хорошо, значит, вы до него достучались. Выдаёт он 400 в следующих случаях:

  • если не определен элемент $_REQUEST['action']
  • если нет хука или он назван неправильно.

У вас правильно задан хук, буквы в action и в хуке совпадают (бывает микс из русских/английских, но я проверил).

Проблема в том, что вы сериализуете данные, поэтому в отправленных данных отсутствует поле action. Сделайте так:

jQuery( function() {
    jQuery( '#test' ).submit( function() {
        var filter  = jQuery( '#test' );
        var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
        jQuery.ajax( {
            url: ajaxurl,
            action: 'date_filtering',
            type: 'POST',
            success: function( data ) {
                jQuery( '#ajax-test' ).html( data );
            }
        } );
        return false;
    } );
} );
READ ALSO
Как вывести массив в массиве красиво разложив? [закрыт]

Как вывести массив в массиве красиво разложив? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

134
Получение ключа доступа приложения в VK

Получение ключа доступа приложения в VK

Всем привет, нужна помощь, хотел сделать бота в группу в вк, но появилась ошибка при получении токена приложенияПерехожу по такой ссылке:

180
Как в DetailView отобразить отформатированный массив?

Как в DetailView отобразить отформатированный массив?

Есть у меня поле в модели с Json строкойКак ей можно отобразить в как отоформатированный массив в DetailView::widget? То есть мне нужно сделать тоже...

173