Maak WordPress plug-ins met OOP-technieken

Object-georiënteerde code, onder andere, kan helpen bij het organiseren en hergebruik van uw code. In deze zelfstudie leer ik je de basisprincipes van het schrijven van een WordPress-plug-in met behulp van objectgerichte technieken. We gebruiken Dribbble's API als een voorbeeld voor deze tutorial. Klaar?


Wat we gaan leren:

  • Voordelen van het gebruik van OOP voor WordPress-plug-ins.
  • Hoe een shortcode in te stellen.
  • Hoe een sjabloontag in te stellen.
  • Hoe shortcode in WordPress-widgets in te schakelen.
  • Voorbeeld uit de praktijk met behulp van de API van Dribbble.

Waarom OOP gebruiken?

Voordat je verdergaat met deze tutorial, moet je op zijn minst een elementair begrip hebben van het schrijven van een WordPress-plug-in. Jonathan heeft een geweldige tutorial geschreven over "Hoe een WordPress plug-in schrijven". Geef het een read.

Het maken van WordPress-plug-ins met objectgeoriënteerde code is behoorlijk efficiënt en opgeruimd in vergelijking met het gebruik van procedurele code. Het is eenvoudiger om de codebasis te beheren en uit te breiden met behulp van overervingstechnieken, wat met name handig kan zijn bij het schrijven van een grote plug-in.


Dribbble

Om een ​​WordPress plug-in te schrijven, hebben we eerst een gevoel van richting nodig. We gaan een plug-in schrijven die de nieuwste shots van Dribbble zal weergeven, met behulp van hun REST API. We voegen vervolgens ondersteuning voor shortcodes toe voor berichten en widgets en sjabloonlabels voor thema's.


Stap 1 - De plugin-klasse instellen

Object georiënteerde code is gebaseerd op klassen en methoden (functies). Laten we onze kernklasse maken, die interactie heeft met de haken en filters van WordPress.

 class WPDribbble public function __construct ()  $ wpDribbble = new WPDribbble ();

PHP-klassen hebben een constructorfunctie, __construct, die wordt uitgevoerd zodra een nieuw exemplaar van een klasse wordt geïnstantieerd. Alle WordPress-hooks en -filters worden geregistreerd onder de constructor van onze plugin-klasse. Laten we verder gaan en een shortcode registreren voor onze plug-in. De add_shortcode () functie / haak gaat onder de constructorfunctie.

De nieuwe instantie van een klasse / object wordt geregistreerd met behulp van de nieuwe trefwoord. Raadpleeg de laatste regel in de onderstaande code.

 klasse WPDribbble public function __construct () add_shortcode ('Dribbble', array ($ this, 'shortcode'));  openbare functie shortcode ()  $ wpDribbble = new WPDribbble ();
  • add_shortcode - De eerste parameter is de shortcode-tag en de tweede is de callback-functie.

Merk op hoe we een gebruiken rangschikking in de callback-functie parameter? Om callback-functies binnen een object te registreren, moeten we een rangschikking.

Het eerste item van de array verwijst naar het object, via $ this. Het tweede item in de rangschikking is de naam van de methode binnen de klasse. Alle haken en filters moeten op deze manier worden gerefereerd binnen een klas.

Nog steeds verward?

 # 1. Standaardgebruik add_shortcode ('shortcode_name', 'shortcode_func'); function shortcode_func () // Inhoud van deze functie wordt uitgevoerd wanneer de blogger // de shortcode [shortcode_name] gebruikt.  # 2. Met PHP 5.3 kunnen we een anonieme functie doorgeven. add_shortcode ('shortcode_name', function () // Inhoud van deze functie wordt uitgevoerd wanneer de blogger // de shortcode [shortcode_name] gebruikt); # 3. Binnen een klasse klasse WPDribbble public function __construct () add_shortcode ('Dribbble', array ($ this, 'shortcode'));  shortcode voor openbare functie () // Inhoud van deze functie wordt uitgevoerd wanneer de blogger // de shortcode [shortcode_name] gebruikt. 

Stap 2 - Dribbble API-klasse

Omdat we momenteel geen fancy API-functies nodig hebben, gaan we een vrij eenvoudige API-wrapper voor Dribbble maken. Er is al een bibliotheek beschikbaar voor Dribbble, maar in het belang van deze zelfstudie gaan we onze eigen schrijven. Het helpt je de concepten achter deze tutorial te begrijpen.

We gaan een DribbbleAPI schrijven voorwerp, en registreer een methode riep getPlayerShots () om te communiceren met de API van Dribbble en een te retourneren rangschikking van de nieuwste opnamen.

Laten we een nieuw bestand voor deze klasse maken, genaamd DribbbleAPI.php

 class DribbbleAPI // url to Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // Dribbble gebruikersnaam of gebruiker-ID beveiligde $ gebruiker; 

Hierboven stellen we twee klassenvariabelen in.

  • $ apiUrl - De link naar de Dribbble API, waar de oproepen worden verzonden.
  • $ user - De gebruikersnaam of gebruikers-ID van een Dribbble-gebruiker. Deze waarde wordt ingesteld binnen de constructor (__construct) methode.
 class DribbbleAPI // url to Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // Dribbble gebruikersnaam of gebruiker-ID beveiligde $ gebruiker; publieke functie __construct ($ user) $ this-> user = $ user; 

De constructor is geslaagd voor a $ user variabele, die vervolgens door de constructor wordt doorgegeven aan de klasse-eigenschap, genaamd gebruiker.

We prefixen de eigenschap, of de variabelenaam met openbaar om op te geven dat de waarde van deze eigenschap kan worden opgehaald van buiten de klasse. Als we in plaats daarvan de toegang tot het onroerend goed willen beperken tot alleen dit klasse, en misschien elk klassees die ervan erven, zouden we de beschermde voorvoegsel. Deze praktijk wordt inkapseling genoemd.

We hebben de basis klaar voor onze Dribbble API-wrapper. Nu gaan we een nieuw schrijven methode, riep getPlayerShots (). Het doel van dit methode zal zijn om de API te ondervragen en het resultaat om te zetten in een rangschikking voor gebruik binnen onze plug-in.

 class DribbbleAPI // url to Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // Dribbble gebruikersnaam of gebruiker-ID beveiligde $ gebruiker; publieke functie __construct ($ user) $ this-> user = $ user;  openbare functie getPlayerShots ($ perPage = 15) $ user = $ this-> user; $ json = wp_remote_get ($ this-> apiUrl. 'players /'. $ user. '/ shots? per_page ='. $ perPage); $ array = json_decode ($ json ['body']); $ shots = $ array-> shots; $ shots terugsturen; 

Meer informatie over wp_remote_get.

De getPlayerShots function haalt de gebruiker uit de klassenvariabele op. Het gebruikt WordPress ' wp_remote_get functie om de Dribbble API te bevragen. De API reageert vervolgens op onze vraag met een JSON-reeks, die vervolgens in een wordt geparseerd rangschikking en teruggestuurd naar de functie met behulp van de terugkeer trefwoord.

Dit is alles wat we op dit moment van de API nodig hebben - gewoon een rangschikking van speler shots. Als we in de toekomst meer functionaliteit nodig hebben, kunnen we meer toevoegen methodes tot de stroom klasse, of maak een nieuwe klasse die breidt deze uit. Nogmaals, dit wordt erfelijkheid genoemd.


Stap 3 - Integratie van de DribbbleAPI Klasse

Dit is het leuke gedeelte; de vers gebakken DribbbleAPI klasse zal in gebruik komen. We gaan de opnames doorzoeken die zijn opgehaald uit de API en genereren een html lijst met opnames, die worden doorgegeven aan de shortcode en de sjabloontag. Tijdens de lus worden de Dribbble-afbeeldingen op ware grootte in de cache opgeslagen en opgeslagen in de map voor invoegtoepassingen. De miniaturen worden gemaakt met TimThumb.

Om te bepalen of de volledige afbeeldingen al lokaal zijn opgeslagen, is de plugin pad Is benodigd. Ook om miniaturen mee te genereren TimThumb, de plugin url Is benodigd. Voor dit doel zullen we twee klassenvariabelen maken genaamd pluginPath en pluginURL in onze WPDribbble klasse en stel vervolgens hun waarden in binnen de constructor methode.

PluginPath en PluginUrl instellen

 klasse WPDribbble protected $ pluginPath; beschermde $ pluginUrl; publieke functie __construct () // Set Plugin Path $ this-> pluginPath = dirname (__ FILE__); // Stel Plugin URL $ this-> pluginUrl = WP_PLUGIN_URL in. '/ Wp-Dribbble'; add_shortcode ('Dribbble', array ($ this, 'shortcode')); 

getImages () Methode

Maak een nieuw methode binnen de WPDribbble klasse, riep getImages.

Binnen een klasse, u kunt generieke namen gebruiken voor functies. Ze komen niet in conflict met andere plug-ins of ingebouwde functies van WordPress, omdat ze onder de klasse namespace.

 openbare functie getImages ($ user, $ images = 3, $ width = 50, $ height = 50, $ caption = true) 
  • $ user - Gebruikersnaam of gebruikersnaam van Dribbble. $ user wordt gebruikt bij het registreren van een nieuw exemplaar van de DribbbleAPI klasse.
  • $ images - Het aantal afbeeldingen dat moet worden weergegeven. $ images wordt gebruikt bij het opvragen van de API via de getPlayerShots methode.
  • $ breedte en $ hoogte - Timthumb zal worden gebruikt om thumbnails te genereren.
  • $ caption - Optie om de titel van een afbeelding te renderen.

Vervolgens gaan we de DribbbleAPI klasse in de getImages () functie, en maak er een nieuw exemplaar van om de afbeeldingen te pakken.

 openbare functie getImages ($ user, $ images = 3, $ width = 50, $ height = 50, $ caption = true) include 'DribbbleAPI.php'; $ DribbbleAPI = nieuwe DribbbleAPI ($ user); $ shots = $ DribbbleAPI-> getPlayerShots ($ afbeeldingen); if ($ shots) 

De $ shots variabele in de code is gevuld met een rangschikking van drie recente Dribbbles uit de $ user.

Zoals eerder vermeld, gaan we door de $ shots rangschikking, en sla de afbeeldingen op volledige grootte lokaal op voor cachedoeleinden. De afbeeldingen in de cache worden gebruikt met TimThumb om de miniaturen te bedienen. Voor het opslaan van volledige afbeeldingen en miniaturen gegenereerd door TimThumb, maak twee mappen. We zullen gebruiken full-images / voor het opslaan van afbeeldingen op volledig formaat, en cache / voor de miniaturen, omdat dat de standaard mapnaam voor TimThumb is.

De HTML voor de lijst wordt gegenereerd binnen de $ shots lus.

 openbare functie getImages ($ user, $ images = 3, $ width = 50, $ height = 50, $ caption = true) include 'DribbbleAPI.php'; $ DribbbleAPI = nieuwe DribbbleAPI ($ user); $ shots = $ DribbbleAPI-> getPlayerShots ($ afbeeldingen); if ($ shots) $ html [] = '
    '; foreach ($ shots als $ shot) $ image = $ shot-> image_url; // url van de afbeelding $ fileName = $ shot-> id. '.Png'; // genereert een bestandsnaam image_id.png if (! file_exists ($ this-> pluginPath. '/ full-images /'. $ fileName)) // controleer of de volledige afbeelding bestaat $ rawImage = wp_remote_get ($ image); // verkrijg de volledige afbeelding $ newImagePath = $ this-> pluginPath. '/ volledige afbeeldingen /'. $ FileName; $ fp = fopen ($ newImagePath, 'x'); fwrite ($ fp, $ rawImage ['body']); // sla de volledige afbeelding fclose op ($ fp); // genereer thumbnail url $ localImage = $ this-> pluginUrl. '/timthumb.php?src='. strstr ($ this-> pluginPath, 'wp-content'). '/ volledige afbeeldingen /'. $ fileName. '& w ='. $ breedte. '& h ='. $ hoogte. '& Q = 100; if ($ caption) // als caption is true $ captionHTML = '

    '. $ shot-> titel. '

    '; // combineer shot-url, titel en thumbnail om toe te voegen aan de ul-lijst $ html [] = '
  • url. '"title ="'. $ shot-> titel. '">' . $shot->titel. ''.$captionHTML.'
  • '; $ html [] = '
'; return implode ("\ n", $ html);

Klassen toevoegen

Het is altijd een goed idee om klassen toe te voegen aan elk element van uw plug-in. Dit biedt de geavanceerde gebruikers van uw plug-in de vrijheid om het aan te passen. Vermijd het gebruik van inline CSS voor inhoud die wordt gegenereerd via uw plug-in.


Stap 4 - De shortcode instellen

Shortcodes, zoals de naam al doet vermoeden, stelt gebruikers in staat om eenvoudig complexe inhoud toe te voegen aan blogposts.

We hebben al de add_shortcode haak klaar in onze plugin class constructor. Nu gaan we de shortcode schrijven methode in onze klasse, die de shortcode-attributen zal verlengen en de Dribbble-afbeeldingen retourneren met behulp van de getImages () methode.

We zullen onze shortcode bellen [Dribbble]. Zoals eerder vermeld, wordt de naam van de shortcode bepaald door de eerste parameter in de add_shortcode functie. Het zal worden gebruikt met de attributen die vereist zijn voor de getImages () methode. Bijvoorbeeld: [Dribbble user = haris images = 5 width = 100 height = 100 caption = true].

 openbare functie shortcode ($ atts) // extraheer de attributen in variabelen extract (shortcode_atts (array) ('images' => 3, 'width' => 50, 'height' => 50, 'caption' => true,) , $ atts)); // geef de attributen door aan de functie getImages en geef de afbeeldingen return $ this-> getImages ($ atts ['user'], $ images, $ width, $ height, $ caption); 

Voeg Shortcode-ondersteuning toe voor WordPress Widgets

Standaard ondersteunen WordPress-widgets geen shortcodes, echter met behulp van de widget_text filter, kunnen we shortcode-ondersteuning forceren in WordPress-widgets.

We kunnen het filter toevoegen in onze WPDribbble objectbouwer.

 publieke functie __construct () // Set Plugin Path $ this-> pluginPath = dirname (__ FILE__); // Stel Plugin URL $ this-> pluginUrl = WP_PLUGIN_URL in. '/ Wp-Dribbble'; add_shortcode ('Dribbble', array ($ this, 'shortcode')); // Voeg shortcode-ondersteuning toe voor widgets add_filter ('widget_text', 'do_shortcode'); 

Stap 5 De sjabloontag instellen

De sjabloontag kan rechtstreeks in WordPress-thema's worden gebruikt. Het basisdoel van de sjabloontag is om een ​​nieuw exemplaar van ons te maken WPDribbble klasse, en bel de getImages () methode. De sjabloontag is een eenvoudige PHP-functie en moet buiten de plug-in worden geregistreerd klasse. Het moet een unieke naam hebben; anders zal het conflicteren met functies / plug-ins met dezelfde naam. Omdat onze plug-in is aangeroepen WP-Dribbble, we bellen de sjabloon-tag, wp_Dribbble ().

 functie wp_Dribbble ($ user, $ images = 3, $ width = 50, $ height = 50, $ caption = true) $ wpDribbble = new WPDribbble; echo $ wpDribbble-> getImages ($ user, $ images, $ width, $ height, $ caption); 

Voila!

Gefeliciteerd! U hebt met succes een WordPress-plug-in met OOP geschreven. Als u vragen heeft, laat het me weten, en ik zal mijn best doen om u te helpen?