URL Ajax de WordPress para función en functions.php
Tengo una aplicación de escritorio y uso $.getJSON para obtener datos de mi sitio WordPress usando el plugin WP REST API. Esto funciona bien y supongo que también puedo hacer una llamada Ajax a una función en functions.php. ¿Cómo hago esto? Ninguno de los ejemplos que he visto proporciona la ajaxURL. ¿Cómo puedo averiguar cuál es?
Tengo el siguiente código:
Functions.php (en el sitio WordPress en el servidor)
//Llamado por Ajax desde la App - lista el contenido de la carpeta para que puedan ser descargados y almacenados localmente
function folder_contents() {
$folderPath = $_POST['path'] ;
$files = array_diff(scandir($path), array('.', '..'));
print_r($files);
return $files;
die();
}
add_action('wp_ajax_my_action', 'folder_contents');
app.js (ejecutado usando node webkit localmente desde la máquina)
//llamada ajax
var data = {
action: 'path',
path: datafolder;
};
var ajaxurl = baseurl + ''; //¿QUÉ ES ESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Obtuve esto del servidor: ' + response);
console.log(response);
});
-------------------EDICIÓN----------------------
Después de la respuesta de abajo, he intentado el siguiente código basado en el consejo pero obtengo
"index.html:324 Uncaught ReferenceError: ajax_params is not defined"
Functions.php
//agregar código para usar ajax
function add_ajax_script() {
wp_localize_script( 'ajax-js', 'ajax_params', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
//Llamado por Ajax desde la App - lista el contenido de la carpeta para que puedan ser descargados y almacenados localmente
function folder_contents() {
$folderPath = $_POST['path'] ;
$files = array_diff(scandir($path), array('.', '..'));
wp_send_json($files);
die();
}
add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');
add_action( 'wp_enqueue_scripts', 'add_ajax_script' );
App.js
//llamada ajax
var data = {action: 'powerpoint_folder_contents',path: datafolder};
var ajaxurl = ajax_params.ajax_url;
console.log(ajaxurl);
jQuery.post(ajaxurl, data, function(response) {
alert('Obtuve esto del servidor: ' + response);
console.log(response);
});
Si elimino la función add_ajax_script() y simplemente uso lo siguiente, devuelve 0.
var ajaxurl = baseurl + 'wp-admin/admin-ajax.php';
Por favor ayuda...
//llamada ajax
var data = {
action: 'folder_contents',
path: datafolder
};
var ajaxurl = baseurl + ''; //¿QUÉ ES ESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Recibido del servidor: ' + response);
console.log(response);
});
Y tu código PHP en functions.php
//Llamado por Ajax desde la App - lista los contenidos de la carpeta para que puedan ser descargados y almacenados localmente
function folder_contents() {
$folderPath = $_POST['path'] ;
$files = array_diff(scandir($path), array('.', '..'));
print_r($files);
return $files;
die();
}
add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');
Lo anterior añade tu función como una acción ajax. Luego llamas al nombre de la función en tu AJAX.
Ver https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)
Lo siento, en tu código JS también necesitas agregar el ajaxurl para tu sitio. La forma en que lo hago es definiéndolo y localizando el script para su acceso. Mira: https://codex.wordpress.org/Function_Reference/wp_localize_script
Tex0gen
También puedes ver aquí un ejemplo del ajaxurl y cómo localizarlo. https://www.creare.co.uk/blog/wp/wp-localize-script-wordpress
Tex0gen
OK, estoy teniendo problemas para hacer que esto funcione. He editado mi consulta original arriba para mostrar lo que he intentado basado en tu respuesta
LeeTee
O, haz wp_send_json($files); https://codex.wordpress.org/Function_Reference/wp_send_json
Tex0gen
Ok, he cambiado a wp_send_json($files); y todavía obtengo 0 desafortunadamente
LeeTee
Prueba: `function folder_contents() {
echo 'hello';
die(); }`
¿Ves la palabra hello aparecer en el console.log?
Tex0gen
Lo intenté y obtengo 0, intenté eliminar todo de esa función y aún obtengo 0. Si voy directamente al archivo con http://myweb.co.uk/wp-admin/admin-ajax.php?action=folder_contents todavía obtengo 0.
LeeTee
Continuemos esta discusión en el chat.
Tex0gen
En tu código veo que localizas el script 'ajax-js', pero ¿está el script mismo encolado? Hace unas semanas tuve que usar wp_localize_scripts y tuve que encolar mi script JS dentro de la función que llamaba a wp_localize_script. Por ejemplo:
add_action( 'wp_enqueue_scripts', 'google_js_script' );
function google_js_script()
{
// Encolar el script js
wp_enqueue_script('google-js', GOOGLE_PLG_URL . 'assets/js/google-places.js', array('jquery'), true);
// Localizar el script JS encolado
wp_localize_script( 'google-js', 'ajax_object',
array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'place' => '' ) );
}
Espero que esto ayude a depurar el problema.
El WP Codex establece que puedes usar la variable global ajaxurl sin declararla primero. En otras palabras, comenta esta línea:
var ajaxurl = ajax_params.ajax_url;
...y comprueba si funciona.
Si lees ese aviso en su totalidad también verás esto: "Esto solo es cierto en el lado de la administración. Si estás usando AJAX en el front-end, necesitas hacer que tu JavaScript sea consciente de la URL de admin-ajax.php. Una mejor práctica está documentada en el cuarto ejemplo a continuación, usando wp_localize_script()."
brett