¿Por qué mi llamada AJAX no funciona?
5 sept 2013, 12:16:49
Vistas: 24.1K
Votos: 1
Tengo un código similar funcionando dentro del archivo functions.php de un tema, pero quiero moverlo a un plugin. He armado lo siguiente pero por alguna razón, este método está teniendo problemas en la llamada AJAX y siempre devuelve cero.
La intención es que el formulario esté en el front-end y pueda ser utilizado tanto por usuarios conectados como NO conectados.
Aquí está mi código del plugin:
/*
Plugin Name: AAA Hello World
Plugin URI: http://helloworld.com
Description: Respuesta AJAX a envío de formulario
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 "Hola Mundo";
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();" /> Hazme clic para una respuesta</label>
</form>
<div id="response_area"></div>';
return $the_form;
}
}
new RespondToMyClicks();
Y aquí está mi código del archivo 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");
}
)
}
He estado mirando esto durante demasiado tiempo y he probado diferentes variaciones de código, así que espero que alguien pueda señalar lo obvio porque simplemente no lo veo. ¡Gracias!

Suzanne
105
Comentarios
Todas las respuestas a la pregunta
1
0
Vale, así que AHORA tengo la solución completa. Eran dos cosas:
- El caché fue la primera parte del problema. Limpié el caché y desactivé el plugin de caché temporalmente.
- El segundo problema, menos obvio, era que para los usuarios NO conectados, la respuesta de la llamada AJAX devolvía todo el documento HTML en el área de respuesta. Resulta que tenía una función de "redirección" en mi archivo functions.php que estaba causando esto. Está diseñada para redirigir a los usuarios por debajo del rol de autor de vuelta al front-end para que nunca accedan al backend, y admin-ajax.php técnicamente opera desde el lado de administración, así que ese era el problema.

Suzanne
105
5 sept 2013 22:39:59
Preguntas relacionadas
4
respuestas
2
respuestas