Interactie met WordPress 'plug-in & thema-API

De WordPress Repository API is de API die wordt gebruikt om plug-in en thema-informatie op te halen voor gebruik op uw beheerderspagina's. Zo worden bijvoorbeeld de nieuwste plug-ins op het dashboard weergegeven, kunt u thema's bekijken op uw thematabblad en kunt u direct plug-ins zoeken en installeren in de repository. In deze zelfstudie gaan we kijken hoe deze API werkt en hoe deze kan worden gebruikt voor toegang tot informatie zoals de classificatie van uw plug-in, hoe vaak deze is gedownload en zelfs de ReadMe-secties. Met deze API kunt u bijvoorbeeld een link hosten op uw website die altijd verwijst naar de nieuwste versie van uw plug-in of thema.

Wanneer WordPress informatie verzamelt over plug-ins en thema's uit de repository, doet het dit door een verzoek te sturen naar een van de twee URL's.

  • Voor plug-ins: http://api.wordpress.org/plugins/info/1.0/
  • Voor thema's: http://api.wordpress.org/themes/info/1.0/

Het verzoek heeft de vorm van een array met een 'actie'en'verzoek' sleutel.

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

Details ophalen van een plug-in of thema

Bij het ophalen van gegevens over een plug-in of thema, de 'actie'moet worden ingesteld op plugin_information of theme_information respectievelijk. De waarde van de verzoeksleutel moet een geserialiseerd object zijn met een slug-eigenschap (de slug van het thema / plug-in) en een veldeigenschap, die aangeeft welke gegevens we zoeken (de beschikbare velden worden hieronder beschreven). In het bovenstaande fragment, $ args moet een associatieve array zijn met sleutels die door die eigenschappen worden gegeven.

De retourwaarde van wp_remote_post, $ response, misschien een WP_Query fout of anders een echte reactie van de repository met een foutmelding. Maar als alles goed is gegaan, kan het geretourneerde plug-in of thema-object eruit worden gehaald met het volgende:

 $ returns_object = maybe_unserialize (wp_remote_retrieve_body ($ response));

Query's van de plug-in en de thema-opslagplaatsen

Om een ​​lijst met thema's / plug-ins op te halen die aan bepaalde criteria voldoen, moet de actie worden ingesteld op query_themes of query_plugins. Dit moet vergezeld gaan van een geschikte sleutel (bijvoorbeeld 'schrijver', om plug-ins / thema's van een bepaalde auteur te verkrijgen) in de $ args matrix. De mogelijke criteria worden hieronder gegeven.

Nogmaals (ervan uitgaande dat er geen fouten zijn opgetreden), moet de reeks overeenkomende plug-ins worden gegeven door:

 $ returns_object = maybe_unserialize (wp_remote_retrieve_body ($ response)); $ plugins = $ geretourneerde_object-> plug-ins;

en op dezelfde manier, voor thema's:

 $ returns_object = maybe_unserialize (wp_remote_retrieve_body ($ response)); $ themes = $ geretourneerde_object-> thema's;

Elk thema / plugin-object in de array heeft dezelfde eigenschappen als degene die worden bepaald door de veldsleutel in de $ args matrix. De beschikbare velden worden hieronder weergegeven, evenals de standaardvelden (voor *_informatie query's). Houd er rekening mee dat de standaardwaarden voor verschillende acties anders zijn.


Plug-in-eigenschappen

Zoals hierboven aangegeven $ args is een associatieve array die de volgende velden kan bevatten:

  • naaktslak - (Wanneer de actie is plugin_information). De slug van de plug-in om de gegevens voor terug te sturen.
  • doorbladeren - (Wanneer de actie is query_plugins). Neemt de waarden Aanbevolen, populair of nieuwe.
  • schrijver - (Wanneer de actie is query_plugins). De WordPress-gebruikersnaam van de auteur om plug-ins op te halen door een bepaalde auteur.
  • label - (Wanneer de actie is query_plugins). Tag waarmee u plug-ins kunt ophalen.
  • zoeken - (Wanneer de actie is query_plugins). Een zoekterm waarmee u in de repository kunt zoeken.
  • velden - een array met mogelijke velden (hieronder weergegeven) als toetsen en waar of vals waarde om gegevens voor dat veld te retourneren of niet. De velden die zijn opgenomen, vormen de eigenschappen van het geretourneerde object hierboven. De mogelijke velden zijn (standaard ingesteld op waar, tenzij anders aangegeven):
    • versie - laatste
    • schrijver - auteursnaam en link naar profiel
    • vereist - de minimale WordPress-versie vereist
    • getest - de nieuwste geteste WordPress-versie
    • verenigbaarheid - een array die een array bevat voor elke versie van uw plug-in. Deze reeks slaat het aantal stemmen op, het aantal stemmen voor 'werken' en dit aantal als een percentage.
    • gedownload - het aantal downloads
    • beoordeling - als een percentage
    • NUM_RATINGS - aantal beoordelingen
    • secties - dit is een array met de HTML voor elke sectie op de WordPress plug-in pagina als waarden, sleutels kunnen 'Omschrijving','installatie','screenshots','changelog'en'FAQ'.
    • download link - verwijst naar door de repository gehost ZIP-bestand van de nieuwste versie van de plug-in
    • Omschrijving - (standaard vals)
    • korte beschrijving - (standaard vals)

Andere velden zijn 'naam','naaktslak','author_profile','labels','Startpagina','bijdragers','toegevoegd'en'laatst bijgewerkt'.

Voorbeeld

Laten we als kort voorbeeld een lijst met plug-ins van een bepaalde auteur weergeven, samen met het aantal keer dat ze zijn gedownload:

 // Stel de argumenten in. Voor de beknoptheid van de code, zal ik slechts een paar velden instellen. $ args = array ('author' => 'stephenh1988', 'fields' => array ('gedownload' => true, 'downloadlink' => true)); // Aanvraag maken en plug-in-object uitpakken. Actie is query_plugins $ response = wp_remote_post ('http://api.wordpress.org/plugins/info/1.0/', array ('body' => array ('action' => 'query_plugins', 'request' => serialize ((object) $ args)))); if (! is_wp_error ($ response)) $ returning_object = unserialize (wp_remote_retrieve_body ($ response)); $ plugins = $ geretourneerde_object-> plug-ins; if (! is_array ($ plugins)) // Response-instantie bevat geen object / array-echo "Er is een fout opgetreden";  else // Geef een lijst met plug-ins en het aantal downloads weer als ($ plug-ins) echo '
    '; foreach ($ plug-ins als $ plugin) echo "
  • ".Esc_html ($ plugin-> naam)." (gedownload ".esc_html ($ plugin-> gedownload)." keer)
  • "; else // Fout object geretourneerde echo" Er is een fout opgetreden ";

Thema-eigenschappen

De API-aanvraag voor thema's lijkt erg op elkaar, hoewel er enigszins verschillende velden beschikbaar zijn.

  • naaktslak - (Wanneer de actie is theme_information) De naaktslak van het thema om de gegevens voor terug te geven.
  • doorbladeren - (Wanneer de actie is query_themes). Neemt de waarden Aanbevolen, nieuwe of bijgewerkt.
  • schrijver - (Wanneer de actie is query_themes). De gebruikersnaam van de auteur om thema's van een bepaalde auteur op te halen.
  • label - (Wanneer de actie is query_themes). Een reeks tags waarmee u thema's kunt ophalen.
  • zoeken - (Wanneer de actie is query_themes). Een zoekterm waarmee u in de repository kunt zoeken.
  • velden - opnieuw een array met een waar of vals waarde voor elke toets (veld). De velden die zijn opgenomen, vormen de eigenschappen van het geretourneerde object hierboven. De mogelijke velden zijn (standaard ingesteld op waar, tenzij anders aangegeven):
    • versie - (laatste)
    • schrijver
    • preview_url - URL naar gehost voorbeeld wp-themes.com
    • screenshot_url - URL naar schermafbeelding
    • screenshot_count* - aantal screenshots van het thema
    • screenshots* - reeks van screenshot-URL's
    • beoordeling - (als een percentage)
    • NUM_RATINGS - aantal beoordelingen
    • gedownload - aantal downloads
    • secties
    • Omschrijving
    • download link

Andere velden zijn 'naam','naaktslak','labels','Startpagina','bijdragers', en'laatst bijgewerkt'.

*Houd er rekening mee dat in de toekomst thema's [toegestane meerdere schermafbeeldingen] zijn [1].

Voorbeeld

 // Stel de argumenten in. Voor de beknoptheid van de code, zal ik de meeste standaardwaarden gebruiken $ args = array ('slug' => 'Desk Mess Mirrored', 'fields' => array ('screenshot_url' => true)); // Maak een aanvraag en extraheer plug-in object $ 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)) // Response-instantie bevat geen object / array-echo "Er is een fout opgetreden";  else // Gegevens saneren: $ preview_url = esc_url ($ theme-> preview_url); $ screenshot_url = esc_attr ($ theme-> screenshot_url); $ rating = esc_attr ($ theme-> rating); // Geef de beoordeling van het thema weer, een screenshot en een link naar de preview van de thema-echo "Dit thema heeft een beoordeling van $ rating%. Bekijk een voorbeeld"; echo ""; else // Fout object geretourneerde echo" Er is een fout opgetreden ";

In deze voorbeelden heb ik (voor het grootste deel) de standaardvelden gebruikt - maar in een poging om dat beetje bandbreedte op te slaan, moet u expliciet aangeven welke velden u wel en niet wilt.


caching

Dit is een uitstekend voorbeeld van waar caching, met name transiënten, kan (en zou moeten) worden gebruikt. Caching van de gegevens betekent dat we de informatie uit de repository niet bij elke pagina laden ophalen - wat het laden van de site zou vertragen. Als een eenvoudig voorbeeld, toen ik het voorbeeld hierboven uitvoerde zonder caching duurde het 0.522 seconden om de gegevens op te halen (wat respectabel is). Zodra ik transiënten begon te gebruiken, zakte het naar 0,001 seconden. In ieder geval niet nodig hebben om deze informatie bij elke pagina te laden - in feite is er weinig reden om deze gegevens meer dan eens per dag (of misschien langer) bij te werken.

Als u niet zeker weet hoe u transiënten gebruikt, kunt u dit in dit artikel lezen.

Laten we transiënten implementeren in een generieke functie die thema-informatie ophaalt, gegeven een specifiek thema (en andere argumenten):

 / ** * Retourneert een themaobject dat een array $ args of WP_Error-object krijgt als er een fout is * $ args moeten een 'slug'-sleutel bevatten met de naam van het thema * en de' velden'-toets die een array met velden bevat om op te halen. * / function sh_get_theme_information ($ args) // Stel de $ request-array in $ request = array ('body' => array ('action' => 'theme_information', 'request' => serialize ((object) $ args) )); // Genereer een cachesleutel die het antwoord voor dit verzoek zou houden: $ key = 'sh_theme _'. Md5 (serialize ($ request)); // Controleer overgang. Als het er is, gebruik dat dan als het niet opnieuw wordt opgehaald (false === ($ theme = get_transient ($ key))) // Theme not found - we moeten het opnieuw ophalen $ response = wp_remote_post (' http://api.wordpress.org/themes/info/1.0/',$request); if (is_wp_error ($ response)) return $ response; $ theme = unserialize (wp_remote_retrieve_body ($ response)); if (! is_object ($ theme) &&! is_array ($ theme)) retourneer nieuwe WP_Error ('theme_api_error', 'Er is een onverwachte fout opgetreden'); // Transient instellen voor de volgende keer ... houd het 24 uur goed moet set_transient zijn ($ key, $ theme, 60 * 60 * 24);  return $ thema; 

Om deze functie te gebruiken:

 // Stel de argumenten in. Voor de kortheid van de code gebruik ik (meestal) de standaardwaarden $ args = array ('slug' => 'Desk Mess Mirrored', 'fields' => array ('screenshot_url' => true)); // Haal het thema $ theme = sh_get_theme_information ($ args); // Toon thema-informatie (of foutmelding). if (is_wp_error ($ theme)) echo 'Er is een onverwachte fout opgetreden';  else // Gegevens saneren: $ preview_url = esc_url ($ theme-> preview_url); $ screenshot_url = esc_attr ($ theme-> screenshot_url); $ rating = esc_attr ($ theme-> rating); // Toon themarating, screenshot en preview link echo "Dit thema heeft een beoordeling van $ rating%. Bekijk een preview"; echo "";

Het basispatroon voor het ophalen van gegevens uit elke API is grotendeels hetzelfde. Verander een verzoek in een uniek, waarmee de resultaten worden gecached. Controleer vervolgens of er gegevens voor de sleutel bestaan, als dat zo is - geweldig, we kunnen die gegevens gewoon retourneren. Anders haalt u de gegevens op afstand op. Nadat u het antwoord hebt ontvangen, controleert u op fouten en controleert u of er geen update is en stuurt u de nieuw opgehaalde gegevens terug.

Als een tweede voorbeeld kunnen we een functie bouwen die een reeks plug-ins van een bepaalde auteur retourneert:

 function sh_get_plugins_by_author ($ author = ") if (empty ($ author)) return false; $ key = sanitize_key ('sh_plugins _'. $ author); if (false === ($ plugins = get_transient ($ key))) $ args = array ('author' => $ author, 'fields' => array ('gedownload' => true, 'downloadlink' => true)); $ response = wp_remote_post ('http: //api.wordpress .org / plugins / info / 1.0 / ', array (' body '=> array (' action '=>' query_plugins ',' request '=> serialize ((object) $ args)))); $ plugin_response = unserialize (wp_remote_retrieve_body ($ antwoord)); $ plugins = $ plugin_response-> plugins; // Transient instellen voor de volgende keer ... houd het 24 uur goed moet set_transient zijn ($ key, $ plugins, 60 * 60 * 24); ga terug $ plug-ins;

(U kunt natuurlijk altijd de WordPress API gebruiken in combinatie met zachte caching, waar ik het in dit artikel over had).

U kunt een live demonstratie zien van het gebruik van de WordPress Repository API op de WordPress plug-in-pagina van mijn site.