Problema con add_action('wp_ajax_[nombre de acción]', mifuncion)
Estoy tratando de integrar ajax en WordPress usando las guías del codex de WP. En el PHP agregué:
wp_enqueue_script ( 'my_ajax', ADMIN_URL . 'js/ajax.js','jquery','1.0.0' );
wp_localize_script( 'my_ajax', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
El código ajax es:
jQuery.ajax({url: MyAjax.ajaxurl, type: "POST",data: {action: 'myaction',postID : MyAjax.postID}, success: function(response) {
alert('Obtenido desde el servidor: ' + response);
}});
y la función PHP que debería ser llamada por ajax es:
function ajax_function() {
...hacer algo...
}
add_action('wp_ajax_myaction', 'ajax_function');
add_action('wp_ajax_admin_myaction', 'ajax_function');
La llamada ajax es exitosa (el "alert" funciona), sin embargo, la función PHP "ajax_function" nunca es llamada. Después de hacer algunas depuraciones, me di cuenta de que aunque la llamada action add_action('wp_ajax_ establece un nuevo elemento en el array global $wp_filter, cuando el do_action correspondiente se ejecuta dentro de admin-ajax.php, el array $wp_filter ya no contiene ese elemento.
Por lo tanto, la función "ajax_function" es ignorada. ¿Alguna idea de por qué no se llama la función?
En mis proyectos lo hago así
PHP
function foo() {
echo 'bar';
}
add_action('wp_ajax_foo', 'foo' ); // se ejecuta cuando hay sesión iniciada
add_action('wp_ajax_nopriv_foo', 'foo' ); // se ejecuta cuando no hay sesión iniciada
Javascript
data = { action: 'foo', avalue: 'algún valor', 'anothervalue': 'otro valor' };
jQuery.post(ajaxurl, data, function(response){
alert(response);
});

Gracias por la respuesta. Conozco esta guía, también la revisé. Cambié la función para que sea exactamente igual a la tuya pero sin suerte :-( La función aún no es llamada.

En mi ejemplo asumí que la variable ya estaba configurada. En el Backend de WP la variable siempre está definida. En el frontend simplemente la defino en el encabezado. <script type="text/javascript"> var ajaxurl = <?php bloginfo('url') ?>'/wp-admin/admin-ajax.php'; </script> Apuesto a que hay una forma más inteligente de manejarlo.

Ya veo. De todos modos, la función todavía no funciona para mí. ¿Importa que el ajax sea para el backend de administración? ¿O se deben usar las mismas funciones?

Finalmente lo solucioné. El problema era el orden de carga y la ubicación de las llamadas add_action. Tengo otra pequeña pregunta: escribiste data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' }; ¿Qué pasa si quiero incluir un array como valor de una de las claves?

Eso está relacionado con jQuery y cómo deseas agregar datos para la solicitud ajax. http://api.jquery.com/jQuery.post/ busca los ejemplos, hay diferentes formas de incluir datos en la solicitud.

Por favor sigue el código:
add_action( 'wp_ajax_add_myfunc', 'prefix_ajax_add_myfunc' );
add_action( 'wp_ajax_nopriv_add_myfunc', 'prefix_ajax_add_myfunc' );
function prefix_ajax_add_myfunc() {
// Maneja la solicitud y luego genera la respuesta usando WP_Ajax_Response
}
y en tu llamada ajax haz esto:
jQuery.post(
ajaxurl,
{
'action': 'add_myfunc',
'data': 'foobarid'
},
function(response){
alert('El servidor respondió: ' + response);
}
);
en la llamada ajax llamarás a tu función sin prefix_ajax_
. Solo llámalo por lo que queda. En ese caso es add_myfunc
. En la respuesta enviará done
si todo va bien. De lo contrario, la respuesta será 0
o -1
.
Espero que ayude. Gracias.
