¿Cómo usar AJAX en el área de administración del plugin?
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?

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:
- 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.
- 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.
- 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 );
});

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.

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

@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

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.

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

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".

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.

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

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

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

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()
.

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.
