De ce nu funcționează apelul meu AJAX?

5 sept. 2013, 12:16:49
Vizualizări: 24.1K
Voturi: 1

Am cod similar care funcționează în fișierul functions.php al unei teme, dar vreau să-l mut într-un plugin. Am asamblat următorul cod dar din anumite motive, această metodă are probleme la apelul AJAX și returnează întotdeauna zero.

Intenția este ca formularul să fie în frontend și să poată fi folosit atât de utilizatorii autentificați cât și de cei neautentificați.

Iată codul plugin-ului meu:

/*
Plugin Name: AAA Hello World
Plugin URI: http://helloworld.com
Description: Răspuns AJAX la trimiterea formularului
Version: 1.0
Author: John Doe
Author URI: http://helloworld.com
*/

class RespondToMyClicks {

  function __construct() {

    add_action( 'wp_enqueue_scripts', array( &$this, 'click_response_styles' ) );
    add_action( 'wp_enqueue_scripts', array( &$this, 'click_response_scripts' ) );

    if( is_admin() ) {
      add_action( 'wp_ajax_the_ajax_hook', array( &$this, 'process_clicky_form' ) );
      add_action( 'wp_ajax_nopriv_the_ajax_hook', array( &$this, 'process_clicky_form' ) );
    }

    add_shortcode( 'click_response_form', array( &$this, 'click_response_form' ) );

  }

  public function click_response_styles() {

    wp_register_style( 'respond-to-my-clicks', plugins_url( dirname( plugin_basename( __FILE__ ) ) . '/styles.css' ) );
    wp_enqueue_style( 'respond-to-my-clicks' );

  }

  public function click_response_scripts() {

    wp_enqueue_script( 'respond-to-my-clicks', plugin_dir_url( __FILE__ ) . 'ajax.js', array( 'jquery' ) );
    wp_localize_script( 'respond-to-my-clicks', 'the_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

  }

  public function process_clicky_form() {
    if( !empty( $_POST ) && wp_verify_nonce( $_POST['post_filtration'], 'post_filter_action' ) ) {
      echo "Salut Lume";
      die();
    }
  }

  public function click_response_form() {
    $the_form = '<form id="theForm" method="post" action="">' . 
    wp_nonce_field( 'post_filter_action', 'post_filtration' ) . 
    '<input name="action" type="hidden" value="the_ajax_hook" />
        <label class="check"><input type="checkbox" name="change_me"  value="" onChange="submit_me();" /> Apasă aici pentru un răspuns</label>
    </form>
    <div id="response_area"></div>';
    return $the_form;
  }

}

new RespondToMyClicks();

Și iată codul fișierului meu Javascript:

    function submit_me() {

        jQuery("#response_area").fadeOut("slow");

        jQuery.post(the_ajax_script.ajaxurl, 
        jQuery("#theForm").serialize(),
            function(response_from_the_action_function){
                jQuery("#response_area").html(response_from_the_action_function).fadeIn("fast");
            }
        )

    }

M-am uitat la acest cod prea mult timp și am încercat diferite variante de cod, așa că sper că cineva poate să-mi arate ce este evident pentru că eu pur și simplu nu văd. Mulțumesc!

5
Comentarii

Am încercat codul tău: funcționează perfect! Ești sigur că fișierul tău js se numește exact ajax.js și că există în același folder cu fișierul pluginului?

gmazzap gmazzap
5 sept. 2013 17:20:50

Șterg răspunsul meu, nu este deloc util. îmi pare rău. Sunt de acord cu @G.M., tocmai am testat codul tău și funcționează.

iEmanuele iEmanuele
5 sept. 2013 17:33:48

La naiba! Cum se poate așa ceva? Da G.M., primește fișierul ajax.js pentru că văd intrarea pentru el în secțiunea head a documentului și dacă dai click pe link se afișează fișierul, așa că presupun că e totul în regulă. O să elimin părți similare din tema mea pentru a vedea dacă nu cumva se creează un conflict. ÎNCĂ primesc 0 ca răspuns și nu Hello World.

Suzanne Suzanne
5 sept. 2013 21:08:33

Bine... în primul rând mulțumesc pentru comentariile voastre. Orice feedback contează, chiar dacă nu pare util. Prin faptul că mi-ați spus că FUNCȚIONEAZĂ, asta mi-a spus că e altceva în instalație și asta A FOST de ajutor. S-a dovedit că plugin-ul meu de caching a memorat o versiune anterioară a codului meu și a continuat să-mi servească aceea când nu eram logat - DOAMNE.

Suzanne Suzanne
5 sept. 2013 21:16:58

Hmm... puteți încerca asta când NU sunteți logați? Problema de caching a rezolvat asta doar pentru utilizatorii logați. Acum returnează întregul document în zona mea de răspuns pentru utilizatorii nelogați.

Suzanne Suzanne
5 sept. 2013 21:35:39
Toate răspunsurile la întrebare 1
0

Bine, deci ACUM am întreaga soluție. Au fost două lucruri:

  1. Cache-ul a fost prima parte a problemei. Am golit cache-ul și am dezactivat temporar plugin-ul de caching.
  2. A doua problemă, mai puțin evidentă, a fost că pentru utilizatorii care NU erau autentificați, răspunsul din apelul AJAX returna întregul document HTML în zona de răspuns. Se pare că aveam o funcție de "redirecționare" în fișierul functions.php care provoca acest lucru. Aceasta este concepută să redirecționeze utilizatorii cu roluri mai mici decât autor înapoi către front-end, astfel încât să nu acceseze niciodată backend-ul, iar admin-ajax.php în mod tehnic funcționează din partea de administrare, deci aceasta a fost problema.
5 sept. 2013 22:39:59