Problema con add_action('wp_ajax_[nombre de acción]', mifuncion)

1 dic 2010, 13:58:26
Vistas: 48.6K
Votos: 7

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?

2
Comentarios

@user1567: Agregas la función a los hooks wp_ajax_myaction y wp_ajax_admin_myaction. ¿No debería ser wp_ajax_myaction (para usuarios logueados) y wp_ajax_nopriv_myaction (para usuarios anónimos)?

Jan Fabry Jan Fabry
1 dic 2010 15:52:11

sí, lo corregí, gracias. Por cierto, tengo una llamada update_option dentro de la función "ajax_function" que parece fallar porque se llama después de que se completa toda la secuencia de carga de WordPress. ¿Hay otra forma de usar update_option?

user1567 user1567
1 dic 2010 18:26:43
Todas las respuestas a la pregunta 2
6

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);
});
1 dic 2010 14:27:06
Comentarios

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.

user1567 user1567
1 dic 2010 14:43:49

por cierto, ¿dónde configuras el valor de la variable ajaxurl?

user1567 user1567
1 dic 2010 14:46:23

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.

Horttcore Horttcore
1 dic 2010 15:46:29

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?

user1567 user1567
1 dic 2010 16:35:08

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?

user1567 user1567
1 dic 2010 17:23:47

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.

Horttcore Horttcore
2 dic 2010 10:29:55
Mostrar los 1 comentarios restantes
0

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.

3 jul 2016 19:09:30