¿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!

5
Comentarios

He probado tu código: ¡funciona perfectamente! ¿Estás seguro de que tu archivo js se llama exactamente ajax.js y existe en la misma carpeta que el archivo del plugin?

gmazzap gmazzap
5 sept 2013 17:20:50

Eliminando mi respuesta, no es útil en absoluto. Lo siento. Estoy de acuerdo con @G.M., acabo de probar tu código y funciona.

iEmanuele iEmanuele
5 sept 2013 17:33:48

¡Rayos! ¿Cómo puede ser? Sí G.M., está obteniendo el archivo ajax.js correctamente porque veo la entrada en la sección head del documento y al hacer clic en el enlace se muestra el archivo, así que supongo que todo está bien ahí. Voy a eliminar las cosas similares en mi tema para ver si no están conflictuando con esto. AÚN obtengo 0 como respuesta y no Hello World.

Suzanne Suzanne
5 sept 2013 21:08:33

Vale... primero que nada, gracias por vuestros comentarios chicos. Cada aporte de feedback importa, incluso si no parece útil. Al decirme que SÍ funciona, eso simplemente me indica que es algo más en la instalación y eso FUE útil. Resulta que mi plugin de caché había almacenado una versión previa de mi código y continuaba sirviéndome esa cuando no estaba logueado... ARGH.

Suzanne Suzanne
5 sept 2013 21:16:58

Mmm... ¿podéis probar esto SIN estar logueados? El problema de caché solo lo solucionó para usuarios logueados. Ahora está devolviendo el documento completo en mi área de respuesta para usuarios no logueados.

Suzanne Suzanne
5 sept 2013 21:35:39
Todas las respuestas a la pregunta 1
0

Vale, así que AHORA tengo la solución completa. Eran dos cosas:

  1. El caché fue la primera parte del problema. Limpié el caché y desactivé el plugin de caché temporalmente.
  2. 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.
5 sept 2013 22:39:59