Opprett Vedlikeholdbare WordPress Meta Bokser Verifiser og Sanitize

Gjennom hele denne serien har vi opprettet et plugin som har til hensikt å gi forfattere en måte å samle inn, administrere og lagre ideer og referanser til innhold som de oppretter innen WordPress.

Når vi gjør det, ser vi også måter vi kan organisere plugin på, slik at koden og filorganisasjonen er klar og vedlikeholdbar slik at når plugin fortsetter utvikling, kan vi enkelt legge til, fjerne og vedlikeholde dens egenskaper.

Frem til dette punktet har vi satt sammen den grunnleggende filorganisasjonen for pluginet, samt forenden, men vi har ikke faktisk implementert funksjonalitet for å lagre informasjon til databasen. Og hvis du ikke kan lagre informasjon, er pluginet liten for alle.

I dette innlegget skal vi hoppe tilbake til server-side-koden og begynne å implementere funksjonaliteten som vil:

  1. Bekreft at brukeren har muligheten til å lagre innleggets metadata
  2. Sanitize post-metadataene
  3. Lagre innleggets metadata
  4. Valider og hent postdataene

Vi har fått vårt arbeid kuttet ut for oss. I denne artikkelen skal vi se på de to første trinnene og deretter i neste innlegg, ser vi på de to siste trinnene.

Verifiserer tillatelser

For å verifisere at brukeren har mulighet til å publisere for å lagre post-metadata, må vi implementere en sikkerhetskontroll under serialiseringsprosessen. For å gjøre dette må vi dra nytte av en nonce-verdi.

En nonce er et "nummer som brukes en gang" for å beskytte nettadresser og skjemaer fra å bli misbrukt.

1. Legg til en nonce

For å introdusere en i meta-boksen, kan vi implementere funksjonaliteten i oppslaget som er ansvarlig for gjengivelsen av innleggsmalen. For å gjøre dette, last admin / synspunkter / forfatterne-kommentar-navigation.php og oppdater malen slik at den inneholder et anrop til wp_nonce_field:

Utkast til ressurser utgitt

I koden ovenfor har vi introdusert en nonce som tilsvarer handlingen av å redde forfatterens kommentar (som vi har kalt authors_commentary_nonce) og tilknyttet den med en verdi som er identifisert av authors_commentary.

Vi vil se hvor dette kommer til å spille i kort tid. For nå, hvis du laster inn nettleseren din, ser du ikke noe nytt skjermbilde. Det er fordi nonce-verdiene vises i et skjult felt. 

For de som er nysgjerrige, kan du starte favorittbrowserens utviklingsverktøy, inspisere meta-boksen, og du bør finne noe som følger i oppslaget:

Selvfølgelig, den verdi av din nonce vil være annerledes.

2. Kontroller Nonce

For å sikre at brukeren har tillatelse til å lagre innlegget, vil vi sjekke tre ting:

  1. at brukeren lagrer informasjon for a post posttype
  2. at innlegget ikke blir automatisk lagret av WordPress
  3. at brukeren faktisk har tillatelse til å lagre

Vi skal skrive to hjelpefunksjoner for å oppnå første og tredje, og vi vil bruke noen innebygde funksjoner for å kontrollere nummer to (som faktisk vil bli brukt i den andre hjelperfunksjonen).

Først, la oss gå videre og sette opp kroken og funksjonen som vil bli brukt til å utnytte hjelpefunksjonene og lagre metadataene. I konstruktøren for Authors_Commentary_Meta_Box, legg til følgende linje av kode:

Neste, la oss definere funksjonen. Merk at jeg ringer til to funksjoner i den følgende koden. Vi definerer dem kort tid:

is_valid_post_type () || ! $ this-> user_can_save ($ post_id, 'authors_commentary_nonce', 'authors_commentary_save')) return; 

Gitt koden ovenfor, forteller vi at WordPress bringer vår lagre post funksjon når det er lagre post handling kalles. Inne i funksjonen sier vi "Hvis innlegget som blir lagret, ikke er en" post "posttype, eller hvis brukeren ikke har tillatelse til å lagre, avslutter du funksjonen."

Selvfølgelig må vi definere funksjonene slik at logikken fungerer. Først skal vi skrive is_valid_post_type fungere som en privat funksjon av dagens klasse. Det vil sjekke $ _POST array for å sikre at posten som blir lagret, faktisk er et innlegg.

Deretter legger vi til user_can_save funksjon. Dette er funksjonen som vil sikre at innlegget ikke blir lagret av WordPress, og at hvis en bruker lagrer funksjonen, er nonce-verdien som er knyttet til ettervirkningen riktig satt.

Legg merke til at vi passerer i nonce_action og nonce_id som vi definerte i malen i første trinn. Vi bruker også wp_verify_nonce i forbindelse med nevnte informasjon.

Slik kan vi bekrefte at innlegget som blir lagret, er gjort av en bruker som har riktig tilgang og tillatelser.

Sanitize dataene

Forutsatt at brukeren arbeider med en vanlig posttype og at han / hun har tillatelse til å lagre informasjon, må vi sanitere dataene.

For å gjøre dette må vi gjøre dette på følgende måte:

  1. Kontroller at ingen av informasjonen i post-metadataene er tom
  2. Strip våre alt som kan være farlig å skrive til databasen

Etter at vi har gjort dette, ser vi på å lagre informasjonen for hver av meta-boksene. Men først, la oss jobbe med sanitisering. Det er et par måter vi kan gå på å implementere dette. I forbindelse med dette innlegget vil vi gjøre det på den enkleste måten: Vi kontrollerer at informasjonen er basert på nøkkelen, og hvis den eksisterer, vil vi sanitere den.

For erfarne programmerere vil du sannsynligvis legge merke til at noen kode lukter med koden vi skal skrive. Senere i denne serien skal vi gjøre noen refactoring for å se hvordan vi kan gjøre plugin mer vedlikeholdsbar, så det er en del av intensjonen til dette innlegget.

Med det sagt, hopp tilbake til lagre post funksjon.

1. Utkast

Siden den første kategorien som finnes i meta-boksen er utkast fan, vi starter med det. Legg merke til at det er en textarea, så logikken som eksisterer for å rense den informasjonen, bør være som følger:

  • fjern eventuelle HTML-koder
  • unnslippe innholdet i tekstområdet

Husk at textarea heter Forfattere-kommentar-utkast slik at vi kan få tilgang til den i $ _POST array. For å oppnå dette, bruker vi følgende kode:

Enkelt sagt, vi sjekker for å se om informasjonen i $ _POST array er tomt. Hvis ikke, da vil vi sanitere dataene.

2. Ressurser

Dette bestemte feltet er litt mer formet fordi det er dynamisk. Det vil si at brukeren kan ha alt fra null til mange inntastingsfelter som vi alle trenger å administrere. Husk at denne kategorien er utformet for å primært være for nettadresser, så vi må sørge for at vi på en sikker måte rydder opp informasjonen på den måten.

Først må vi gjøre en liten endring til createInputElement funksjon som eksisterer innenfor admin / eiendeler / JS / resources.js fil. Spesielt må vi forsikre oss om at navnetattributtet bruker en matrise slik at vi kan få tilgang til det og lytte gjennom det når vi ser på $ _POST data.

Pass på at kodelinjene som er ansvarlige for å opprette selve elementet, ser slik ut:

// Deretter lager du det faktiske inputelementet og returnerer det til den som ringer $ inputElement = $ ('') .attr (' type ',' tekst ') .attr (' navn ',' authors-commentary-resources ['+ iInputCount +'] ') .attr (' id ',' authors-commentary-resource- ' + iInputCount) .attr ('verdi', ');

Legg merke til at nøkkelen til det vi har gjort ligger i linjen som oppdaterer Navn. Spesielt plasserer vi antall inntastinger en indeks av arrayet.

Neste, hopp tilbake til lagre post funksjon og legg til følgende kode (som vi diskuterer etter blokken):

Fordi vi jobber med en rekke innganger, må vi først kontrollere at arrayet ikke er tomt. Hvis det ikke er det, må vi iterere gjennom det fordi vi ikke er sikre på hvor mange innganger vi skal klare.

Ligner på forrige blokk, gjør vi et grunnleggende nivå av sanitisering og rømming. Dette er noe du kan gjøre så aggressivt eller så avslappet som du vil. Vi kommer tilbake til dette betinget i neste innlegg når det er på tide å lagre dataene.

3. Publisert

Denne kategorien ligner på de forrige kategoriene fordi vi arbeider med et ubestemt antall elementer som vi trenger å sanitere. Dette betyr at vi trenger å lage en liten oppdatering til parten som er ansvarlig for å gjengi denne innspillingen.

På oppsiden håndterer vi bare en avkrysningsboks som har en boolsk verdi av å bli sjekket eller ikke (eller spesifikt 'på' eller tom) så det er veldig enkelt å vaske informasjonen.

La oss først oppdatere den delvise. Lokaliser admin / synspunkter / partials / published.php. Deretter finner du linjen som definerer inngang merk av i boksen og endre den slik at den ser slik ut:

Legg merke til at vi har endret Navn Tilordne slik at den bruker en matrise med en indeks som verdi. Deretter hopper vi tilbake til lagre post fungere en gang til for å introdusere validering på dette bestemte elementet:

Akkurat som vi har gjort med de tidligere dataene, kontrollerer vi først for å se om innholdet eksisterer. I så fall sanererer vi det for å forberede det til å lagre. Hvis det ikke gjør det, gjør vi ingenting.

På å lagre

På dette tidspunktet er vi posisjonert for å ta de to siste punktene i serien:

  1. Lagring og gjenoppretting
  2. refactoring

Fra det neste innlegget går vi tilbake til koden vi har skrevet i dette innlegget, for å se hvordan vi kan lagre den i databasen og hente den fra databasen for å vise den på fronten.

Deretter fortsetter vi å refactoring. Tross alt er det en del av skrivbar vedlikeholdsbar kode som sørger for at den er velorganisert og lett forandringsbar. Siden koden vi jobber med på daglig basis, har allerede blitt skrevet og kan bli refactored, vi skal se hvordan du gjør det ved slutten av serien.

I mellomtiden vurdere koden ovenfor, sjekk kilden fra GitHub, og la noen spørsmål og kommentarer i feltet under.