Solución al error 400 Bad Request al usar AJAX en un tema personalizado

7 mar 2018, 16:40:00
Vistas: 26.5K
Votos: 1

He estado trabajando en un tema personalizado en el que estoy tratando de implementar una presentación de búsqueda mediante AJAX. He construido todo según varios tutoriales y guías, pero al inspeccionar la llamada a admin-ajax, sigue devolviendo errores 400... Me he quedado sin ideas y esperaba que alguien pudiera arrojar algo de luz sobre este problema.

functions.php

function load_search_results(){
$q = $_REQUEST['query'];
$post_type = $_REQUEST['post_type'];

$args = array(
    'post_type' => $post_type,
    'post_status' => 'publish',
    's' => $q,
);

$search = new WP_Query($args);

if ($search->have_posts()){
    echo json_encode('tiene entradas');
} else {
    echo json_encode('no se encontraron entradas');
}

wp_die();
}

add_action('wp_ajax_load_search_results', 'load_search_results');
add_action('wp_ajax_nopriv_load_search_results', 'load_search_results');

Registrando los scripts en functions.php también

wp_register_script('ajax-search', THEME_DIR .'/assets/js/ajax/search.ajax.js', array('jquery'), '1.0', false);
wp_enqueue_script('ajax-search');
wp_localize_script('ajax-search', 'myAjax', array('ajax_url' =>admin_url('admin-ajax.php')));

search.ajax.js

(function($) {

$(document).on('submit', '.controls-search', function(){
    var $form = $(this);
    var $input = $form.find('input[name="s"]');
    var query = $input.val();
    var $content = $('.licence');

    $.ajax({
        type: 'POST',
        post_type: 'shuffle_licence',
        url: myAjax.ajax_url,
        data: {
            action: 'load_search_results',
            query: query
        },
        beforeSend: function(){
            $input.prop('disabled', true);
            $content.addClass('loading')
        },
        succes: function(response){
            $input.prop('disabled', false);
            $content.removeClass('loading');
            $content.html(response);
        },
        dataType: 'html',
        contentType: 'application/json',
    });

    return false;

});

}(jQuery))
1
Comentarios

La propiedad post_type de tu solicitud AJAX debería estar en data, de lo contrario $_REQUEST['post_type'] no se establecerá. Además, este tipo de solicitud debería ser GET, no POST. Usa POST solo para solicitudes que tengan un 'efecto secundario' como agregar algo a la base de datos. Solo estás recuperando datos, por lo que GET es más apropiado.

Jacob Peattie Jacob Peattie
7 mar 2018 17:06:46
Todas las respuestas a la pregunta 1
2

Lo resolví. Eliminé dos líneas:

dataType: 'html',
contentType: 'application/json'

Cuando eliminé esas líneas, obtuve una respuesta 200 con el texto de respuesta apropiado.

7 mar 2018 16:58:19
Comentarios

Si esperas JSON como respuesta, entonces dataType debe ser 'json'.

Jacob Peattie Jacob Peattie
7 mar 2018 17:08:13

¿Puedes hacer clic en la marca de verificación junto a la respuesta para aceptarla?

nmr nmr
6 abr 2019 15:37:57