Interagire con API di plug-in e temi di WordPress

L'API del repository di WordPress è l'API utilizzata per recuperare le informazioni sui plug-in e sui temi da utilizzare nelle pagine di amministrazione. Ad esempio, visualizza gli ultimi plug-in sulla dashboard, consente di visualizzare i temi sulla scheda del tema e consente di cercare e installare plug-in direttamente dal repository. In questo tutorial vedremo come funziona questa API e come può essere utilizzata per accedere a informazioni quali la valutazione del plug-in, quante volte è stata scaricata o persino le sezioni di ReadMe. Utilizzando questa API, ad esempio, puoi ospitare un link sul tuo sito web che punta sempre all'ultima versione del tuo plug-in o tema.

Quando WordPress raccoglie informazioni su plug-in e temi dal repository lo fa inviando una richiesta a uno dei due URL.

  • Per i plug-in: http://api.wordpress.org/plugins/info/1.0/
  • Per temi: http://api.wordpress.org/themes/info/1.0/

La richiesta assume la forma di un array con un 'azione' e 'richiesta'chiave.

 $ response = wp_remote_post ('http://api.wordpress.org/plugins/info/1.0/', array ('body' => array ('action' => $ action, 'request' => serialize ((oggetto ) $ args))));

Ottenere dettagli di un plug-in o un tema

Quando si recuperano dati su un plugin o un tema, il 'azione'dovrebbe essere impostato su plugin_information o theme_information rispettivamente. Il valore della chiave di richiesta dovrebbe essere un oggetto serializzato con una proprietà slug (lo slug del tema / plug-in) e una proprietà di campo, che indica quali dati ci vengono dopo (i campi disponibili sono descritti di seguito). Nel frammento di cui sopra, $ args dovrebbe essere un array associativo con chiavi date da quelle proprietà.

Il valore di ritorno da wp_remote_post, $ risposta, Forse un WP_Query errore o una risposta autentica dal repository contenente un messaggio di errore. Ma se tutto è andato bene, il plug-in restituito o l'oggetto tema può essere estratto da esso con il seguente:

 $ return_object = magari_unserialize (wp_remote_retrieve_body ($ response));

Interrogazione dei repository di temi e plug-in

Per recuperare un elenco di temi / plug-in che soddisfano determinati criteri, l'azione deve essere impostata su query_themes o query_plugins. Questo dovrebbe essere accompagnato da una chiave appropriata (ad es.autore', per ottenere plugin / temi da un particolare autore) nel $ args array. I possibili criteri sono indicati di seguito.

Ancora una volta (supponendo che non si siano verificati errori), la matrice dei plug-in corrispondenti deve essere fornita da:

 $ return_object = magari_unserialize (wp_remote_retrieve_body ($ response)); $ plugins = $ returned_object-> plugins;

e allo stesso modo, per i temi:

 $ return_object = magari_unserialize (wp_remote_retrieve_body ($ response)); $ themes = $ returned_object-> temi;

Ogni oggetto tema / plugin nella matrice ha le stesse proprietà di quelle determinate dalla chiave dei campi nel $ args array. I campi disponibili sono elencati di seguito, così come i campi predefiniti (per *_informazione interrogazioni). Si noti che i valori predefiniti sono diversi per le diverse azioni.


Proprietà plug-in

Come sopra annotato $ args è un array associativo che può contenere i seguenti campi:

  • lumaca - (Quando l'azione è plugin_information). Lo slug del plug-in per restituire i dati.
  • navigare - (Quando l'azione è query_plugins). Prende i valori In primo piano, popolare o nuovo.
  • autore - (Quando l'azione è query_plugins). Il nome utente di WordPress dell'autore, per recuperare i plugin da un autore specifico.
  • etichetta - (Quando l'azione è query_plugins). Tag con cui recuperare i plugin.
  • ricerca - (Quando l'azione è query_plugins). Un termine di ricerca con cui cercare il repository.
  • i campi - una matrice con possibili campi (elencati sotto) come chiavi e vero o falso valore per restituire i dati per quel campo o no. I campi inclusi costituiscono le proprietà dell'oggetto restituito sopra. I campi possibili sono (impostazione predefinita su vero, salvo diversa indicazione):
    • versione - più recente
    • autore - nome dell'autore e link al profilo
    • richiede - è richiesta la versione minima di WordPress
    • testato - l'ultima versione di WordPress testata
    • Compatibilità - un array che contiene un array per ciascuna versione del plug-in. Questo array memorizza il numero di voti, il numero di voti 'lavori' e questo numero in percentuale.
    • scaricato - il numero di download
    • valutazione - in percentuale
    • NUM_RATINGS - numero di valutazioni
    • sezioni - questo è un array con l'HTML per ogni sezione nella pagina del plug-in di WordPress come valori, le chiavi possono includere 'descrizione','installazione','screenshot','changelog' e 'FAQ'.
    • Link per scaricare - punta al file ZIP ospitato nel repository dell'ultima versione del plugin
    • descrizione - (predefinito falso)
    • breve descrizione - (predefinito falso)

Altri campi includono 'nome','lumaca','author_profile','tag','homepage','contributori','aggiunto' e 'ultimo aggiornamento'.

Esempio

Come un breve esempio, mostriamo un elenco di plug-in di un particolare autore, insieme a quante volte sono stati scaricati:

 // Imposta gli argomenti. Per brevità di codice, imposterò solo alcuni campi. $ args = array ('author' => 'stephenh1988', 'fields' => array ('scaricato' => true, 'downloadlink' => true)); // Crea una richiesta ed estrai l'oggetto plug-in. L'azione è query_plugins $ response = wp_remote_post ('http://api.wordpress.org/plugins/info/1.0/', array ('body' => array ('action' => 'query_plugins', 'request' => serializza ((oggetto) $ args)))); if (! is_wp_error ($ response)) $ return_object = unserialize (wp_remote_retrieve_body ($ response)); $ plugins = $ returned_object-> plugins; if (! is_array ($ plugins)) // Il corpo della risposta non contiene un oggetto / array echo "Si è verificato un errore";  else // Visualizza un elenco dei plug-in e il numero di download se ($ plugins) echo '
    '; foreach ($ plugin come $ plugin) echo "
  • ".Esc_html ($ plugin-> nome)." (scaricato ".esc_html ($ plugin-> scaricato)." volte)
  • "; else // Oggetto errore restituito echo" Si è verificato un errore ";

Proprietà del tema

La richiesta API di temi è molto simile, sebbene siano disponibili campi leggermente diversi.

  • lumaca - (Quando l'azione è theme_information) Lo slug del tema per restituire i dati.
  • navigare - (Quando l'azione è query_themes). Prende i valori In primo piano, nuovo o aggiornato.
  • autore - (Quando l'azione è query_themes). Il nome utente dell'autore, per recuperare temi da un autore particolare.
  • etichetta - (Quando l'azione è query_themes). Una serie di tag con cui recuperare i temi.
  • ricerca - (Quando l'azione è query_themes). Un termine di ricerca con cui cercare il repository.
  • i campi - di nuovo un array con a vero o falso valore per ogni chiave (campo). I campi inclusi costituiscono le proprietà dell'oggetto restituito sopra. I campi possibili sono (impostazione predefinita su vero, salvo diversa indicazione):
    • versione - (più recente)
    • autore
    • url_anteprima - URL dell'anteprima ospitata da wp-themes.com
    • screenshot_url - URL per l'immagine dello screenshot
    • screenshot_count* - numero di schermate del tema
    • screenshot* - array di URL screenshot
    • valutazione - (in percentuale)
    • NUM_RATINGS - numero di valutazioni
    • scaricato - numero di download
    • sezioni
    • descrizione
    • Link per scaricare

Altri campi includono 'nome','lumaca','tag','homepage','contributori', e 'ultimo aggiornamento'.

*Si prega di notare che in futuro i temi saranno [ammessi più screenshot] [1].

Esempio

 // Imposta gli argomenti. Per brevità di codice, userò la maggior parte dei valori predefiniti $ args = array ('slug' => 'Desk Mess Mirrored', 'fields' => array ('screenshot_url' => true)); // Crea richiesta ed estrai oggetto plug-in $ response = wp_remote_post ('http://api.wordpress.org/themes/info/1.0/', array ('body' => array ('action' => 'theme_information ',' request '=> serialize ((object) $ args)))); if (! is_wp_error ($ response)) $ theme = unserialize (wp_remote_retrieve_body ($ response)); if (! is_object ($ theme) &&! is_array ($ theme)) // Il corpo della risposta non contiene un oggetto / array echo "Si è verificato un errore";  else // Sanitize data: $ preview_url = esc_url ($ theme-> preview_url); $ screenshot_url = esc_attr ($ theme-> screenshot_url); $ rating = esc_attr ($ theme-> rating); // Visualizza la valutazione del tema, uno screenshot e il collegamento all'anteprima dell'eco del tema "Questo tema ha una valutazione di $ rating%. Visualizza un'anteprima"; eco ""; else // Oggetto errore restituito echo" Si è verificato un errore ";

In questi esempi, ho usato (per la maggior parte) i campi predefiniti - ma in un tentativo di risparmiare un po 'di larghezza di banda, dovresti indicare esplicitamente quali campi fai e non vuoi.


caching

Questo è un eccellente esempio di dove il caching, in particolare i transienti, può (e dovrebbe) essere usato. Memorizzare i dati nella cache significa che non recupereremo le informazioni dal repository su ogni caricamento della pagina, il che rallenterebbe il caricamento del sito. Come un semplice esempio, quando ho eseguito l'esempio sopra senza memorizzare nella cache ci sono voluti 0,522 secondi per recuperare i dati (che è di tutto rispetto). Una volta che ho iniziato a usare i transienti, è sceso a 0,001 secondi. In ogni caso non lo facciamo bisogno per ottenere queste informazioni su ogni caricamento della pagina - in effetti vi sono pochi motivi per aggiornare questi dati più di una volta al giorno (o forse più a lungo).

Se non sei sicuro di come usare i transienti, puoi leggerli in questo articolo.

Implementiamo i transienti in una funzione generica che recupererà le informazioni del tema, dato un tema specifico (e altri argomenti):

 / ** * Restituisce un oggetto tema dato un array $ args o WP_Error se c'è un errore * $ args dovrebbe contenere una chiave 'slug' con il nome del tema * e la chiave 'fields' contenente una serie di campi da recuperare. * / function sh_get_theme_information ($ args) // Imposta la $ request array $ request = array ('body' => array ('action' => 'theme_information', 'request' => serialize ((object) $ args) )); // Genera una chiave di cache che dovrebbe contenere la risposta per questa richiesta: $ key = 'sh_theme _'. Md5 (serialize ($ request)); // Controlla i transitori. Se è lì - usa quello, se non recupera il tema if (false === ($ theme = get_transient (chiave $))) // Tema non trovato - dobbiamo ri-recuperarlo $ response = wp_remote_post (' http://api.wordpress.org/themes/info/1.0/',$request); se (is_wp_error ($ response)) restituisce $ response; $ theme = unserialize (wp_remote_retrieve_body ($ response)); if (! is_object ($ theme) &&! is_array ($ theme)) restituisce new WP_Error ('theme_api_error', 'Si è verificato un errore imprevisto'); // Imposta il transitorio per la prossima volta ... tienilo per 24 ore dovrebbe essere un buon set_transient ($ key, $ theme, 60 * 60 * 24);  return $ theme; 

Per utilizzare questa funzione:

 // Imposta gli argomenti. Per brevità di codice, userò (principalmente) i valori predefiniti $ args = array ('slug' => 'Desk Mess Mirrored', 'fields' => array ('screenshot_url' => true)); // Ottieni il tema $ theme = sh_get_theme_information ($ args); // Visualizza le informazioni sul tema (o messaggio di errore). if (is_wp_error ($ theme)) echo 'Si è verificato un errore imprevisto';  else // Sanitize data: $ preview_url = esc_url ($ theme-> preview_url); $ screenshot_url = esc_attr ($ theme-> screenshot_url); $ rating = esc_attr ($ theme-> rating); // Visualizza valutazione del tema, screenshot e link di anteprima echo "Questo tema ha una valutazione di $ rating%. Visualizza un'anteprima"; eco "";

Lo schema di base per il recupero dei dati da qualsiasi API è sostanzialmente lo stesso. Trasforma una richiesta in un unico, con il quale memorizzare i risultati. Quindi controlla se i dati esistono per la chiave, se lo fa - bene, possiamo solo restituire quei dati. Altrimenti, recupera i dati in remoto. Una volta ricevuta la risposta, controlla gli errori e, se non ci sono aggiornamenti, il transiente e restituisce i dati appena recuperati.

Come secondo esempio, possiamo costruire una funzione che restituisce una matrice di plug-in di un particolare autore:

 function sh_get_plugins_by_author ($ author = ") if (vuoto ($ author)) restituisce false; $ chiave = sanitize_key ('sh_plugins _'. $ author); if (false === ($ plugins = get_transient (chiave $))) $ args = array ('author' => $ author, 'fields' => array ('scaricato' => true, 'downloadlink' => true)); $ response = wp_remote_post ('http: //api.wordpress .org / plugins / info / 1.0 / ', array (' body '=> array (' action '=>' query_plugins ',' request '=> serialize ((oggetto) $ args)))); $ plugin_response = unserialize (wp_remote_retrieve_body ($ response)); $ plugins = $ plugin_response-> plugins; // Imposta il transient per la prossima volta ... tienilo per 24 ore dovrebbe essere un buon set_transient ($ key, $ plugins, 60 * 60 * 24); return $ plugins;

(Naturalmente, puoi sempre utilizzare l'API di WordPress insieme a caching morbido, di cui ho parlato in questo articolo).

Puoi vedere una dimostrazione dal vivo dell'utilizzo dell'API del repository WordPress nella pagina dei plug-in di WordPress del mio sito.