Come utilizzare AJAX nell'area amministrativa del plugin?
Ho provato ad utilizzare AJAX per ottenere alcune informazioni da PHP all'interno del mio plugin, ma ottengo un errore di funzione non definita. Ajax
jQuery.ajax({
type: "POST",
url: "<?php echo plugins_url();?>/tester/inc/test.php",
data: { param: 'st1' }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
Errore nell'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> Errore fatale: Chiamata alla funzione non definita add_action() in E:\wamp1\wamp\www\wp_twentythirteen\wp-content\plugins\tester\inc\test.php alla riga <i>7</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Stack delle Chiamate</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Tempo</th><th align='left' bgcolor='#eeeeec'>Memoria</th><th align='left' bgcolor='#eeeeec'>Funzione</th><th align='left' bgcolor='#eeeeec'>Posizione</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 "hello";
echo plugins_url();
}
add_action('wp_ajax_my_action','aj');
add_action('wp_ajax_nopriv_myFunction','aj');
?>
Penso che l'errore indichi che non mi trovo all'interno dell'ambiente WordPress. Qualche idea?

Per favore, evita l'uso di require('../../../wp-load.php'); e cose simili come suggerito in altre risposte. Dovresti sempre utilizzare il metodo AJAX di WordPress. È davvero semplice e avrai tutto il motore di WordPress caricato nel tuo script PHP.
Solo tre considerazioni:
- Devi inviare la richiesta ajax a ...wp-admin/admin-ajax.php. ajaxurl è una variabile JavaScript che è sempre definita nell'area di amministrazione e contiene l'URL corretto del file admin-ajax.php nell'installazione corrente di WordPress. Puoi usare ajaxurl direttamente nel tuo JavaScript nell'area di amministrazione. Ho visto che hai inviato la richiesta ajax a un URL diverso.
- Nei dati inviati devi includere la variabile action. La variabile action contiene il nome di una funzione PHP precedentemente registrata dal tuo plugin/tema. Questa funzione gestirà la richiesta ajax. Ho letto il tuo codice e hai definito la funzione ajax nel tuo PHP ma manca l'action nel tuo JavaScript.
- L'esempio qui sotto è per l'area di amministrazione come hai chiesto. Nel frontend è leggermente diverso ma comunque molto semplice; se hai bisogno di un esempio per effettuare la richiesta ajax nel frontend dimmelo e lo posterò.
Esempio:
Nel tuo 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'] = "Ho ricevuto il parametro e il suo valore è " . $_POST['param'] . ' e l\'URL del plugin è ' . plugins_url();
} else {
$response['response'] = "Non hai inviato il parametro";
}
header( "Content-Type: application/json" );
echo json_encode($response);
// Non dimenticare di uscire sempre nella funzione ajax.
exit();
}
Il tuo JavaScript nel backend dovrebbe essere qualcosa del genere (ricorda che ajaxurl è sempre definito da WordPress nell'area di amministrazione):
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: { action: 'my_action' , param: 'st1' }
}).done(function( msg ) {
alert( "Dati salvati: " + msg.response );
});

Penso che tu abbia frainteso la risposta di @s_ha_dum. La tua risposta è quasi identica a quella che ha linkato. Ad essere onesti, e senza offesa, la tua è meno completa.

Hai ragione. Ho letto la risposta di Mike Lewek e dopo non ho dedicato abbastanza tempo a leggere la risposta di s_ha_dum.

@cybnet grazie, nella funzione my_ajax_action_function() ho rimosso tutto il codice anche se ricevo ancora un alert di plugin_url. Come sta succedendo questo? Vorrei solo saperlo

plugin_url() non esiste in WordPress, la funzione corretta è plugins_url(). Vedi la risposta modificata, ho aggiunto la funzione plugins_url() e funziona perfettamente.

come inizializzare "ajaxurl" per il backend. non l'hai menzionato qui

Non ti trovi in un contesto WordPress. Hai caricato direttamente il file del plugin. Quel file verrà caricato, ma non il resto di WordPress.
Utilizza l'API AJAX. È proprio per questo che è stata creata. Non usare soluzioni approssimative non più necessarie come includere i file core di WordPress tramite require
o include
(wp-load.php
, wp-blog-header.php
, wp-settings.php
, a seconda di quale "tutorial" hai letto)
Se gli esempi nel Codex non sono sufficienti per iniziare, ci sono numerosi esempi su questo sito inclusi più di 30 che ho scritto io— questo, in particolare, che probabilmente rientra tra le diverse "domande duplicate".

Hai ragione, a causa del modo in cui stai effettuando la tua chiamata AJAX, WordPress non viene caricato. Il modo corretto è utilizzare ajaxurl
come URL e impostare la tua azione come my_action
passandola come valore del parametro action
nei dati della tua richiesta:
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: { action: 'my_action', param: 'st1' }
}).done(function( msg ) {
alert( "Dati salvati: " + msg );
});
Consulta AJAX nei Plugin per maggiori informazioni.

Perché ottengo Dati salvati: http://localhost/wp_twentythirteen/wp-content/plugins0 anche se rimuovo plugins_url() in test.php

Devi chiamare exit()
alla fine della tua funzione. Prova questo e vedi se il problema persiste.

Se stai ricevendo quell'errore, significa che stai chiamando plugins_url()
da qualche parte nel tuo codice prima della chiamata a exit()
.

Questo dovrebbe essere un commento o una modifica alla risposta di @cybnet - dato che è già un copia/incolla del codice dalla sua risposta.
