¿Cómo usar AJAX en el área de administración del plugin?

3 sept 2013, 16:01:28
Vistas: 24.3K
Votos: 2

Intenté usar AJAX para obtener información de un PHP dentro de mi plugin, pero obtengo un error de función no definida. Ajax

jQuery.ajax({
        type: "POST",
        url: "<?php echo plugins_url();?>/tester/inc/test.php",
        data: { param: 'st1' }
      }).done(function( msg ) {
             alert( "Data Saved: " + msg );
     });

Error en el alert

Data Saved: <br />
<font size='1'><table class='xdebug-error xe-fatal-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Error fatal: Llamada a función no definida add_action() en E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php en la línea <i>7</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Pila de llamadas</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Tiempo</th><th align='left' bgcolor='#eeeeec'>Memoria</th><th align='left' bgcolor='#eeeeec'>Función</th><th align='left' bgcolor='#eeeeec'>Ubicación</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0007</td><td bgcolor='#eeeeec' align='right'>254944</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php' bgcolor='#eeeeec'>..\test.php<b>:</b>0</td></tr>
</table></font>

test.php

<?php
function aj()
{
 echo "hola";
echo plugins_url();
}
add_action('wp_ajax_my_action','aj'); 
add_action('wp_ajax_nopriv_myFunction','aj'); 

 ?>

Creo que el error indica que no estoy dentro de WordPress. ¿Alguna idea?

0
Todas las respuestas a la pregunta 3
6
10

Por favor, evita el uso de require('../../../wp-load.php'); y cosas similares como se sugiere en otras respuestas. Siempre deberías usar la forma AJAX de WordPress. Es realmente fácil y tendrás todo el motor de WordPress cargado en tu script PHP.

Solo tres consideraciones:

  1. Debes enviar la solicitud AJAX a ...wp-admin/admin-ajax.php. ajaxurl es una variable javascript que está siempre definida en el área de administración y contiene la URL correcta al archivo admin-ajax.php en la instalación actual de WordPress. Puedes usar ajaxurl directamente en tu javascript en el área de administración. He visto que envías la solicitud AJAX a una URL diferente.
  2. En los datos enviados debes incluir la variable action. La variable action contiene el nombre de una función PHP previamente registrada por tu plugin/tema. Esta función manejará la solicitud AJAX. He leído tu código y definiste la función AJAX en tu PHP pero falta el action en tu javascript.
  3. El ejemplo de abajo es para el área de administración como preguntaste sobre el área de admin. En el frontend es un poco diferente pero sigue siendo muy fácil; si necesitas un ejemplo para hacer la solicitud AJAX en el frontend solo dilo y lo publicaré.

Ejemplo:

En tu PHP (plugin/tema):

add_action('wp_ajax_my_action', 'my_ajax_action_function');

function my_ajax_action_function(){
  
    $response = array();
    if ( ! empty($_POST['param'] ) ) {
         $response['response'] = "He recibido el parámetro y su valor es " . $_POST['param'] . ' y la URL del plugin es ' . plugins_url();
    } else {
         $response['response'] = "No enviaste el parámetro";
    }

    header( "Content-Type: application/json" );
    echo json_encode($response);
 
    // No olvides siempre hacer exit en la función AJAX.
    exit();

}

Tu javascript en el backend debería ser algo como esto (recuerda que ajaxurl siempre está definido por WordPress en el área de administración):

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action' , param: 'st1' }
  }).done(function( msg ) {
         alert( "Datos guardados: " + msg.response );
 });
3 sept 2013 17:12:35
Comentarios

Creo que has malinterpretado la respuesta de @s_ha_dum. Tu respuesta es casi idéntica a la respuesta que él enlazó. Para ser honesto, y sin ofender, la tuya es menos completa.

gmazzap gmazzap
3 sept 2013 17:31:57

Tienes razón. Leí la respuesta de Mike Lewek y después no dediqué suficiente tiempo a leer la respuesta de s_ha_dum.

cybmeta cybmeta
3 sept 2013 17:39:24

@cybnet gracias en my_ajax_action_function() eliminé todo el código aunque sigo recibiendo una alerta de plugin_url. Cómo está sucediendo esto solo quiero saber esto

sun sun
3 sept 2013 17:50:12

plugin_url() no existe en WordPress, lo correcto es plugins_url(). Mira la respuesta editada, he añadido la función plugins_url() y funciona perfectamente.

cybmeta cybmeta
4 sept 2013 00:57:27

cómo inicializar "ajaxurl" para el backend. no lo mencionaste aquí

Waqas Shakeel Waqas Shakeel
17 mar 2020 14:26:30

en lugar de json_encode y header, supongo que es mejor práctica usar wp_send_success o wp_send_error.

simon simon
27 dic 2022 18:51:22
Mostrar los 1 comentarios restantes
1

No estás en un contexto de WordPress. Has cargado el archivo del complemento directamente. Ese archivo se cargará, pero no el resto de WordPress.

Utiliza la API AJAX. Para eso está diseñada. No uses trucos que ya no son necesarios como require o include de archivos principales de WordPress (wp-load.php, wp-blog-header.php, wp-settings.php, dependiendo de qué "tutorial" hayas leído).

Si los ejemplos en el Codex no son suficientes para empezar, hay numerosos ejemplos en este sitio, incluyendo más de 30 que he escrito— este en particular, que probablemente califica como una de varias "preguntas duplicadas".

3 sept 2013 16:36:33
Comentarios

No he podido encontrar en el Codex u otros códigos según mi conocimiento, por eso publiqué la pregunta aquí. Para que otros puedan ayudarme a ver qué estoy haciendo mal. De todos modos, gracias.

sun sun
4 sept 2013 11:58:18
6

Tienes razón, debido a la forma en que estás realizando tu llamada AJAX, WordPress no se está cargando. La forma correcta es usar ajaxurl como la URL y establecer tu acción como my_action pasando eso como el valor del parámetro action en los datos de tu solicitud:

jQuery.ajax({
    type: "POST",
    url: ajaxurl,
    data: { action: 'my_action', param: 'st1' }
  }).done(function( msg ) {
         alert( "Datos guardados: " + msg );
 });

Consulta AJAX en Plugins para más información.

3 sept 2013 16:27:06
Comentarios

¿Por qué estoy recibiendo Datos guardados: http://localhost/wp_twentythirteen/wp-content/plugins0 incluso si elimino plugins_url() en test.php?

sun sun
3 sept 2013 16:49:30

Necesitas llamar a exit() al final de tu función. Prueba eso y verifica si esto sigue ocurriendo.

J.D. J.D.
3 sept 2013 17:18:33

Si uso exit() estoy obteniendo localhost/wp_twentythirteen/wp-content/plugins

sun sun
3 sept 2013 17:51:36

Si estás recibiendo eso, entonces debes estar llamando a plugins_url() en algún lugar de tu código antes de la llamada a exit().

J.D. J.D.
3 sept 2013 21:41:28

Esto debería ser un comentario o edición en la respuesta de @cybnet - ya que es una copia/pega del código de su respuesta.

kaiser kaiser
30 sept 2013 19:22:04

Sí, pero si miras los tiempos, yo lo publiqué una hora antes de que él publicara su respuesta.

J.D. J.D.
30 sept 2013 23:08:12
Mostrar los 1 comentarios restantes