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.