Twee manieren om WordPress-plug-ins te ontwikkelen Object-Oriented Programming

Als het gaat om het schrijven van WordPress-plug-ins, zijn er over het algemeen twee manieren om dit te doen: objectgeoriënteerde programmering en functionele programmering (waarbij widgets de uitzondering vormen - we zullen dat later in het artikel bespreken).

Hoewel je over het algemeen mensen hebt die instemmen met de ene programmeerstijl boven de andere, stelt elk zijn eigen set van voor- en nadelen voor.

In deze tweedelige serie gaan Stephen Harris en ik de twee manieren uiteen die je kunt doen om WordPress-plug-ins te schrijven. Ik ga het in het bijzonder hebben over objectgeoriënteerd programmeren en hij zal functionele programmering behandelen.

Omdat het ervaringsniveau van lezers varieert, gaan we het hebben over programmeren op een hoog niveau, dus als je een beginner bent, zou je geen probleem moeten hebben om mee te werken. Als u echter een meer ervaren ontwikkelaar bent, vindt u mogelijk later meer nuttige informatie in het artikel.

Met dat gezegd, laten we beginnen met het kijken naar een object-georiënteerde benadering van het ontwikkelen van WordPress-plug-ins.


Het ontwikkelen van WordPress Widgets

Zoals vermeld in de inleiding, kunnen plug-ins op twee manieren voor WordPress worden ontwikkeld:

  1. Object georiënteerd programmeren
  2. Functioneel programmeren

Het tweede artikel in de serie gaat over Functional Programming, maar laten we een werkdefinitie van objectgeoriënteerd programmeren bieden, zodat we allemaal op hetzelfde niveau zitten in dit artikel.

Wikipedia verklaart:

Object-oriented programming (OOP) is een programmeerparadigma dat "objecten" gebruikt - meestal voorbeelden van een klasse - bestaande uit gegevensvelden en methoden, samen met hun interacties - om applicaties en computerprogramma's te ontwerpen.

Degenen die meer ervaring hebben met computerprogrammering, vooral degenen die object-georiënteerde programmeertechnieken gebruiken, zullen die definitie waarschijnlijk leuk vinden.

Maar laten we het vereenvoudigen voor de doeleinden van dit artikel:

Objectgeoriënteerd programmeren is een programmeertechniek die een verzameling verwante methoden gebruikt om een ​​computerprogramma of een deel van een computerprogramma te definiëren.

Eenvoudig genoeg, toch? In ons geval zijn onze plug-ins beslist een deel van een computerprogramma omdat ze aansluiten op WordPress.

Hoewel we in de rest van dit artikel naar code zullen kijken, merk je op dat objectgerichte programma's worden geïdentificeerd door de groepering van hun gerelateerde methoden en dat wordt gedaan in de context van wat een klasse wordt genoemd - die we binnenkort behandelen.

Een woord over widgets

Hoewel het klopt dat WordPress-plug-ins kunnen worden ontwikkeld met behulp van OOP of functionele programmering, is er een uitzondering als het gaat om het ontwikkelen van widgets.

Volgens het Codex-artikel over het ontwikkelen van widgets, moet de volgende structuur worden gebruikt voor het schrijven van een widget:

class My_Widget breidt WP_Widget uit public function __construct () // feitelijke widgetprocessen public function form ($ instance) // geeft het optieformulier weer bij admin public function update ($ new_instance, $ old_instance) // verwerkt widgetopties wordt opgeslagen openbare functie widget ($ args, $ instantie) // geeft de inhoud van de widget uit

Dit betekent dat allemaal Widgets moeten worden geschreven met behulp van OOP. Als je code niet hebt gezien zoals hierboven, zullen we dat in het volgende gedeelte behandelen en het moet alles bieden wat je moet weten om te begrijpen wat er aan de hand is.


Een beknopte inleiding tot OOP

Voordat we beginnen met het bouwen van OOP-gebaseerde plug-ins voor WordPress, laten we de basisprincipes van OOP eens nader bekijken om ervoor te zorgen dat we duidelijk zijn over terminologie en hoe het paradigma werkt.

Klassen

Zoals we eerder hebben gedefinieerd, gebruikt OOP 'een verzameling verwante methoden'. Maar we kunnen daar niet stoppen. Functioneel programmeren doet immers hetzelfde.

In OOP zijn deze "gerelateerde methoden" allemaal gerelateerd in de context van wat a wordt genoemd klasse. In het voorbeeld Widget hierboven ziet u de klasse sleutelwoord als het allereerste woord in de code.

Het begint op een regel die eindigt met een openingshaak (net als bij functies), en vervolgens worden alle bijbehorende functies ingekapseld - of verpakt - voordat de afsluiting wordt beëindigd (negeer nu de strekt sleutelwoord in het Widget-voorbeeld - we zullen dat in een ogenblik aansnijden).

Een logische groepering van functies

Als je net bent begonnen met het schrijven van lessen en je je afvraagt ​​of een functie in een bepaalde klas thuishoort, stel jezelf dan de vraag of de functie klinkt als iets dat een bepaalde klas zou doen.

Bijvoorbeeld in het Widget-voorbeeld hierboven, de bijwerken methode is natuurlijk iets dat een widget zou doen. Maar laten we zeggen dat je een klas schrijft die verantwoordelijk zal zijn voor het lezen van een blogpost in de WordPress-database. Het zou logisch zijn als die specifieke klasse een functie zou hebben lezen of read_by_id, maar moet het een functie hebben genaamd schrijven? Hoe zit het met verwijderen?

Afhankelijk van hoe je je klas hebt ontworpen, mogelijk. Maar als het zool doel van de klas is om gegevens te lezen, waarschijnlijk niet.

En dat is OOP: het is logisch dat je je functies in een klas samenvoegt, maar de logische groepering hangt af van de verantwoordelijkheid die je aan je klas geeft.

Geavanceerde onderwerpen in OOP

OOP is een krachtig paradigma dat overal in de WordPress-applicatie wordt gebruikt. OOP maakt geavanceerde bewerkingen mogelijk, zoals overerving (die wordt gerepresenteerd door de strekt sleutelwoord in de Widget-klasse), ontwerppatronen die in wezen bestaande oplossingen voor veel voorkomende problemen zijn.

Dit artikel probeert niet om een ​​diepe duik te nemen in objectgeoriënteerd programmeren. Het probeert eenvoudigweg een basis te bieden van waaruit we de twee manieren om WordPress-plug-ins te schrijven kunnen verkennen, maar ik noem ze hier als je geïnteresseerd bent om verder te duiken in objectgeoriënteerd programmeren.


Ontwikkelen van op klassen gebaseerde plug-ins

Nu we objectgeoriënteerd programmeren hebben gedefinieerd en net genoeg hebben onderzocht om een ​​basis te leggen, is het tijd om daadwerkelijk te beginnen praten over de componenten van OOP-gebaseerde ontwikkeling in de context van WordPress-plug-ins.

In de rest van dit artikel gaan we in op de basis van wat er nodig is voor het schrijven van op OOP gebaseerde plug-ins en de voordelen die dit oplevert.

De klasse definiëren

Voordat je het doet iets in object-georiënteerde ontwikkeling, moet je je klasse definiëren. Ervan uitgaande dat je al een idee hebt over wat je klas gaat doen, is dit over het algemeen een kwestie van bedenken wat je jouw klas wilt noemen.

Voor het grootste deel denk ik dat het bekijken van voorbeeldcode altijd van voordeel is bij het onderwijzen van code, dus we zullen een kijkje nemen op de WordPress Plugin Boilerplate.

Merk op dat de Plugin Boilerplate een project is dat ik oorspronkelijk heb gemaakt om op OOP-gebaseerde plug-ins te helpen starten. Het is sindsdien bijgedragen door een aantal verschillende mensen. Ik gebruik het in dit artikel omdat het het onderwerp laat zien.

Dat gezegd hebbende, merk op dat de klassendefinitie voor de Plugin Boilerplate er als volgt uitziet:

class PluginName // More to come ...

Omdat de Plugin Boilerplate een startpunt is voor ontwikkeling, hebben we de klasse uiteraard hernoemd. Laten we het voor dit artikel noemen DemoPlugin.

class DemoPlugin // More to come ...

Op dit punt zijn we klaar om te beginnen met het definiëren van functies die binnen de klas leven.

De aannemer

In OOP is de eerste functie die je waarschijnlijk in een klas ziet, een functie die 'de constructor' wordt genoemd en PHP is niet anders.

Een eenvoudige, werkende definitie van de constructeur is deze:

De constructor is waar u de gegevens initialiseert die in de klas zullen worden gebruikt.

Hoe dit werkt, verschilt van project tot project, maar er zijn twee belangrijke dingen die we kunnen doen in de context van een WordPress-plug-in:

  1. Stel het tekstdomein in voor lokalisatiedoeleinden
  2. Definieer onze acties en filters (specifiek, onze acties en onze filters).

In onze DemoPlugin, we gaan precies dat doen. We zullen een tekstdomein instellen van demo-plugin en we registreren acties voor het registreren en in de wacht zetten van een voorbeeld van een stylesheet en een voorbeeld van een JavaScript-bestand.

Om compleet te zijn in ons voorbeeld, registreren we ook een haak om tekst toe te voegen aan het einde van de inhoud die in een bericht wordt weergegeven.

Laten we eerst de constructor definiëren:

class DemoPlugin public function __construct () 

Merk op dat in PHP een constructor wordt gedefinieerd door een publieke functie met de naam construeren dat is voorafgegaan door twee onderstrepingstekens.

Laten we vervolgens ons tekstdomein definiëren:

class DemoPlugin public function __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); 

In de bovenstaande coderegel noteren we dat we de sleutel hebben gedefinieerd voor ons tekstdomein demo-plugin en de lijn verwacht de lokaliseringsbestanden te vinden in een submap genaamd LANG in de map van de plug-in.

Omdat localisatie buiten het toepassingsgebied van dit artikel valt, zal ik niet verder duiken, maar u kunt de broncode van de Plugin-boilerschotel bekijken om te zien hoe dit is ingesteld.

Stel vervolgens de acties voor het registreren van onze stylesheets en JavaScript in, evenals de filter die tekst toevoegt aan het einde van onze inhoud:

class DemoPlugin public function __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles')); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts')); add_filter ('the_content', array ($ this, 'append_post_notification')); 

Als je niet bekend bent met acties en filters, lees dan zeker een van mijn recente artikelen hier over Wptuts + omdat het verschil verklaart.

Als u bekend bent met het ontwikkelen van WordPress-thema's of functionele programmering, dan bent u waarschijnlijk gewend om iets als het volgende te zien:

add_action ('wp_enqueue_scripts', 'register_plugin_styles');

Liever dan:

add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles'));

Merk op dat het verschil in de twee bovenstaande aanroepen zit in de tweede parameter. In het bijzonder geven we in onze plug-in een array door, terwijl de eerste regel code gewoon een string doorgeeft.

Omdat we deze plug-in ontwikkelen met behulp van OOP, moet WordPress weten waar het moet worden genoemd register_plugin_styles methode. Omdat het in onze klas leeft, moeten we WordPress vertellen om de methode te gebruiken voor een exemplaar van onze klas.

Logisch?

In essentie vertellen we WordPress: ik heb deze methode genaamd register_plugin_styles, maar je moet het op een instantie van deze klasse noemen (vandaar de deze trefwoord).

Als WordPress nieuw voor u is, maar afkomstig is van een programmeerachtergrond, dan kunt u zich voorstellen dat u WordPress vertelt om dit te doen:

$ demo = nieuwe DemoPlugin (); $ Demo-> register_plugin_styles ();

Hoe dan ook, de bottom line is dat als je je plug-ins aan het ontwikkelen bent met OOP, dan jij moet registreer uw hooks met behulp van een array met twee indexen: de eerste is $ this en de tweede is de naam van de functie.

Een opmerking over Pass-by-Reference en Pass-by-Value

Geavanceerde ontwikkelaars zullen bekend zijn met het vermogen van PHP om te refereren aan referenties en pass-by-value. In WordPress Development is het niet ongewoon om het volgende te zien:

add_action ('wp_enqueue_scripts', array (& $ this, 'register_plugin_styles'));

Waar deze wordt doorgegeven door verwijzing; Vanaf PHP 5.4 is de mogelijkheid om variabelen door te geven tijdens het gesprek, echter verwijderd. Dat is de reden waarom deze zelfstudie ervoor kiest om door te gaan met waarde.

functies

Bij het programmeren zijn functies de code-eenheden die in wezen verantwoordelijk zijn voor 'iets doen'. Bij objectgeoriënteerd programmeren is het handig om ze iets anders te zien.

In OOP worden klassen meestal vertegenwoordigd door zelfstandige naamwoorden. In ons geval hebben we een DemoPlugin. Evenzo zijn functies vaak werkwoorden. Dat wil zeggen, het zijn acties die ons zelfstandig naamwoord kan nemen. Op dit punt hebben we er al voor gekozen om de volgende functies te definiëren:

  • register_plugin_styles
  • register_plugin_scripts
  • append_post_notification

Merk op hoe elke functienaam staat voor een actie die kan worden ondernomen. Dit is een goede vuistregel om te gebruiken bij het schrijven van functies.

Bij functioneel programmeren is er eigenlijk alleen maar het idee van functies; In OOP zijn er echter verschillende soorten functies, waarvan er twee "openbare" functies en "privé" -functies zijn.

Publieke functies

Openbare functies zijn functies die buiten de klas toegankelijk zijn. Dit betekent dat je deze methoden kunt aanroepen zodra je de les hebt geïnstantieerd.

Dit is precies wat we eerder in de volgende code hebben gedaan:

$ demo = nieuwe DemoPlugin (); $ Demo-> register_plugin_styles ();

In principe zijn deze functies toegankelijk voor het publiek (waarbij het publiek een programmeur of een ander object kan zijn).

De functies die we schrijven voor het registreren van onze stylesheets, ons JavaScript en dat we schrijven om tekst aan een bericht toe te voegen hebben om als openbaar gemarkeerd te worden omdat daar zullen een derde partij zijn die hen belt - WordPress.

Laten we de twee functies definiëren voor de wp_enqueue_scripts actie:

public function register_plugin_styles () wp_register_style ('demo-plugin', plugins_url ('demo-plugin / css / plugin')); wp_enqueue_style ('demo-plugin');  public function register_plugin_scripts () wp_register_script ('demo-plugin', plugins_url ('demo-plugin / js / display.js')); wp_enqueue_script ('demo-plugin'); 

Merk nogmaals op dat deze twee functies verwachten dat de stylesheets en JavaScript aanwezig zijn css en js submappen. Om dit in actie te zien, vergeet niet om de plug-in ketelplaat te bekijken.

Laten we tot slot de functie definiëren voor de inhoud filter:

openbare functie append_post_notification ($ content) $ notification = __ ('Dit bericht is toegevoegd met een demoplugin.', 'demo-plugin-locale'); return $ inhoud. kennisgeving $; 

Merk op dat we de __-functie gebruiken om ervoor te zorgen dat ons script gelokaliseerd is met de TEKSTDOMEIN die we in de constructor hebben gedefinieerd.

Privé functies

Als openbare methoden voor iedereen toegankelijk zijn, betekent dit dat privé-functies voor niemand toegankelijk zijn, toch? Grotendeels, dat klopt: de enige persoon - of ding - die private methoden kunnen aanroepen, zijn de klassen waarin ze zijn gedefinieerd.

Dat betekent dat WordPress, externe objecten of programmeurs privé-functies programmatisch kunnen aanroepen. Privé-functies kunnen alleen worden aangeroepen vanuit de klas waarin ze worden gebruikt.

Over het algemeen zijn privé-functies erg handig bij het schrijven van helper-methoden - dat wil zeggen, ze zijn handig voor het intern manipuleren van gegevens om een ​​andere functie te helpen bij het uitvoeren van zijn taak.

Om een ​​werkend voorbeeld te geven, laten we een private functie definiëren die een gelokaliseerde string retourneert die onze append_post_notification functie kan gebruiken:

private function get_localized_notification () return __ ('Dit bericht is toegevoegd met een demoplugin.', 'demo-plugin-locale'); 

Laten we vervolgens de append_post_notification functie om deze nieuwe helper te noemen:

openbare functie append_post_notification ($ content) return $ content. $ This-> get_localized_notification (); 

Merk op dat we de eerste functie hebben vereenvoudigd door een tweede functie toe te voegen. Je zou ook kunnen beweren dat we de leesbaarheid van de initiële functie hebben verhoogd door een oproep toe te voegen aan een functie met een naam die verduidelijkt wat er gebeurt.

Misschien is het belangrijkste om op te merken dat om privé-functies te bellen, u de functieaanroep moet voorafgaan met de $ this trefwoord en de ->. Dit zegt PHP: "Noem de get_localized_notification functie die leeft deze klasse."

In ieder geval hebben we elke methode een enkele verantwoordelijkheid gegeven - een andere goede praktijk in objectgeoriënteerd programmeren - en hebben we het gebruik van zowel openbare als privé-functies aangetoond..

Andere functietypen

Bij objectgeoriënteerd programmeren zijn er ook andere soorten functies die buiten het bestek van dit artikel vallen.

Om compleet te zijn, wilde ik ze hier samenvatten:

  • Statische functies zijn functies waarvoor geen instantie van een klasse hoeft te worden aangeroepen. In plaats daarvan kunt u ze gewoon rechtstreeks op de naam van de klas bellen. Bijvoorbeeld: DemoPlugin :: use_this_static_method ().
  • Beschermde functies zijn als privé-functies, behalve voor subklassen. Dat wil zeggen, de enige objecten die toegang hebben tot beschermde functies zijn subklassen van de gegeven klasse. Dit specifieke type functie speelt in het concept van overerving dat eerder in het artikel werd genoemd.

Voordelen in WordPress

Op dit punt hebben we alle hoge tonen voor objectgeoriënteerde WordPress-ontwikkeling bereikt. Om de voordelen samen te vatten:

1. Alle functies zijn in context

Wanneer u objectgeoriënteerd programmeren gebruikt, hoeft u geen voorvoegsel te gebruiken voor een functie met de naam van het thema of de naam van de plug-in waaraan u werkt, en hoeft u zich ook geen zorgen te maken over het benoemen van een functie die kan interfereren met een WordPress-functie, de functie van een ander thema of de functie van een andere plug-in.

In plaats daarvan leven alle functies binnen de context van een andere klasse. Het enige waar je zeker van moet zijn, is dat je klasse niet iets genoemd wordt dat interfereert met een andere bestaande klasse.

2. Calling Them Outside van de API

Door objectgeoriënteerd programmeren te gebruiken, kunt u programmatisch een beroep doen op uw plug-in van buiten de standaard WordPress API.

Laten we zeggen dat u een thema aan het ontwikkelen bent en dat u iets wilt weergeven in de zijbalk die uw plug-in biedt. In de sidebar-sjabloon kunt u uw plug-in instantiëren en vervolgens methoden erop aanroepen om informatie in de zijbalk te laten schrijven.

Dit is met name handig wanneer u aan een sjabloon werkt en een aantal standaardgegevens wilt opgeven als de gebruiker niet handmatig iets invoert.


Conclusie

Zoals we aan het begin van het artikel zeiden: dit is maar een manier waarop je je WordPress-plug-ins kunt ontwikkelen. In het artikel van Stephen wordt beschreven hoe je dit kunt doen met behulp van functioneel programmeren.

Na het lezen van dit artikel zou je een beter begrip moeten hebben van object-georiënteerd programmeren, de voordelen ervan, en zou je in staat moeten zijn om te volgen met code gedocumenteerd in de Widget API, in mijn gerelateerde Widget Boilerplate, en zelfs door plaatsen in de WordPress codebase.


Middelen

  • Stephen Harris
  • Wikipedia op OOP
  • Een plug-in schrijven
  • Plugin API
  • Widget API
  • WordPress Widget Boilerplate
  • WordPress Plug-in ketelplaat
  • TEKSTDOMEIN
  • Action Reference
  • Filterreferentie
  • __