URL Ajax WordPress per funzione in functions.php
Ho un'applicazione desktop e uso $.getJSON per ottenere dati dal mio sito WordPress utilizzando il plugin WP REST API. Questo funziona bene e quindi presumo di poter fare anche una chiamata Ajax a una funzione nel functions.php. Come posso farlo? Nessuno degli esempi che ho visto fornisce l'ajaxURL. Come posso scoprire qual è?
Ho il seguente codice:
Functions.php (nel sito wordpress sul server)
//Chiamato da Ajax dall'App - elenca il contenuto della cartella in modo che possa essere scaricato e memorizzato 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 (eseguito usando node webkit localmente dalla macchina)
//chiamata ajax
var data = {
action: 'path',
path: datafolder;
};
var ajaxurl = baseurl + ''; //QUAL È QUESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Ricevuto questo dal server: ' + response);
console.log(response);
});
-------------------MODIFICA----------------------
Dopo la risposta qui sotto ho provato il codice seguente basato sul consiglio ma ottengo
"index.html:324 Uncaught ReferenceError: ajax_params is not defined"
Functions.php
//aggiungi codice per utilizzare ajax
function add_ajax_script() {
wp_localize_script( 'ajax-js', 'ajax_params', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
//Chiamato da Ajax dall'App - elenca il contenuto della cartella in modo che possa essere scaricato e memorizzato 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
//chiamata 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('Ricevuto questo dal server: ' + response);
console.log(response);
});
Se rimuovo la funzione add_ajax_script() e semplicemente uso il seguente codice restituisce 0.
var ajaxurl = baseurl + 'wp-admin/admin-ajax.php';
Per favore aiuto...
//chiamata ajax
var data = {
action: 'folder_contents',
path: datafolder
};
var ajaxurl = baseurl + ''; //COS'È QUESTO?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Ricevuto dal server: ' + response);
console.log(response);
});
E il tuo PHP in functions.php
//Chiamato da Ajax dall'App - elenca i contenuti della cartella così possono essere scaricati e memorizzati 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');
Il codice sopra aggiunge la tua funzione come azione ajax. Poi chiami il nome della funzione nel tuo AJAX.
Vedi https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

Scusa, nel tuo JS devi anche aggiungere l'ajaxurl per il tuo sito. Il modo in cui lo faccio io è definirlo e localizzare lo script per l'accesso. Vedi: https://codex.wordpress.org/Function_Reference/wp_localize_script

Vedi anche qui per un esempio dell'ajaxurl e come localizzarlo. https://www.creare.co.uk/blog/wp/wp-localize-script-wordpress

OK, sto avendo difficoltà a far funzionare questo. Ho modificato la mia query originale sopra per mostrare cosa ho provato in base alla tua risposta

OPPURE, usa wp_send_json($files); https://codex.wordpress.org/Function_Reference/wp_send_json

Prova: `function folder_contents() {
echo 'hello';
die(); }`
Vedi la parola hello apparire nella console.log?

Ho provato ma ottengo 0, ho anche provato a rimuovere tutto dalla funzione ma ottengo sempre 0. Se vado direttamente al file con http://myweb.co.uk/wp-admin/admin-ajax.php?action=folder_contents ottengo ancora 0.

Continuiamo questa discussione nella chat.

Nel tuo codice vedo che localizzi lo script 'ajax-js', ma lo script stesso è accodato (enqueued)? Qualche settimana fa ho dovuto usare wp_localize_script e ho dovuto accodare il mio script JS all'interno della funzione che chiamava wp_localize_script. Per esempio:
add_action( 'wp_enqueue_scripts', 'google_js_script' );
function google_js_script()
{
// Accoda lo script js
wp_enqueue_script('google-js', GOOGLE_PLG_URL . 'assets/js/google-places.js', array('jquery'), true);
// Localizza lo script JS accodato
wp_localize_script( 'google-js', 'ajax_object',
array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'place' => '' ) );
}
Spero che questo aiuti a risolvere il problema.

Il WP Codex afferma che puoi utilizzare la variabile globale ajaxurl
senza dichiararla prima. In altre parole, commenta questa riga:
var ajaxurl = ajax_params.ajax_url;
...e verifica se funziona.

Se leggi l'avviso per intero vedrai anche questo: "Questo è vero solo sul lato amministrazione. Se stai utilizzando AJAX sul front-end, devi fare in modo che il tuo JavaScript sia consapevole dell'URL di admin-ajax.php. Una best practice è documentata nel quarto esempio qui sotto, utilizzando wp_localize_script()
."
