Bruke navneområder og autolading i WordPress-plugin, del 1

Navnegrupper og autolading er ikke emner som vanligvis diskuteres når det gjelder å jobbe med WordPress-plugins.

Noen av dette har å gjøre med fellesskapet som er rundt det, noe av dette har å gjøre med versjoner av PHP som WordPress støtter, og noen av det har ganske enkelt å gjøre med det faktum at ikke mange mennesker snakker om det.

Og det er greit, i en grad.

Verken namespaces eller autoloading er emner som du absolutt trenger å bruke for å lage plugins. De kan imidlertid gi en bedre måte å organisere og strukturere koden din samt kutte ned på antall krever, require_once, inkludere, eller include_once uttalelser som pluginene dine bruker.

I denne serien skal vi se nærmere på hva PHP navneområder er, hvorfor de er fordelaktige, og hvordan de skal brukes. Deretter skal vi se på hvordan du bruker autoladere til å laste inn filene automatisk uten at du må laste dem manuelt i vår kode.

Før vi begynner

For å komme i gang, trenger du følgende verktøy:

  • Et lokalt utviklingsmiljø som inkluderer PHP 5.6.20, Apache-webserveren og en MySQL-databaseserver.
  • En katalog ut av hvilken WordPress 4.6 er vert.
  • En tekstredigerer eller IDE etter eget valg som du er komfortabel med å bruke til å skrive et plugin.
  • Et arbeidskunnskap om WordPress Plugin API.

Når du har alt dette på plass, la oss begynne å bygge et plugin. Vær oppmerksom på at hvis noen av de ovennevnte virker nye for deg, ikke nøl med å gå gjennom noen av mine tidligere opplæringsprogrammer på min profilside. 

Videre kan du følge meg på bloggen min og / eller Twitter på @tommcfarlin hvor jeg snakker om programvareutvikling i sammenheng med WordPress.

Med det sagt, la oss komme i gang.

Hva vi skal bygge

I denne serien skal vi bygge en enkel plugin først og fremst for å demonstrere hvordan namespaces og autoloading fungerer i PHP. Men for å gjøre det, hjelper det alltid å anvende konseptene på en praktisk måte.

Til det formål skal vi bygge et plugin som gjør det enkelt å laste inn stilark og JavaScript-stiler i pluginet vårt, og det viser en meta-boks som ber brukeren om et spørsmål for å hjelpe dem med å brainstorme noe om å blogge.

Nei, dette er ikke noe du sannsynligvis vil sende til WordPress Plugin Repository, og det er heller ikke noe du vil bruke utenfor denne spesielle demoen. Men husk, formålet med denne serien er å demonstrere hvordan navneområder og autoloading fungerer.

Og det er gjennom dette eksempelet at vi skal gjøre nettopp det.

Bygg pluggen

Hvis du har fulgt noen av mine tidligere opplæringsprogrammer, vet du at en av tingene jeg liker å gjøre er å planlegge hva vi skal bygge før vi hopper inn i å skrive noen kode. Så for den første iterasjonen av dette pluginet, er dette det vi vet at vi skal gjøre:

  1. Definer en bootstrap-fil for å starte plugin.
  2. Sett opp en katalog for alle filene som vil gjøre meta-boksen.
  3. Opprett en katalog for å bo i klassen som vil laste våre avhengigheter.
  4. Forbered stilarkene og JavaScript for pluginet vårt.

Det virker rettferdig, ikke sant? Hvis ikke, ingen bekymringer. Jeg skal gå gjennom hele prosessen, komplett med kode, kommentarer, skjermbilder og forklaringer. 

La oss komme i gang.

Opprette Plugin Directory

Fra begynnelsen vet vi at vi trenger en fil som fungerer som bootstrap for plugin. Vi vet også at vi trenger en katalog for administrativ funksjonalitet.

La oss gå videre og skape det nå:

Tydeligvis har vi en enkelt tom fil og en admin katalog. La oss gå videre og sette opp dette pluginet slik at det vises i sammenheng med WordPress Plugin-aktiveringsskjermbildet.

For å gjøre dette må vi legge til følgende kodenavn øverst i pluginfilen:

Da, når du navigerer til WordPress-plugin-siden i administrasjonsområdet, bør du se det vises i listen over programtillegg. Hvis du velger å aktivere det, skjer ingenting siden vi ikke har skrevet noen kode.

På dette tidspunktet kan vi gå videre og begynne å definere klassen som vil gjøre vår meta-boks på Legg til nytt innlegg side.

Legge til en meta-boks

Denne delen av opplæringen vil anta at du er litt kyndig i å lage metakasser. Hvis ikke, ikke nøl med å se gjennom konseptene i denne serien og deretter gå tilbake til denne delen en gang ferdig. 

La oss først lage en fil som heter klasse-meta-box-display.php i admin katalog av plugin-modulen vår. Koden skal inneholde følgende. Husk å vurdere kommentarene for å sikre at du forstår alt som denne klassen er ansvarlig for.

Fra koden ovenfor bør du være i stand til å fastslå at denne klassen vil være ansvarlig for å vise innholdet inne i meta-boksen. For nå har vi imidlertid bare det ekko en uttalelse for visningen. 

Vi endrer dette senere i opplæringen.

Deretter må vi introdusere en klasse som representerer meta-boksen selv. Så opprett en klasse-meta-box.php fil i admin katalog av plugin-modulen vår. Her er koden for å gjøre akkurat det. Igjen, gjennomgå koden og så forklarer jeg hva som skjer under klassen:

display = $ display;  / ** * Registrerer denne meta-boksen med WordPress. * * Definerer en meta-boks som vil gi inspirerende spørsmål øverst * i sidepanelet på siden "Legg til ny post" for å hjelpe spørrebloggere med noe å skrive om når de begynner å lage et innlegg. * / offentlig funksjon init () add_meta_box ('tutsplus-post-questions', 'Inspiration Questions', array ($ this-> display, 'render'), 'post', 'side', 'high');  

Denne klassen opprettholder et enkelt attributt som er en referanse til skjermen. Dette betyr at denne klassen er ansvarlig for å definere meta-boksen (som i sin tur krever visningsobjektet for å gjøre meldingen).

Skjermen opprettholdes som en privat eiendom satt i konstruktøren. Meta-boksen er faktisk ikke definert til i det Metoden heter (som vi vil se i pluginens bootstrap senere i opplæringen).

På dette punktet har vi alt vi trenger for å vise en rudimentær meta-boks på Legg til ny innleggsside. Men først må vi sette opp pluginets bootstrap.

I tidligere opplæringsoppgaver har jeg gjort dette mye, så jeg skal inkludere bare koden som kreves (siden jeg har definert overskriften ovenfor). Jeg har lagt til kommentarer, men jeg vil også sørge for å forklare hva som skjer etter koden. 

Dette er spesielt relevant fordi vår autoloader vil til slutt negere behovet for noe av det du skal se.

i det();  

Først sørger vi for at denne filen ikke kan nås direkte, og den kan bare kjøres av WordPress selv.

Neste, vi include_once klassene vi har opprettet hittil. Deretter ordner vi Meta_Box og send det en forekomst av Meta_Box_Display i sin konstruktør.

Til slutt kaller vi i det metode som ligger i Meta_Box klasse.

Forutsatt at alt går bra, bør vi kunne aktivere pluginet og se meta-boksen på en Legg til nytt innlegg side (eller, virkelig, en Oppdater innlegg side, så vel).

På dette tidspunktet har vi et fungerende plugin, men det gjør egentlig ikke noe annet enn å lage en meta-boks og vise en streng tekst.

la oss i det minste få det til å vise noen inspirerende sitater og vise en tilfeldig en hver gang siden lastes inn.

Viser Inspirasjon Quotes

Først må vi finne en tekstfil med inspirasjons sitater. Heldigvis tilbyr Internett en overflod av disse som vi kan bruke i prosjektet vårt (og de er fritt tilgjengelige). For det formål har jeg opprettet en data underkatalog i admin som jeg bruker til å huse min questions.txt fil.

Deretter skal vi lage en klasse som vil:

  1. Åpne filen.
  2. Les en tilfeldig linje i en streng.
  3. Lukk filen.
  4. Returner strengen til den som ringer.

La oss gå videre og lage den klassen nå. Fordi dette er et verktøy, og det skal brukes på administrativ side av pluginet, la oss lage en util underkatalog i admin. Neste, la oss lage en fil som heter klasse-spørsmålet-reader.php.

Vi angir koden for denne klassen i et øyeblikk, men går tilbake til pluginets bootstrap-fil og husk å inkludere filen. Den resulterende koden skal se slik ut:

Som du kan se, blir antall filer vi må inkludere manuelt, lenger. Tenk deg om vi jobbet på et stort plugin! Likevel kommer vi tilbake til dette senere i serien.

For nå, la oss få oppmerksomheten tilbake til spørreskjemaet. Koden for klassen skal se slik ut:

Åpne ($ filnavn); $ question = $ this-> get_random_question ($ file_handle, $ filnavn); $ this-> close ($ file_handle); returnere $ spørsmål;  / ** * Åpner filen for å lese og returnerer ressursen til filen. * * @access private * @param string $ filnavn Stien til filen som inneholder spørsmålet. * @return ressurs En ressurs til filen. * / privat funksjon åpen ($ filnavn) return fopen ($ filnavn, 'r');  / ** * Lukker filen som ble lest. * * @access private * @param string $ file_handle Resursen til filen som ble lest. * / privat funksjon lukk ($ file_handle) fclose ($ file_handle);  / ** * Åpner filen for å lese og returnerer ressursen til filen. * * @access private * @param string $ file_handle Resursen til filen som ble lest. * @param string $ filnavn Stien til filen som inneholder spørsmålet. * @return string $ question Spørsmålet som skal vises i meta-boksen. * / privat funksjon get_random_question ($ file_handle, $ filnavn) $ questions = fread ($ file_handle, filstørrelse ($ filnavn)); $ questions = explode ("\ n", $ spørsmål); // Se etter et spørsmål til en tom streng ikke lenger er returnert. $ spørsmål = $ spørsmål [rand (0, 75)]; mens (tomt ($ spørsmål)) $ question = $ questions [rand (0, 75)];  returnere $ spørsmål;  

Legg merke til at koden for dette er relativt enkel, men hvis du ikke er kjent med noen av de grunnleggende filoperasjonene i PHP, er det det vi gjør:

  1. Vi åpner filen ved hjelp av fopen, som vil gi oss en ressurs for å lese filen.
  2. Deretter leser vi innholdet i filen og tar deretter hver linje av filen og skriver den til en indeks av en matrise.
  3. Etter det velger vi et tilfeldig tall fra en rekke spørsmål og returnerer den til metoden som kaller den. Hvis den returnerer en tom streng, ser vi igjen til et spørsmål er funnet.
  4. Så lukker vi ressursen til filen.

Til slutt, for å bruke denne klassen, trenger du bare å instantiere den, kjenne banen til en fil full av spørsmål, og ring deretter get_question_from_file metode.

Merk: Denne klassen gjør ikke Gjør eventuelle feilhåndtering. Det er en standard praksis når du arbeider med filer. For eksempel, hva skal vi gjøre hvis filen ikke eksisterer? Hva skal vi gjøre hvis det ikke er formatert riktig, eller hva om vi ikke klarer å stenge ressursen?

Alle disse er gode spørsmål, men de er utenfor omfanget av denne opplæringen. All denne informasjonen finnes i PHP-håndboken (og kanskje noen andre opplæringsprogrammer over Envato Tuts + -nettverket).

For nå er vi imidlertid opptatt av å lese en fil som vi vet eksisterer, og vi er opptatt av å vise resultatene i en meta-boks.

Hva vi har så langt

På dette punktet kan vi begynne å sette alt sammen. Forutsatt at vi har gjort alt riktig, bør vi kunne passere en forekomst av Question_Reader til Meta_Box_Display, spør om et spørsmål, og vis det i meta-boksen.

La oss først oppdatere bootstrap-filen:

i det(); 

I koden ovenfor merker du at Meta_Box_Display aksepterer nå en forekomst av spørreskjemaet i sin konstruktør. Dette innebærer at vi må presentere en ny eiendom, som vi skal gjøre nå:

question_reader = $ question_reader;  / ** * Gir en enkelt streng i sammenheng med meta-boksen som denne * skjermen tilhører. * / public function render () $ file = dirname (__FILE__). '/Data/questions.txt'; $ question = $ this-> question_reader-> get_question_from_file ($ file); ekko wp_kses ($ spørsmål);  

Legg merke til at denne filen bruker banen til spørsmålene som filen ble lagt til i databiblioteket. Bortsett fra at banen er hardkodd, er denne klassen også avhengig av en forekomst av Question_Reader.

For den demo som vi jobber med (nemlig navneområder og autolading), er det greit. I et fremtidig prosjekt ønsker vi at prosjektene har mindre kobling mellom seg selv. Kanskje dette vil være et emne for en fremtidig opplæring.

Den primære takeaway fra koden ovenfor, er imidlertid at Meta_Box_Display klassen kan nå vise et spørsmål til brukeren.

Legg merke til bruken av wp_kses for å sanitisere dataene før det presenteres for brukeren.

Forfriskende Legg til nytt innlegg siden skal presentere deg med et bilde som dette:

Og hvis du oppdaterer siden, kan du se nye spørsmål lastes inn.

Hvor går vi fra her?

Selvfølgelig har vi ennå ikke å håndtere temaene for navneområder og autolading, men det er greit! Det er viktig at vi legger grunnlaget for et plugin som ikke bruker dem. På den måten, når vi gjøre implementere dem, vi kan se fordelene de har.

Videre har vi fortsatt litt ekstra arbeid å gjøre: Vi må presentere JavaScript og CSS og en eiendomslaster. Dette vil tillate oss å få et enda bredere bilde av hvordan pakking av våre filer i navneområder er gunstig.

Husk at du kan finne alle mine tidligere opplæringsprogrammer på min profilside, og du kan følge meg på bloggen min eller på Twitter.

Som alltid, hvis du leter etter andre verktøy for å hjelpe deg med å bygge ut ditt voksende sett med verktøy for WordPress eller for eksempel kode for å studere og bli mer kjent med WordPress, ikke glem å se hva vi har tilgjengelig i Envato Marked.

Med det sagt, har vi en fungerende versjon av pluginet klar til nedlasting, og starter i neste opplæring i denne serien. Hvis du vil bruke koden i den ovennevnte opplæringen, ikke nøl med å prøve å gjøre det. Videre, gjerne stille spørsmål i kommentarene. 

ressurser

  • add_meta_box
  • ADD_ACTION
  • plugins_loaded
  • fopen
  • fread
  • fclose
  • wp_kses