Tenho um problema com o WordPress e Ajax.

Esta é minha parte do JavaScript (eu a cortei um pouco):

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) ); }); 

Meu código PHP é o seguinte:

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" ); 

O script obtém a resposta Ajax do admin-ajax. Infelizmente, o console gera um erro quando chega à instrução each no código JavaScript … diz:

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

Se eu fizer um console.log dos meus “posts” var, obtenho uma string “Array”. Não importa como eu passe a variável $list no PHP, ela sempre retornará uma string. A consulta retorna postagens em outro lugar, portanto “não está vazia. Tentei sem json_encode, com e sem declarar cabeçalho, usando wp_send_json(), colocando ob_clean() antes de ecoar a matriz, colocando a matriz em uma matriz … Mas sempre entra em ajax como uma string Array e each não podem circular por ele.

Isso deve ser uma coisa muito simples e eu não consigo entender por que é não está funcionando. Não tenho outros erros ou avisos de JavaScript ou PHP e tudo o mais funciona bem.

Comentários

  • O que você vê quando vá para example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Algum progresso em sua pergunta? Você poderia, por favor, acompanhar?
  • oh … isso é de 5 meses atrás … Eu respondi minha própria pergunta pela forma como no dia seguinte a postei, usando pedaços de resposta BODA82 – eu apenas não ' não marcou como a resposta correta; @toscho adicionou seu acompanhamento muito mais tarde ontem. Não posso ' verificar se sua resposta também é boa agora, mas faz sentido

Resposta

A resposta do BODA82 “ ajudou, mas finalmente percebi que deveria ter substituído responseText com o método responseJSON no meu código JavaScript. No exemplo abaixo, eu estava armazenando os resultados da resposta do Ajax em uma variável. Eu não sabia havia um método específico para obter a resposta em JSON. Dessa forma, o objeto / matriz com get_posts() resultados é retornado corretamente e não como uma string:

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 mim mesmo, mas também conselho geral: se você não puder consertar algo à noite, é um sinal de que você deve ir para a cama, ler um livro e contar estrelas. Uma resposta será encontrada na manhã seguinte, quanto mais cedo melhor: D

Resposta

Quase lá com sua função PHP. Não há necessidade de definir o cabeçalho. (Editar: também, supondo que get_posts() esteja realmente retornando 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" ); 

E seu 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."); } }); 

Comentários

  • Quando você salva alguns dados usando JSON.stringify () e precisa lê-los em php. O código a seguir funcionou para mim. json_decode (html_entity_decode (stripslashes ($ jsonString)));

Resposta

Existe uma saída. Use complete em vez de success ou done:

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

E tente remover async:false se o problema persistir.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *