Använda namnområden och autoloading i WordPress-plugin, del 1

Namnrymder och autoloading är inte ämnen som vanligtvis diskuteras när det gäller att arbeta med WordPress-plugins.

Några av detta har att göra med det samhälle som ligger runt det, en del av detta har att göra med versionerna av PHP som WordPress stöder, och en del av det handlar helt enkelt om att inte många talar om det.

Och det är okej, i en utsträckning.

Varken namespaces eller autoloading är ämnen som du absolut behöver använda för att skapa plugins. De kan dock ge ett bättre sätt att organisera och strukturera din kod samt minska antalet fordra, require_once, inkludera, eller include_once uttalanden som dina plugins använder.

I den här serien ska vi titta på exakt vad PHP namnområden är, varför de är fördelaktiga och hur de ska användas. Då ska vi titta på hur man använder autoladdare för att automatiskt ladda de filer vi behöver utan att manuellt ladda dem i vår kod.

Innan vi börjar

För att komma igång behöver du följande verktyg:

  • En lokal utvecklingsmiljö som innehåller PHP 5.6.20, Apache webbservern och en MySQL databas server.
  • En katalog där WordPress 4.6 är värd.
  • En textredigerare eller IDE av ditt val som du är bekväm med att använda för att skriva ett plugin.
  • En fungerande kunskap om WordPress Plugin API.

När du har allt det på plats, låt oss börja om att bygga ett plugin. Observera att om något av ovanstående verkar nytt för dig, tveka inte att granska någon av mina tidigare handledning på min profilsida. 

Dessutom kan du följa mig på min blogg och / eller Twitter på @tommcfarlin där jag pratar om mjukvaruutveckling i samband med WordPress.

Med det sagt, låt oss börja.

Vad vi ska bygga

I denna serie ska vi bygga ett enkelt plugin för att visa hur namnområden och autoladdning fungerar i PHP. Men för att göra det hjälper det alltid att tillämpa koncepten på ett praktiskt sätt.

För det ändamålet bygger vi ett plugin som gör det enkelt att ladda stilarketter och JavaScript-stilar i vårt plugin, och det visar en metabox som frågar användaren med en fråga för att hjälpa dem att brainstorma något om att blogga.

Nej, det här är inte något som du troligen skulle skicka till WordPress Plugin Repository, det är inte heller något som du sannolikt kommer att använda utanför den här demonstrationen. Men kom ihåg, syftet med denna serie är att visa hur namnområden och autoloading fungerar.

Och det är genom det här exemplet att vi ska göra just det.

Bygga plugin

Om du har följt någon av mina tidigare handledningar vet du att en av de saker jag tycker är att planera ut vad vi ska bygga innan vi hoppar in på att skriva någon kod. Så för den första iterationen av denna plugin så är det vad vi vet att vi kommer att behöva göra:

  1. Definiera en bootstrap-fil för att starta plugin.
  2. Ställ in en katalog för alla filer som kommer att göra meta boxen.
  3. Skapa en katalog för att bo i klassen som kommer att ladda våra beroenden.
  4. Förbered stilarken och JavaScript för vårt plugin.

Det verkar enkelt, eller hur? Om inte, inga bekymmer. Jag ska gå igenom hela processen, komplett med kod, kommentarer, skärmdumpar och förklaringar. 

Låt oss börja.

Skapa Plugin Directory

Från början vet vi att vi behöver en fil som fungerar som bootstrap för plugin. Vi vet också att vi behöver en katalog för administrativ funktionalitet.

Låt oss fortsätta och skapa det nu:

Självklart har vi en enda tom fil och en admin katalog. Låt oss fortsätta och konfigurera det här plugin så att det visas inom ramen för WordPress Plugin-aktiveringsskärmen.

För att göra detta måste vi lägga till följande block av kod till toppen av pluginfilen:

När du navigerar till WordPress-plugin-sidan i administrationsområdet bör du se det visas i din lista med pluginprogram. Om du väljer att aktivera det kommer inget att hända eftersom vi inte har skrivit någon kod.

Vid denna tidpunkt kan vi gå vidare och börja definiera klassen som kommer att göra vår metakassa på Lägg till ny post sida.

Lägga till en Meta Box

Denna del av handledningen förutsätter att du är lite känd för att skapa metakasser. Om inte, tveka inte att granska koncepten i denna serie och sedan återvända till den här delen en gång gjort. 

Låt oss först skapa en fil som heter klass-meta-box-display.php i administration katalogen i vårt plugin. Koden ska innehålla följande. Var noga med att granska kommentarerna för att du förstår allt som denna klass är ansvarig för.

Från koden ovan bör du kunna kontrollera att den här klassen kommer att ansvara för att visa innehållet inom meta-rutan. För nu har vi emellertid bara det att echoing ett uttalande för vyn. 

Vi ändrar det senare i handledningen.

Därefter måste vi introducera en klass som representerar metaboxen själv. Så skapa en klass-meta-box.php fil i administration katalogen i vårt plugin. Här är koden för att göra exakt det. Återigen, granska koden och sedan förklarar jag vad som händer under klassen:

display = $ display;  / ** * Registrerar den här meta-rutan med WordPress. * * Definierar en meta-box som kommer att ge inspirerande frågor högst * i sidofältet på sidan Lägg till ny post för att hjälpa till med omedelbara bloggare med något att skriva om när de börjar skriva ett inlägg. * / public function init () add_meta_box ('tutsplus-post-questions', 'Inspiration Questions', array ($ this-> display, 'render'), 'post', 'sida', 'high');  

Denna klass upprätthåller ett enda attribut som är en referens till dess visning. Det betyder att den här klassen är ansvarig för att definiera metakassetten (som i sin tur uppmanar visningsobjektet att göra meddelandet).

Skärmen bibehålls som en privat egendom som sätts i konstruktören. Metaboxen är inte definierad förrän i det Metoden heter (som vi kommer se i pluginens bootstrap senare i handledningen).

Vid denna tidpunkt har vi allt vi behöver för att visa en rudimentär meta-låda på Lägg till ny inläggssida. Men först måste vi ställa in vårt plugin bootstrap.

I tidigare tutorials har jag gjort det så mycket jag ska inkludera bara koden som krävs (eftersom jag har definierat rubriken ovan). Jag har lagt till kommentarer, men jag kommer också att se till att förklara vad som händer efter koden. 

Detta är speciellt relevant eftersom vår autoloader i slutändan kommer att negera behovet av något av vad du ska se.

i det();  

Först kontrollerar vi att den här filen inte kan nås direkt och den kan endast köras av WordPress själv.

Nästa, vi include_once de klasser vi hittills har skapat. Därefter instanserar vi Meta_Box och skicka det till en förekomst av Meta_Box_Display i sin konstruktör.

Slutligen kallar vi i det metod som bor i Meta_Box klass.

Förutsatt att allt går bra, borde vi kunna aktivera pluginet och se meta-rutan på en Lägg till ny post sida (eller, verkligen, en Uppdatera inlägg sida).

Vid denna tidpunkt har vi ett fungerande plugin, men det gör inte annat än att skapa en metakassa och visa en sträng text.

låt oss åtminstone få det att visa några inspirerande citat och visa en slumpvis varje gång sidan laddas.

Visar Inspiration Quotes

Först måste vi hitta en textfil med inspirations citat. Lyckligtvis tillhandahåller Internet en uppsjö av dessa som vi kan använda i vårt projekt (och de är fritt tillgängliga). För det ändamålet har jag skapat en data underkatalog i administration som jag använder för att hysa min questions.txt fil.

Därefter måste vi skapa en klass som ska:

  1. Öppna filen.
  2. Läs en slumpmässig rad i en sträng.
  3. Stäng filen.
  4. Återför strängen till den som ringer.

Låt oss gå vidare och skapa den klassen nu. Eftersom det här är ett verktyg och det ska användas på administratörssidan av plugin, låt oss skapa en util underkatalog i administration. Låt oss sedan skapa en fil som heter klass-fråga-reader.php.

Vi ska ange koden för den här klassen på ett ögonblick, men återvända till pluginens bootstrap-fil och kom ihåg att inkludera filen. Den resulterande koden ska se ut så här:

Som du kan se, blir antalet filer vi manuellt behöver ta längre tid. Tänk om vi arbetade med ett stort plugin! Ändå kommer vi tillbaka senare i serien.

För nu, låt oss rikta vår uppmärksamhet tillbaka till fråge läsaren. Koden för klassen ska se så här ut:

öppet ($ filnamn); $ question = $ this-> get_random_question ($ file_handle, $ filnamn); $ this-> close ($ file_handle); returnera $ fråga;  / ** * Öppnar filen för att läsa och returnerar resursen till filen. * * @access privat * @paramsträng $ filnamn Banan till filen som innehåller frågan. * @return resource En resurs till filen. * / privat funktion öppen ($ filnamn) return fopen ($ filnamn, 'r');  / ** * Stänger filen som lästes. * * @access privat * @paramsträng $ file_handle Resursen till filen som lästes. * / privat funktion stäng ($ file_handle) fclose ($ file_handle);  / ** * Öppnar filen för att läsa och returnerar resursen till filen. * * @access privat * @paramsträng $ file_handle Resursen till filen som lästes. * @paramsträng $ filnamn Banan till filen som innehåller frågan. * @returnsträng $ fråga Frågan som ska visas i metaboxen. * / privat funktion get_random_question ($ file_handle, $ filnamn) $ questions = fread ($ file_handle, file size ($ filnamn)); $ questions = explodera ("\ n", $ questions); // Leta efter en fråga tills en tom sträng inte längre returneras. $ question = $ questions [rand (0, 75)]; medan (tom ($ fråga)) $ question = $ questions [rand (0, 75)];  returnera $ fråga  

Observera att koden för detta är relativt enkel, men om du inte är bekant med några av de grundläggande filoperationerna i PHP, så här är vad vi gör:

  1. Vi öppnar filen med fopen, vilket ger oss en resurs att läsa filen.
  2. Därefter läser vi innehållet i filen och tar sedan varje rad av filen och skriver den till ett index för en array.
  3. Därefter väljer vi ett slumptal från en rad frågor och returnerar den till den metod som kallar den. Om den returnerar en tom sträng ser vi igen tills en fråga är placerad.
  4. Sedan stänger vi resursen till filen.

I slutändan, för att använda den här klassen, behöver du helt enkelt inställa den, känna till sökvägen till en fil full av frågor och ring sedan till get_question_from_file metod.

Notera: Den här klassen gör det inte gör någon felhantering. Det är en vanlig praxis när du arbetar med filer. Till exempel, vad ska vi göra om filen inte existerar? Vad ska vi göra om det inte är formaterat korrekt, eller om vi misslyckas med att stänga resursen?

Alla dessa är bra frågor, men de ligger utanför ramen för denna handledning. All denna information finns i PHP-handboken (och kanske några andra handledningar över Envato Tuts + -nätverket).

För närvarande är vi dock oroade över att läsa en fil som vi vet existerar, och vi är oroliga över att visa resultaten i en metabox.

Vad vi har hittills

Vid den här tiden kan vi börja lägga allt ihop. Om vi ​​antar att vi har gjort allt rätt, borde vi kunna skicka en förekomst av Question_Reader till Meta_Box_Display, fråga en fråga och visa sedan den i metaboxen.

Låt oss först uppdatera bootstrap-filen:

i det(); 

I koden ovan märker du att Meta_Box_Display accepterar nu en instans av frågeläsaren i sin konstruktör. Det innebär att vi måste introducera en ny egendom, som vi ska göra nu:

question_reader = $ question_reader;  / ** * Ger en enda sträng i samband med metaboxen som den här * -skärmen tillhör. * / public function render () $ file = dirname (__FILE__). '/Data/questions.txt'; $ question = $ this-> question_reader-> get_question_from_file ($ file); echo wp_kses ($ question);  

Observera att den här filen använder sökvägen till de frågor som filen har lagt till i databiblioteket. Förutom att banan är hårdkodad är denna klass också beroende av en förekomst av Question_Reader.

För den demo som vi arbetar mot (nämligen namnområden och autoloading) är det okej. I ett framtida projekt vill vi att projekten har mindre koppling mellan varandra. Kanske är det här ett ämne för en framtida handledning.

Den primära takeaway från koden ovan är dock att Meta_Box_Display klassen kan nu visa en fråga till användaren.

Vidare märker användningen av wp_kses för att sanitera data innan den presenteras för användaren.

Uppfriskande Lägg till ny post sida ska presentera dig med en bild så här:

Och om du uppdaterar sidan kan du se att nya frågor laddas.

Var går vi härifrån?

Självklart har vi ännu inte riktigt hanterat ämnena namespaces och autoloading, men det är okej! Det är viktigt att vi lägger grunden för ett plugin som inte använder dem. På så sätt när vi do implementera dem, vi kan se fördelarna de bär.

Dessutom har vi fortfarande lite mer arbete att göra: Vi måste presentera JavaScript och CSS och en tillgångarlastare. Detta gör det möjligt för oss att få en ännu bredare bild av hur förpackning av våra filer till namnområden är fördelaktigt.

Kom ihåg att du kan hitta alla mina tidigare handledning på min profilsida, och du kan följa mig på min blogg eller på Twitter.

Som alltid, om du letar efter andra verktyg för att hjälpa dig att bygga ut din växande uppsättning verktyg för WordPress eller till exempel kod för att studera och bli mer välbevandrad i WordPress, glöm inte att se vad vi har tillgängliga i Envato Marknadsföra.

Med det sagt kommer vi att ha en fungerande version av plugin redo att ladda ner med början i nästa handledning i denna serie. Om du vill använda koden i ovanstående handledning, tveka inte att försöka göra det. Dessutom är du välkommen att ställa några frågor i kommentarerna. 

Medel

  • add_meta_box
  • add_action
  • plugins_loaded
  • fopen
  • fread
  • fclose
  • wp_kses