Namespaces en autoloading zijn geen onderwerpen die meestal worden besproken als het gaat om het werken met WordPress-plug-ins.
Een deel hiervan heeft te maken met de gemeenschap die er omheen is, een deel hiervan heeft te maken met de versies van PHP die WordPress ondersteunt, en een deel heeft simpelweg te maken met het feit dat niet veel mensen erover praten.
En dat is oke, tot op zekere hoogte.
Noch namespaces noch autoloading zijn onderwerpen die je absoluut moet gebruiken om plug-ins te maken. Ze kunnen echter een betere manier zijn om uw code te ordenen en te structureren en het aantal te verminderen vereisen
, eenmalig benodigd
, omvatten
, of include_once
verklaringen die uw plug-ins gebruiken.
In deze serie gaan we precies bekijken welke PHP-naamruimten zijn, waarom ze nuttig zijn en hoe ze te gebruiken. Vervolgens gaan we kijken hoe we autoloaders kunnen gebruiken om de bestanden die we nodig hebben automatisch te laden zonder ze handmatig in onze code te hoeven laden.
Om te beginnen heb je de volgende tools nodig:
Zodra u dat allemaal op zijn plaats hebt, gaan we aan de slag met het bouwen van een plug-in. Merk op dat als een van de bovenstaande nieuw voor u lijkt, aarzel dan niet om bekijk een van mijn vorige tutorials op mijn profielpagina.
Verder kun je me volgen op mijn blog en / of Twitter op @tommcfarlin waar ik het heb over softwareontwikkeling in de context van WordPress.
Met dat gezegd, laten we aan de slag gaan.
In deze serie gaan we een eenvoudige plug-in bouwen, voornamelijk om te demonstreren hoe namespaces en autoloading werken in PHP. Maar om dat te doen, helpt het altijd om de concepten op een praktische manier toe te passen.
Daartoe zullen we een plug-in bouwen die het gemakkelijk maakt om stijlbladen en JavaScript-stijlen in onze plug-in te laden, en die een metabox toont die de gebruiker een vraag stelt om hem te helpen brainstormen over wat hij moet bloggen.
Nee, dit is niet iets dat u waarschijnlijk inlevert bij de WordPress Plugin Repository, en het is ook niet iets dat u waarschijnlijk zult gebruiken buiten deze specifieke demo. Maar onthoud, het doel van deze serie is om te demonstreren hoe namespaces en autoloading werken.
En het is door dit voorbeeld dat we precies dat gaan doen.
Als je een van mijn eerdere tutorials hebt gevolgd, weet je dat een van de dingen die ik leuk vind om te doen is om te plannen wat we gaan bouwen voordat we beginnen met het schrijven van een code. Dus voor de eerste iteratie van deze plug-in is dit wat we weten dat we moeten doen:
Het lijkt eenvoudig, toch? Zo niet, geen zorgen. Ik ga je door het hele proces leiden, compleet met code, opmerkingen, screenshots en uitleg.
Laten we beginnen.
Vanaf het begin weten we dat we een bestand nodig hebben dat als opstart voor de plug-in fungeert. We weten ook dat we een directory nodig hebben voor de administratieve functionaliteit.
Laten we doorgaan en dat nu maken:
Het is duidelijk dat we een enkel leeg bestand en een beheerdersdirectory hebben. Laten we doorgaan en deze plug-in instellen zodat deze wordt weergegeven in de context van het activeringsscherm van WordPress Plugin.
Om dit te doen, moeten we het volgende blok code toevoegen aan de bovenkant van het plugin-bestand:
Wanneer u vervolgens naar de WordPress-pluginpagina in het beheerdersgedeelte navigeert, zou u deze in uw lijst met plug-ins moeten zien verschijnen. Als je ervoor kiest om het te activeren, gebeurt er niets, omdat we geen code hebben geschreven.
Op dit punt kunnen we doorgaan en beginnen met het definiëren van de klasse die onze metabox zal maken op de Voeg nieuwe bericht toe pagina.
Een metabox toevoegen
Dit deel van de tutorial gaat ervan uit dat je enigszins thuis bent in het maken van metaboxen. Als dat niet het geval is, aarzel dan niet om de concepten in deze serie te bekijken en ga daarna terug naar dit gedeelte als u klaar bent.
Laten we eerst een bestand maken met de naam
class-meta-box-display.php
in debeheerder
map van onze plug-in. De code moet het volgende bevatten. Zorg ervoor dat u de opmerkingen leest om er zeker van te zijn dat u begrijpt wat deze klasse allemaal moet doen.Uit de bovenstaande code moet je kunnen vaststellen dat deze klasse verantwoordelijk is voor het weergeven van de inhoud in de metabox. Maar nu laten we het gewoon een echo van een verklaring voor het uitzicht herhalen.
We zullen dit later in de tutorial wijzigen.
Vervolgens moeten we een klasse introduceren die de metabox zelf vertegenwoordigt. Dus maak een
class-meta-box.php
bestand in debeheerder
map van onze plug-in. Hier is de code om precies dat te doen. Nogmaals, bekijk de code en dan leg ik uit wat er onder de klas gebeurt:display = $ display; / ** * Registreert deze metabox bij WordPress. * * Definieert een metabox die inspiratievragen bovenin * van de zijbalk van de pagina 'Nieuwe bericht toevoegen' weergeeft om * bloggers aan te zetten met iets om over te schrijven wanneer ze beginnen met het opstellen van een bericht. * / openbare functie init () add_meta_box ('tutsplus-post-questions', 'Inspiration Questions', array ($ this-> display, 'render'), 'post', 'side', 'high');Deze klasse onderhoudt één attribuut dat een verwijzing naar zijn weergave is. Dit betekent dat deze klasse verantwoordelijk is voor het definiëren van de metabox (die op zijn beurt het weergaveobject roept om het bericht weer te geven).
Het scherm wordt onderhouden als een privé-eigenschap die is ingesteld in de constructor. De metabox is pas echt gedefinieerd tot de
in het
methode wordt aangeroepen (die we later in de tutorial zullen zien in de bootstrap van de plug-in).Op dit punt hebben we alles wat we nodig hebben om een rudimentaire metabox te tonen op de Nieuwe berichtpagina toevoegen. Maar eerst moeten we de opstartbalk van onze plug-in instellen.
In eerdere tutorials heb ik dit veel gedaan dus ik ga opnemen net de code die vereist is (aangezien ik de header hierboven heb gedefinieerd). Ik heb opmerkingen toegevoegd, maar ik zal ook uitleggen wat er gebeurt na de code.
Dit is met name relevant omdat onze autoloader uiteindelijk de noodzaak voor een deel van wat u gaat zien teniet doet.
in het();Ten eerste zorgen we ervoor dat dit bestand niet rechtstreeks toegankelijk is en alleen door WordPress zelf kan worden uitgevoerd.
Vervolgens, wij
include_once
de lessen die we tot nu toe hebben gemaakt. Vervolgens geven we deMeta_Box
en geef het een instantie van deMeta_Box_Display
in zijn constructor.Ten slotte noemen we het
in het
methode die zich in deMeta_Box
klasse.Ervan uitgaande dat alles goed gaat, zouden we in staat moeten zijn om de plug-in te activeren en de metabox te bekijken op een Voeg nieuwe bericht toe pagina (of eigenlijk, een Post bijwerken pagina, ook).
Op dit moment hebben we een werkende plug-in, maar deze doet niet echt iets anders dan een metabox maken en een reeks tekst weergeven.
Laten we tenminste laat het een aantal inspirerende aanhalingstekens weergeven en een willekeurige laten zien elke keer dat de pagina wordt geladen.
Inspiratiecitaten weergeven
Eerst moeten we een tekstbestand met inspiratiecitaten vinden. Gelukkig biedt internet een overvloed van deze die we kunnen gebruiken in ons project (en ze zijn gratis beschikbaar). Daartoe heb ik een gemaakt
gegevens
submap inbeheerder
die ik gebruik om mijn huis te huisvestenQuestions.txt
het dossier.Vervolgens moeten we een cursus maken die:
- Open het bestand.
- Lees een willekeurige regel in een string.
- Sluit het bestand.
- Stuur de string terug naar de beller.
Laten we doorgaan en die klas nu maken. Omdat dit een hulpprogramma is en het zal worden gebruikt in de administratieve kant van de plug-in, laten we een
util
submap inbeheerder
. Laten we vervolgens een bestand maken met de naamclass-vraag-reader.php
.We zullen de code voor deze klasse in een oogwenk opgeven, maar terugkeren naar het opstartbestand van de plug-in en onthouden dat het bestand moet worden opgenomen. De resulterende code zou er als volgt uit moeten zien:
Zoals je ziet, wordt het aantal bestanden dat we handmatig moeten toevoegen langer. Stel je voor dat we aan een grote plug-in bezig waren! Desondanks zullen we hier later in de serie op terugkomen.
Laten we nu onze aandacht weer richten op de vraaglezer. De code voor de klasse zou er als volgt uit moeten zien:
open ($ bestandsnaam); $ question = $ this-> get_random_question ($ file_handle, $ filename); $ this-> close ($ file_handle); return $ vraag; / ** * Opent het te lezen bestand en retourneert de resource naar het bestand. * * @access private * @param string $ bestandsnaam Het pad naar het bestand met de vraag. * @return resource Een resource voor het bestand. * / persoonlijke functie open ($ bestandsnaam) return fopen ($ filename, 'r'); / ** * Sluit het bestand dat is gelezen. * * @access private * @param string $ file_handle De bron voor het bestand dat is gelezen. * / private functie close ($ file_handle) fclose ($ file_handle); / ** * Opent het te lezen bestand en retourneert de resource naar het bestand. * * @access private * @param string $ file_handle De bron voor het bestand dat is gelezen. * @param string $ bestandsnaam Het pad naar het bestand met de vraag. * @return string $ question De vraag die moet worden weergegeven in de metabox. * / private function get_random_question ($ file_handle, $ filename) $ questions = fread ($ file_handle, filesize ($ filename)); $ questions = explode ("\ n", $ vragen); // Zoek een vraag totdat een lege string niet meer wordt geretourneerd. $ question = $ vragen [rand (0, 75)]; while (empty ($ question)) $ question = $ questions [rand (0, 75)]; return $ vraag;Merk op dat de code hiervoor vrij eenvoudig is, maar als je niet bekend bent met enkele basisbewerkingen in PHP, dan is dit wat we doen:
- We openen het bestand met
fopen
, die ons een hulpmiddel zal geven om het bestand te lezen.- Vervolgens lezen we de inhoud van het bestand en nemen dan elke regel van het bestand en schrijven het naar een index van een array.
- Daarna kiezen we een willekeurig getal uit de reeks vragen en geven het terug aan de methode die het roept. Als het een lege tekenreeks retourneert, kijken we opnieuw totdat een vraag wordt gevonden.
- Vervolgens sluiten we de resource voor het bestand.
Uiteindelijk, om deze klasse te gebruiken, hoeft u deze alleen maar te converteren, kent u het pad naar een bestand vol vragen en belt u de
get_question_from_file
methode.Notitie: Deze klasse doet niet doe elke foutafhandeling. Dat is een standaardpraktijk bij het werken met bestanden. Wat moeten we bijvoorbeeld doen als het bestand niet bestaat? Wat moeten we doen als het niet correct is opgemaakt, of wat als we de bron niet sluiten?
Dit zijn allemaal goede vragen, maar ze vallen buiten het bestek van deze tutorial. Al deze informatie is te vinden in de PHP-handleiding (en misschien enkele andere tutorials in het Envato Tuts + -netwerk).
Maar voorlopig houden we ons bezig met het lezen van een bestand waarvan we weten dat het bestaat, en we zijn bezig met het weergeven van de resultaten in een metabox.
Wat we tot nu toe hebben
Op dit punt kunnen we beginnen alles samen te voegen. Ervan uitgaande dat we alles correct hebben gedaan, moeten we een instantie van de
Question_Reader
naar deMeta_Box_Display
, vraag een vraag en geef deze vervolgens weer in de metabox.Laten we eerst het bootstrap-bestand bijwerken:
in het();In de code hierboven, merk op dat de
Meta_Box_Display
accepteert nu een exemplaar van de vraaglezer in zijn constructor. Dit houdt in dat we een nieuw eigendom moeten introduceren, wat we nu zullen doen:question_reader = $ question_reader; / ** * Genereert een enkele string in de context van de metabox waartoe dit * Display behoort. * / public function render () $ file = dirname (__FILE__). '/Data/questions.txt'; $ question = $ this-> question_reader-> get_question_from_file ($ bestand); echo wp_kses ($ vraag);Merk op dat dit bestand het pad gebruikt naar de vragen die het bestand aan de gegevenssubdirectory toevoegt. Afgezien van het pad dat hard-gecodeerd is, is deze klasse ook afhankelijk van een instantie van de
Question_Reader
.Voor de doeleinden van de demo waar we naartoe werken (namelijk namespaces en autoloading), is dat goed. In een toekomstig project zouden we graag zien dat de projecten minder onderlinge koppeling hebben. Misschien is dit een onderwerp voor een toekomstige tutorial.
De primaire afhaalcode van de bovenstaande code is echter dat de
Meta_Box_Display
klasse kan nu een vraag weergeven aan de gebruiker.Merk bovendien het gebruik van op
wp_kses
om de gegevens te ontsmetten voordat deze aan de gebruiker worden gepresenteerd.De. Vernieuwen Voeg nieuwe bericht toe pagina zou je een afbeelding als deze moeten aanbieden:
En als u de pagina vernieuwt, ziet u nieuwe vragen worden geladen.
Wat gaan we nu doen?
Uiteraard moeten we de onderwerpen namespaces en autoloading nog behandelen, maar dat is goed! Het is belangrijk dat we de basis leggen voor een plug-in die deze niet gebruikt. Op die manier, wanneer wij do implementeren, kunnen we de voordelen zien die ze bieden.
Verder hebben we nog wat extra werk te doen: We moeten JavaScript en CSS en een activa-loader introduceren. Dit zal ons in staat stellen om een nog breder beeld te krijgen van hoe het inpakken van onze bestanden in naamruimten voordelig is.
Vergeet niet dat je al mijn vorige tutorials op mijn profielpagina kunt vinden en dat je me kunt volgen op mijn blog of op Twitter.
Zoals altijd, als u op zoek bent naar andere hulpprogramma's om uw groeiende verzameling hulpprogramma's voor WordPress uit te breiden of bijvoorbeeld code om te studeren en meer vertrouwd te raken met WordPress, vergeet dan niet te zien wat we beschikbaar hebben in Envato Markt.
Met dat gezegd, zullen we een werkende versie van de plug-in klaar om te downloaden hebben, te beginnen in de volgende tutorial in deze serie. Als je de code in de bovenstaande tutorial wilt gebruiken, aarzel dan niet om dit te proberen. Verder, voel je vrij om vragen te stellen in de comments.
Middelen