Perché la mia chiamata AJAX non funziona?

5 set 2013, 12:16:49
Visualizzazioni: 24.1K
Voti: 1

Ho un codice simile che funziona all'interno del file functions.php del tema, ma voglio spostarlo in un plugin. Ho assemblato il seguente codice ma per qualche motivo, questo metodo ha problemi con la chiamata AJAX e restituisce sempre zero.

L'intenzione è che il form sia nel front-end e utilizzabile sia da utenti autenticati che NON autenticati.

Ecco il mio codice del plugin:

/*
Plugin Name: AAA Hello World
Plugin URI: http://helloworld.com
Description: Risposta AJAX alla sottomissione del form
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 "Ciao Mondo";
      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();" /> Cliccami per una risposta</label>
    </form>
    <div id="response_area"></div>';
    return $the_form;
  }

}

new RespondToMyClicks();

Ed ecco il codice del mio file 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");
            }
        )

    }

Ho guardato questo codice troppo a lungo e ho provato diverse varianti, quindi spero che qualcuno possa indicarmi l'ovvio perché mi sta proprio sfuggendo. Grazie!

5
Commenti

Ho provato il tuo codice: funziona perfettamente! Sei sicuro che il tuo file js si chiami esattamente ajax.js e che esista nella stessa cartella del file del plugin?

gmazzap gmazzap
5 set 2013 17:20:50

Elimino la mia risposta, non è affatto utile. Scusa. Concordo con @G.M., ho appena testato il tuo codice e funziona.

iEmanuele iEmanuele
5 set 2013 17:33:48

Accidenti! Come è possibile? Sì G.M., sta recuperando correttamente il file ajax.js perché vedo la sua voce nella sezione head del documento e cliccando sul link viene visualizzato il file, quindi presumo che sia tutto a posto. Rimuoverò le cose simili nel mio tema per verificare che non siano in conflitto. CONTINUO a ottenere 0 come risposta e non Hello World.

Suzanne Suzanne
5 set 2013 21:08:33

Ok... prima di tutto grazie per i vostri commenti ragazzi. Ogni tipo di feedback è importante, anche se non sembra utile. Dicendomi che FUNZIONA, mi avete semplicemente fatto capire che il problema era qualcos'altro nell'installazione e questo È stato utile. Si è scoperto che il mio plugin di cache aveva memorizzato una versione precedente del mio codice e continuava a servirmela quando non ero loggato - ARGH.

Suzanne Suzanne
5 set 2013 21:16:58

Mmm... potreste provare questo SENZA essere loggati? Il problema della cache l'ho risolto solo per gli utenti loggati. Ora sta restituendo l'intero documento nella mia area di risposta per gli utenti non loggati.

Suzanne Suzanne
5 set 2013 21:35:39
Tutte le risposte alla domanda 1
0

Ok, quindi ORA ho la soluzione completa. Erano due cose:

  1. La cache era la prima parte del problema. Ho svuotato la cache e disattivato il plugin di caching temporaneamente.
  2. Il secondo problema, meno ovvio, era che per gli utenti NON loggati, la risposta dalla chiamata AJAX restituiva l'intero documento HTML nell'area di risposta. Ho scoperto che avevo una funzione di "reindirizzamento" nel mio file functions.php che causava questo. È progettata per reindirizzare gli utenti con ruolo inferiore all'autore verso il front-end in modo che non accedano mai al backend e admin-ajax.php tecnicamente opera dal lato admin, quindi quello era il problema.
5 set 2013 22:39:59