Come gestire le chiamate Ajax e JSON in wordpress


13

Ho un tipo di post personalizzato a cui voglio accedere tramite jQuery, preferibilmente utilizzando JSON.

Quindi prima le cose. la creazione di una funzione che restituisce / echos json è abbastanza semplice, ma come accedervi tramite jquery.

mentre Mike scrive in questa domanda , lui - per quanto ho capito - lo colloca nella radice di wordpress. quale lo renderebbe accessibile usando il nome del file php - ma è raccomandabile? Preferirei inserirlo in una cartella di plugin.

Ho provato a leggere il codice wordpress, ma il modo in cui vengono gestite le chiamate ajax mi confonde, dato che stai postando ogni chiamata ajax su admin-ajax.php, anche se non è una pagina di amministrazione?

Qualcuno può chiarire i problemi che sto riscontrando?

/Tempesta

modificare

Il problema che avevo era capire come dovevano essere fatte le chiamate ajax in wordpress, nonché dove posizionare il tuo codice php e js per fare / gestire le chiamate.

Nell'altra domanda a cui ho collegato, hai creato una funzione posizionando il file nella radice di wp - Non voglio farlo. Ma ora ho imparato come usare wp_ajax_ (nopriv _) [azione] e posso accedere efficacemente al json che creo. Il problema che rimane è dove dovrei posizionare il JS per effettuare la chiamata. Voglio inserirlo nel file js dei plugin, ma poiché questo deve essere presentato in una pagina, non sul sito di amministrazione, ajaxurl non è definito, quindi devo fare eco usando php.

echo admin_url('admin-ajax.php');

Quindi la domanda diventa come dovrei combinare questo php con il javascript e come dovrei accodarlo, visto che non è un file o uno script.


Vorrei modificare il titolo della tua domanda per dare un titolo più descrittivo ma dopo aver letto non sono ancora sicuro al 100% di quale sia la tua domanda. Stai semplicemente chiedendo come accedere a un feed JSON, non correlato ai tipi di post personalizzati (il CPT non è realmente importato nella tua domanda?) Ed è importante che non sia nella radice? È per la funzionalità di amministrazione? Forse sarebbe d'aiuto se spiegassi cosa stai effettivamente cercando di realizzare dal punto di vista dell'utente finale oltre all'approccio tecnico con cui stai lottando?
MikeSchinkel,

Sì, posso dire che il titolo non è il più descrittivo di sempre. Ho appena messo qualcosa lì perché ho postato con uno ancora peggio all'inizio. Post modificato con maggiori informazioni.
Tempesta

Il tipo di post personalizzato che ho appena inserito, perché il plug-in json-api che sembra popolare in realtà non copre i tipi di post personalizzati.
Tempesta

Risposte:


17

Ajax Handler

È davvero un po 'confuso che il gestore Ajax sia nella wp-admin/directory, ma sì, puoi e dovresti usarlo anche per richieste non amministrative. Quindi si registra un gestore per l' wp_ajax_nopriv_[action]hook, anziché il normale wp_ajax_[action]. In questo caso devi solo seguire le prime righe diadmin-ajax.php , poiché una richiesta fatta da un utente che non ha effettuato l'accesso lascerà già la pagina intorno alla riga 50.

Quindi registra una funzione per l'hook wp_ajax_nopriv_get_custom_post_datae verrà chiamata se chiedi admin-ajax.phpcon il actionparametro impostato su get_custom_post_data. Assicurati di chiamare die()tu stesso alla fine del gestore, altrimenti die(-1)verrà restituito il valore predefinito . E registra anche la versione di accesso, wp_ajax_get_custom_post_data(alla stessa funzione di gestore, nessun problema), poiché se hai effettuato l'accesso al tuo sito, non colpirai l' noprivhook.

Configurazione lato server su Javascript

Il trucco per inviare dati di configurazione lato server (come l' admin-ajax.phpURL) è wp_localize_script(). Gli passi una matrice di chiavi e valori che verranno inclusi nella parte superiore della pagina. Probabilmente questo è stato originariamente creato solo per stringhe localizzabili, ma puoi usarlo anche per passare i dati di configurazione.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configè il nome dell'handle (se si desidera cancellarlo in un secondo momento), storm_configè il nome dell'oggetto Javascript che conterrà i dati. Quindi il tuo file Javascript statico può contenere una linea simile jQuery.post(storm_config.ajaxurl, ...).

Vedi anche la risposta di Bueltge a una domanda simile .

Javascript statico dalla directory dei plugin

Per caricare un file Javascript statico dalla tua directory plugin, usi wp_enqueue_script(). Sarebbe simile a questo:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Dov'è di storm_jsonnuovo un nome handle, quindi si fornisce il collegamento al file, quindi le dipendenze (può essere null) e quindi un numero di versione che verrà aggiunto dopo la richiesta di battere le cache del browser sugli aggiornamenti.


Bella risposta. Questo era quello che mi chiedevo e sembra che abbia funzionato. Ora posso accedere a /wp-admin/admin-ajax.php?action=[action] e ottenere un risultato json. Il mio problema ora è dove mettere js per fare la chiamata ajax. Dal momento che ho bisogno di mettere echo admin_url ('admin-ajax.php'); come url, non riesco a inserirlo nel mio file js plugin. Quindi come potrei fare per accodarlo? Non voglio solo stampare la sceneggiatura nel mezzo di una pagina.
Tempesta

@Storm: ho ampliato la mia risposta con la wp_localize_script()quale è possibile utilizzare per inviare i dati di configurazione dal lato server al browser. (Piccolo consiglio: se aggiungi @a un nome utente, quella persona riceverà una notifica della tua risposta. Quindi @Mike: I updated the titleassicurati di vedere il tuo commento)
Jan Fabry,

Grazie mille Jan. Ora penso di aver capito l'intero pacchetto. Dovrò giocherellare un po 'con tutto per capirlo pienamente, ma sei stato di grande aiuto! Risposta accettata =) a proposito grazie per la nota @. Ma mentre sto commentando la tua risposta ora, riceverai comunque un avviso giusto?
Tempesta

@Storm: Sì, l'avviso viene inviato all'autore della domanda o della risposta su cui stai commentando e inoltre può andare a un altro partecipante di cui parli in un commento @. Quindi ho ricevuto la tua notifica "gratuitamente", ma non ne riceveresti una per questo messaggio se non ti includessi. C'è una spiegazione completa sul meta sito generale della rete Stack Exchange.
Jan Fabry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.