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

También puedes ver aquí un ejemplo del ajaxurl y cómo localizarlo. https://www.creare.co.uk/blog/wp/wp-localize-script-wordpress

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

O, haz wp_send_json($files); https://codex.wordpress.org/Function_Reference/wp_send_json

Ok, he cambiado a wp_send_json($files); y todavía obtengo 0 desafortunadamente

Prueba: `function folder_contents() {
echo 'hello';
die(); }`
¿Ves la palabra hello aparecer en el console.log?

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.

Continuemos esta discusión en el chat.

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