Pasar datos JSON de WP Query a AJAX causando errores NULOS

2

Actualmente estoy usando un WP_Query que se activará desde una llamada AJAX cuando se presiona un botón. Los campos de metadatos de publicación lat lng se utilizarán como datos de ubicación para un mapa de Google. La consulta sale bien sin AJAX pero parece que no puede obtener los resultados con ella.

La respuesta que recibo - [{name: "", lng: null, lat: null}, {name: "", lng: null, lat: null}]

Ahora creo que el error es cuando se transforman los resultados en JSON en la etapa json_encode , pero ¿no está demasiado seguro? Cualquier ayuda sería genial, ¡bastante nueva para AJAX!

Function.php

<?php
//Search Function

function ek_search(){
    $args = array(
        'orderby' => 'date',
        'order' => $_POST['date'], 
        'post_type' => 'property',
        'posts_per_page' => 20,
        'date_query' => array(
        array(
            'after' => $_POST['property_added']
        ),
    ),
    );

$query = new WP_Query( $args ); 
$posts = $query->get_posts();   

foreach( $posts as $post ) {
     $locations[] = array(
       "name" => get_the_title(),
       "lng" => get_field('loc_lng'),
       "lat" => get_field('loc_lat')
     );
 }     

$location = json_encode($locations);

echo $location;

die();

}

add_action( 'wp_ajax_nopriv_ek_search', 'ek_search' );
add_action( 'wp_ajax_ek_search', 'ek_search' );

Form

<form id="filter">

<button>Search</button>
<input type="hidden" name="action" value="ek_search">

</form>

JS

jQuery(function($){
    $('#filter').submit(function(){
        var filter = $('#filter');
        var ajaxurl = '<?php echo admin_url("admin-ajax.php", null); ?>';
        data = { action: "ek_search"};
        $.ajax({
            url: ajaxurl,
            data:data,
            type: 'post',
            dataType: 'json',
            success: function(response) {
            console.log(response);  
            }

        });
        return false;
    });
});
    
pregunta scopeak 02.07.2017 - 19:19

2 respuestas

4

Admin-AJAX no está optimizado para JSON. Si necesita que su respuesta esté en JSON, use la API REST en su lugar. Esta API genera respuesta JSON de forma predeterminada.

Todo lo que tienes que hacer es registrar una ruta de descanso y acceder a la URL:

add_action( 'rest_api_init', function () {
    //Path to REST route and the callback function
    register_rest_route( 'scopeak/v2', '/my_request/', array(
            'methods' => 'POST', 
            'callback' => 'my_json_response' 
    ) );
});

Ahora, la función de devolución de llamada:

function my_json_response(){
    $args = array(
        'orderby' => 'date',
        'order' => $_POST['date'], 
        'post_type' => 'property',
        'posts_per_page' => 20,
        'date_query' => array(
            array(
                'after' => $_POST['property_added']
            ),
        ),
    );

    $query = new WP_Query( $args ); 
    if($query->have_posts()){
        while($query->have_posts()){
        $query->the_post();
            $locations[]['name'] = get_the_title();
            $locations[]['lat'] = get_field('loc_lng');
            $locations[]['lng'] = get_field('loc_lat');
        }
    }
    //Return the data
    return $locations;
}

Ahora, puede obtener su respuesta JSON visitando la siguiente URL:

wp-json/scopeak/v2/my_json_response/

Para propósitos de prueba, puede cambiar el método POST a GET y acceder directamente a esta URL. Si recibe una respuesta, luego vuelva a cambiarla a POST y trabaje en su javascript.

Eso es todo.

    
respondido por el Jack Johansson 02.07.2017 - 21:46
1

En primer lugar, ¿cómo obtiene las variables $_POST ? tienes que pasarlos en tu objeto data en tu llamada ajax. Ejemplo:

jQuery(function($){
$('#filter').submit(function(){
    var filter = $('#filter');
    var ajaxurl = '<?php echo admin_url("admin-ajax.php", null); ?>';
    data = { action: 'ek_search', date: date, property_added: property};
    $.ajax({
        url: ajaxurl,
        data:data,
        type: 'post',
        dataType: 'json',
        success: function(response) {
        console.log(response);  
        }

    });
    return false;
  });
});

Consulte este artículo para referencia.

    
respondido por el Cesar Henrique Damascena 02.07.2017 - 23:17

Lea otras preguntas en las etiquetas