La acción wp_ajax no se ejecuta en WordPress

22 abr 2014, 13:31:53
Vistas: 14K
Votos: 2

Estoy escribiendo un plugin. Quiero ejecutar el método get_my_option cuando alguien presione un botón en la página de configuración de mi plugin de WordPress. La llamada AJAX se realiza pero el método nunca se ejecuta.

En la página tengo el siguiente código:

<div class="wrap">
<input type="button" value="test" onclick="my_js_function();"/>
</div>
<?php
wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__),         array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url(  'admin-ajax.php' ) ) );


function get_my_option()
{
    //hacer algo
    die();
}

add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
?>

El archivo synchandler.js añadido:

function my_js_function() 
{
    jQuery.ajax({
    url: my_ajax_script.ajaxurl,
    type: 'POST',
    data: ({ action: 'get_my_option', affiliate: 'daisycon' }),
    success: function (response) {
        console.log("Recibido: " + response);
        }
    });
}

Hay una respuesta pero es un 0, así que el JavaScript se añade correctamente pero eso es todo. No obtengo errores en mi registro al ejecutar esto. AjaxURL se añade en la página (parece ser un error común).

/* <![CDATA[ */
var my_ajax_script = {"ajaxurl":"http:\/\/mywebsite.net\/wp-admin\/admin-ajax.php"};
/* ]]> */

El botón para activarlo todo usa onclick="my_js_function(); en la etiqueta HTML button.

Por sencillo que parezca, el método get_my_option no se activa mediante la llamada AJAX. ¿Qué estoy haciendo mal?

4
Comentarios

Ehm... necesitas cerrar PHP con ?> antes de agregar código JavaScript y volver a abrirlo después: <?php.

kaiser kaiser
22 abr 2014 13:51:51

Todo el javascript está en un archivo separado y se agrega con wp_enqueue_script(), así que no creo que eso sea un problema.

JennisDev JennisDev
22 abr 2014 15:05:21

"El archivo synchandler.js agregado:" es la parte a la que me refiero. Si estos son los contenidos del archivo JavaScript, entonces por favor muéstranos dónde llamas a esa función. No puedo ver que se active en ningún lugar.

kaiser kaiser
22 abr 2014 15:20:49

Está dentro de una etiqueta html input donde estoy usando un evento onclick. Voy a intentar ponerlo en la pregunta (ahora está escrito debajo del último fragmento de código).

JennisDev JennisDev
22 abr 2014 15:29:51
Todas las respuestas a la pregunta 2
4

¿Dónde estás llamando a add_action()? Si es en un lugar donde ya estás generando HTML, es demasiado tarde, y probablemente sea un lugar que ni siquiera será considerado durante una solicitud AJAX.

Deberías incluir ese código en el archivo functions.php de tu tema, o lo más temprano posible en un plugin.

22 abr 2014 17:07:48
Comentarios

Como acabo de ver que el OP parece agregar el código en medio de la página, tengo que duplicar eso. +1

kaiser kaiser
22 abr 2014 18:52:05

Efectivamente lo es. Agregar las acciones en el functions.php hizo que funcionara. El problema que tengo al agregarlo en el functions.php de mi carpeta de tema es que no puedo acceder a las clases que necesito en la carpeta del plugin. Una solución es llevar todo el código al tema pero eso prácticamente hace inútil al plugin.

JennisDev JennisDev
22 abr 2014 19:47:50

Entonces simplemente colócalo al inicio de tu plugin, fuera de cualquier otra función o clase y antes de que comiences a generar cualquier salida.

Dave Ross Dave Ross
23 abr 2014 05:26:48

Al agregarlo al inicio del plugin se solucionó. ¡Gracias!

JennisDev JennisDev
23 abr 2014 10:41:02
0

Necesitarás colocar tu código funcional en el plugin, como una función (esto depende de tu forma de desarrollar tu plugin).

Yo prefiero agregar las llamadas add_action a admin_init - También se llama con admin-ajax.php.

wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__),         array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url(  'admin-ajax.php' ) ) );


function get_my_option()
{
    //hacer algo
    die();
}
function add_ajax_actions() {
    add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
    add_action("wp_ajax_get_my_option", "get_my_option");
}
add_action( 'admin_init', 'add_ajax_actions' );

No sé si esto es una mejor práctica - Es puramente una preferencia personal, para evitar agregar hooks a cada página cargada - Solo a las páginas de administración.

22 abr 2014 19:30:19