Come utilizzare AJAX nell'area amministrativa del plugin?

3 set 2013, 16:01:28
Visualizzazioni: 24.3K
Voti: 2

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?

0
Tutte le risposte alla domanda 3
6
10

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:

  1. 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.
  2. 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.
  3. 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 );
 });
3 set 2013 17:12:35
Commenti

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.

gmazzap gmazzap
3 set 2013 17:31:57

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

cybmeta cybmeta
3 set 2013 17:39:24

@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

sun sun
3 set 2013 17:50:12

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

cybmeta cybmeta
4 set 2013 00:57:27

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

Waqas Shakeel Waqas Shakeel
17 mar 2020 14:26:30

invece di json_encode e header, credo che sia una best practice usare semplicemente wp_send_success o wp_send_error.

simon simon
27 dic 2022 18:51:22
Mostra i restanti 1 commenti
1

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

3 set 2013 16:36:33
Commenti

Non sono riuscito a trovare nel Codex o in altri codici, per quanto ne so, ed è per questo che ho postato la domanda qui. Così altri possano aiutarmi a capire cosa sto sbagliando. Comunque grazie

sun sun
4 set 2013 11:58:18
6

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.

3 set 2013 16:27:06
Commenti

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

sun sun
3 set 2013 16:49:30

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

J.D. J.D.
3 set 2013 17:18:33

se uso exit() ottengo localhost/wp_twentythirteen/wp-content/plugins

sun sun
3 set 2013 17:51:36

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

J.D. J.D.
3 set 2013 21:41:28

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

kaiser kaiser
30 set 2013 19:22:04

Sì, ma se guardi gli orari, l'ho postato un'ora prima che lui pubblicasse la sua risposta.

J.D. J.D.
30 set 2013 23:08:12
Mostra i restanti 1 commenti