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!

Suzanne
105
Commenti
Tutte le risposte alla domanda
1
0
Ok, quindi ORA ho la soluzione completa. Erano due cose:
- La cache era la prima parte del problema. Ho svuotato la cache e disattivato il plugin di caching temporaneamente.
- 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.

Suzanne
105
5 set 2013 22:39:59
Domande correlate
4
risposte
2
risposte
2
risposte