Tengo un problema con WordPress y Ajax.

Esta es mi parte de JavaScript (la recorté un poco):

var posts = $.ajax({ type: "POST", url: ajaxurl, async: false, dataType: "json", data: { action: "myAjaxFunc" }, done: function(response) { return response; } }).responseText; $.each(posts, function() { $("#someSelect").append( $("<option</option>").text(this.name).val(this.id) ); }); 

Mi código PHP es el siguiente:

function myAjaxFunc() { $posts = get_posts( array( "posts_per_page" => -1, "orderby" => "title", "order" => "ASC", "post_type" => "my-post-type", "post_status" => array( "publish", "draft" ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( "id" => $post->ID, "name" => $post->post_title, "link" => get_permalink( $post->ID ), ); } header("Content-type: application/json"); echo json_encode( $list ); die; } add_action( "wp_ajax_nopriv_myAjaxFunc", "myAjaxFunc" ); add_action( "wp_ajax_myAjaxFunc", "myAjaxFunc" ); 

El script obtiene la respuesta Ajax de admin-ajax. Desafortunadamente, la consola arroja un error cuando llega a la instrucción each en el código JavaScript … dice:

"Uncaught TypeError: Cannot use "in" operator to search for "4" in Array". 

Si hago un console.log de mis «publicaciones» var obtengo una cadena «Array». No importa cómo pase la variable $list en PHP, siempre devolverá una cadena. La consulta devuelve publicaciones en otros lugares, por lo que no está vacía. Intenté sin json_encode, con y sin declarar el encabezado, usando wp_send_json(), poniendo ob_clean() antes de hacer eco de la matriz, poner la matriz en una matriz … Pero siempre entra en ajax como una cadena Array y each no pueden recorrerlo.

Esto debería ser algo muy simple y no puedo «entender por qué» no funciona. No tengo otros errores o advertencias de JavaScript o PHP y todo lo demás funciona bien.

Comentarios

  • ¿Qué ves cuando vaya a example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • ¿Algún progreso en su pregunta? ¿Podrías hacer un seguimiento?
  • oh … esto es de hace 5 meses … Por cierto, respondí a mi propia pregunta al día siguiente, la publiqué, usando partes de la respuesta BODA82 – Yo simplemente no ' t la marcó como la respuesta correcta; @toscho agregó su seguimiento mucho más tarde ayer. No puedo ' t verificar si su respuesta también es buena ahora, aunque tiene sentido

Respuesta

La respuesta de BODA82 ayudó, pero finalmente me di cuenta de que debería haber reemplazado responseText con el método responseJSON en mi código JavaScript. En el siguiente ejemplo, estaba almacenando los resultados de la respuesta Ajax en una variable. No lo sabía había un método específico para obtener la respuesta en JSON. De esta manera, el objeto / matriz con get_posts() resultados se devuelve correctamente y no como una cadena:

posts = $.ajax({ type: "GET", url: ajaxurl, async: false, dataType: "json", data: { action : "getHotelsList" }, done: function(results) { // Uhm, maybe I don"t even need this? JSON.parse(results); return results; }, fail: function( jqXHR, textStatus, errorThrown ) { console.log( "Could not get posts, server response: " + textStatus + ": " + errorThrown ); } }).responseJSON; // <-- this instead of .responseText 

Nota para uno mismo, pero también un consejo general: si no puede arreglar algo por la noche, es una señal de que debe irse a la cama, leer un libro y contar estrellas. Se encontrará una respuesta a la mañana siguiente, cuanto antes mejor: D

Respuesta

Casi ha terminado con su función PHP. No es necesario configurar el encabezado. (Editar: también, suponiendo que get_posts() esté devolviendo resultados).

function myAjaxFunc() { $posts = get_posts( array( "posts_per_page" => -1, "orderby" => "title", "order" => "ASC", "post_type" => "my-post-type", "post_status" => array( "publish", "draft" ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( "id" => $post->ID, "name" => $post->post_title, "link" => get_permalink( $post->ID ), ); } echo json_encode( $list ); die; } add_action( "wp_ajax_nopriv_myAjaxFunc", "myAjaxFunc" ); add_action( "wp_ajax_myAjaxFunc", "myAjaxFunc" ); 

Y su Javascript:

$.ajax({ url: "<?php bloginfo("url"); ?>/wp-admin/admin-ajax.php", type: "POST", data: "action=myAjaxFunc", success: function(results) { var posts = JSON.parse(results); console.log(results); $.each(posts, function() { $("#someSelect").append( $("<option></option>").text(this.name).val(this.id) ); }); }, error: function() { console.log("Cannot retrieve data."); } }); 

Comentarios

  • Cuando guarda algunos datos usando JSON.stringify () y luego necesita leerlos en php. El siguiente código funcionó para mí. json_decode (html_entity_decode (stripslashes ($ jsonString)));

Respuesta

Hay una salida. Utilice complete en lugar de success o done:

posts = $.ajax({ type: "GET", url: ajaxurl, async: false, dataType: "json", data: { action : "getHotelsList" }, complete: function(results) { 

E intente eliminar async:false si el problema persiste.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *