La acción wp_ajax no se ejecuta en WordPress
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?
¿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.

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

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.

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.

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.
