WP REST API Internals og Tilpasning

I den forrige delen av serien lærte vi om å lage, oppdatere og slette innhold eksternt gjennom WP REST API. Det gir oss mulighet til å lage plattformuavhengige applikasjoner som fungerer sømløst med en WordPress-powered back-end, som gir en rik opplevelse til brukeren.

I den nåværende delen av serien ser vi på internene til WP REST API og hvordan de jobber sammen for å drive API. Deretter lærer vi å modifisere serverresponser for standard endepunkter for å inkludere egendefinerte felt.

For å være spesifikk, i den nåværende artikkelen, vil vi:

  • lære om de interne klassene og metodene til WP REST API
  • Endre serverresponsen for standard endepunkter
  • lær hvordan du gjør tilpassede felt redigerbare

Så la oss begynne med å se på internene til WP REST API.

Interne klasser og metoder i WP REST API

Klasser i WP REST API kan deles inn i følgende to kategorier:

  1. Infrastruktur klasser: Dette er de grunnleggende klassene som er ansvarlige for å holde sammen API. De utfører ingen datatransformasjon.
  2. Endpoint klasser: Disse klassene er ansvarlige for å utføre CRUD-operasjoner på ressurser som innlegg, sider, brukere, kommentarer, etc..

La oss ta en titt på de enkelte klassene i hver av de to kategoriene ovenfor.

Infrastruktur klasser

De tre infrastrukturklassen som sammen driver REST API er som følger:

  1. WP_REST_Server
  2. WP_REST_Request
  3. WP_REST_Response

WP_REST_Server

Dette er kjerneklassen til WP REST API som implementerer REST-serveren ved å registrere ruter, betjene forespørsler og forberede svar. Den formaterer dataene som skal sendes til klienten, og i tilfelle en feil forbereder den feilen ved å inkludere feilkoden og meldingslegemet. Det sjekker også for godkjenning.

Vi har jobbet ganske mye med / Wp-.json Indeks Endpoint for å sjekke alle mulighetene og støttede ruter for et nettsted. Metoden get_index (), som er ansvarlig for å hente nettstedindeksen, ligger også i denne klassen.

For visning av forespørsler og utarbeidelse av svar, vil WP_REST_Server klassen bruker WP_REST_Request og WP_REST_Response klasser henholdsvis.

WP_REST_Request

De WP_REST_Request klassen implementerer forespørselsobjektet for WP REST API. Den inneholder data fra forespørselen som overskrifter og forespørsler, og sendes til tilbakekallingsfunksjonen av WP_REST_Server klasse. Det kontrollerer også om parametrene som sendes langs forespørselen, er gyldige og utfører dataopprensing når det er nødvendig.

WP_REST_Response

De WP_REST_Response klassen, som navnet antyder, implementerer responsobjektet. Den inneholder nødvendige data som respons status kode og respons kroppen.

La oss nå se på endpoint-klassene.

Endpoint Classes

Endpoint-klassene i WP REST API er ansvarlige for å utføre CRUD-operasjoner. Disse klassene inkluderer WP_REST_Posts_Controller, WP_REST_Taxonomies_ControllerWP_REST_Users_Controller, etc. Alle disse endepunktsklassene utvider en enkelt abstrakt klasse WP_REST_Controller som gir et konsistent mønster for å modifisere data.

De WP_REST_Controller klassen inkluderer metoder som get_item (), create_item (), update_item ()delete_item (), etc., for å utføre CRUD-operasjoner. Disse metodene må overstyres av underklasser ved å implementere sin egen abstraksjon for å hente, opprette, oppdatere og modifisere data.

Du finner mer om disse klassene og deres interne metoder i den offisielle dokumentasjonen.

Etter å ha lært om de interne klassene i WP REST API, kan vi se på hvordan vi kan endre serverresponsene for standard endepunkter for å inkludere egendefinerte felt.

Endre serverresponser

I den forrige delen så vi på de interne klassene og metodene som API-en bygger på. Sammen kjører disse klassene og metodene API-en som helhet og gir en måte for utviklere å utvide API-en for å ta hensyn til forskjellige scenarier og bruk saker.

WP REST API avslører data på en forutsigbar måte. Dette inkluderer ulike ressurser som innlegg, postmeta, sider og brukere, sammen med deres standardegenskaper. Men disse dataene kan ikke alltid svare til behovene til hver enkelt WordPress-side eller bruker. Derfor gir WP REST API en måte å endre dataene som serveren returnerer for hver av standardruter.

De register_rest_field () Metoden gir en måte å legge til eller oppdatere felt i svaret på et objekt. Hvis du endrer et felt fra et svar, blir det imidlertid aldri oppmuntret av API fordi det kan introdusere kompatibilitetsproblemer for klienter som forventer et standardrespons fra serveren. Så, hvis du trenger å endre et felt, bør du vurdere å duplisere feltet med ønsket verdi.

På samme måte er sletting av et standardfelt svært motvirket av grunnen til at en kunde kan forvente det. Hvis du trenger en mindre delmengde av svaret returnert av serveren, bør du opprette flere sammenhenger i tillegg til standardkonteksten som utsikt eller redigere.

Vi kan imidlertid trygt legge til et felt til svaret som returneres av serveren for ett eller flere objekter. Disse feltene kan inneholde en verdi som varierer fra innlegg eller bruker meta til en hvilken som helst annen vilkårlig verdi.

I neste avsnitt vil vi jobbe med register_rest_field () metode for å legge til egendefinerte felt til svaret returnert av serveren for post gjenstand.

Arbeider med register_rest_field () Metode

Som nevnt tidligere, den register_rest_field () Metoden kan brukes til å legge til eller oppdatere felt i svaret returnert av serveren. Denne metoden aksepterer tre argumenter:

  1. $ objekt
  2. $ attributt
  3. $ args

De $ objekt argument kan enten være en streng eller en matrise som inneholder navnene på alle objektene vi vil legge til feltet for. Disse objektene kan være post, begrep, kommentarbruker, etc. Hvis vi trenger å legge til et egendefinert felt til en egendefinert innleggstype, så er $ objekt argumentet ville være navnet på posttypen.

De $ attributt argument er navnet på det egendefinerte feltet. Dette navnet vil vises i serverresponsen som en nøkkel sammen med verdien.

De $ args array er en assosiativ array som kan inneholde følgende tre nøkler:

  1. $ get_callback
  2. $ update_callback
  3. $ skjema

Verdiene av de to første tastene er navnene på metodene som brukes til å få eller oppdatere verdien av det egendefinerte feltet. Den siste $ skjema nøkkel definerer metoden eller variabelen som brukes til å definere skjemaet for det egendefinerte feltet.

Alle de ovennevnte tastene er valgfrie, men hvis de ikke legges til, blir ikke funksjonen lagt til. For eksempel, hvis du definerer $ get_callback nøkkel men ikke den $ update_callback nøkkel, hentes funksjonaliteten til, men oppdateringsfunksjonaliteten vil ikke bli lagt til. Hvis du slipper ut $ get_callback nøkkel, vil ikke feltet bli lagt til svaret i det hele tatt.

De register_rest_field () Metoden virker ved å endre $ wp_rest_additional_fields variabel. Denne arrayvariabelen inneholder registrerte felt etter objekttyper som skal returneres i svaret fra serveren. Når et felt er registrert av register_rest_field () metode, blir det lagt til $ wp_rest_additional_fields variabel. Imidlertid modifiserer $ wp_rest_additional_fields variabel manuelt er sterkt motløs.

Legge til egendefinerte felt til svaret

Å ha kjent oss med register_rest_field () metode, kan vi nå endre svaret for post gjenstand. Et typisk brukstilfelle her vil være tillegg av et forfatternavnefelt, som vanligvis trengs når du legger inn innlegg på en indeksside. Siden standardresponsen ikke inneholder dette feltet, kan vi bruke register_rest_field () metode for å inkludere det i svaret.

Vi begynner med å lage en enkel plugin. Så opprett en ny mappe som heter Resten-respons-modifiser i din / Wp-content / plugins katalogen. Opprett en tom index.php fil og lim inn i følgende plugin-definisjon:

De register_rest_field () Metode skal registreres i rest_api_init handling. Derfor oppretter vi en funksjon som heter bs_add_custom_rest_fields () og bind den til rest_api_init krok:

Merk at åpningen av PHP-koder er ikke påkrevet her, men jeg har tatt med dem slik at syntaksen er uthevet riktig.

Inne i bs_add_custom_rest_fields () funksjon, kan vi bruke register_rest_field () metode for å inkludere et felt for forfatternavn:

funksjon bs_add_custom_rest_fields () // skjema for feltet bs_author_name $ bs_author_name_schema = array ('description' => 'Navn på postforfatteren', 'type' => 'streng', 'context' => array ('view') ); // registrerer feltet bs_author_name register_rest_field ('post', 'bs_author_name', array ('get_callback' => 'bs_get_author_name', 'update_callback' => null, 'schema' => $ bs_author_name_schema)); 

Som nevnt i forrige avsnitt, det første argumentet i register_rest_field () Metode er navnet på objektet som vi modifiserer svaret på. Siden vi må endre svaret for post objekt, vi passerer det samme som det første argumentet.

Det andre argumentet i koden ovenfor er navnet på feltet som vises i svaret. Det er alltid en god praksis å prefikse navnet på et egendefinert felt i svaret for å sikre maksimal fremoverkompatibilitet, og at den ikke blir overstyrt i fremtiden av andre plugins. Derfor passerer vi bs_author_name i det andre argumentet som $ attributt av det egendefinerte feltet.

Det tredje og siste argumentet i koden ovenfor er en matrise for tilbakeringingsmetoder og skjemaet. Denne gruppen inneholder navnet på tilbakeringingsmetodene for henting og oppdatering av det egendefinerte feltet i $ get_callback og $ update_callback nøkler henholdsvis. Vi passerer bs_get_author_name fungere som henting av tilbakeringingsmetode. Vi definerer denne funksjonen kort tid.

For $ update_callback nøkkel, vi passerer null siden dette er et skrivebeskyttet felt, og vi trenger ikke å oppdatere forfatternavnet for et innlegg.

For $ skjema nøkkel, vi sender en oppføring som heter $ bs_author_name_schema. Dette arrayet har forskjellige egenskaper for feltet som datatypen, konteksten og beskrivelsen.

Det eneste vi trenger å definere nå er bs_get_author_name () funksjon som vil fungere som $ get_callback metode for vårt tilpassede felt. Nedenfor er koden for denne funksjonen:

/ ** * Tilbakering for å hente forfatternavn * @param array $ objekt Det nåværende innlegget objektet * @param string $ field_name Navnet på feltet * @param WP_REST_request $ request Den nåværende forespørselen * @return string Navnet på forfatteren * / funksjon bs_get_author_name ($ objekt, $ feltnavn, $ forespørsel) return get_the_author_meta ('display_name', $ object ['author']); 

De $ get_callback Metoden mottar tre argumenter for følgende:

  1. $ objekt: Det nåværende objektet. I vårt tilfelle er det nåværende innlegg.
  2. $ FIELD_NAME: Navnet på det egendefinerte feltet blir lagt til.
  3. $ forespørsel: Forespørselsobjektet.

Vi bruker $ forfatter eiendom av $ objekt argument som inneholder postforfatterens id Og ved å bruke get_the_author_meta () funksjon, henter vi og returnerer visningsnavnet til forfatteren for gjeldende innlegg.

Nå som feltet er registrert, kan vi sende en forespørsel til / WP / v2 / innlegg rute for å se om det fungerer riktig:

Her er svaret i Postman:

Dette nyregistrerte egendefinerte feltet vil også vises i serverresponsen, sammen med skjemaet, når vi sender en ALTERNATIVER forespørsel til / WP / v2 / innlegg rute:

Derfor er et egendefinert felt for forfatternavnegenskapen blitt registrert. Men dette feltet er skrivebeskyttet, da vi ikke kan oppdatere det ved å sende en POST be om. I det følgende avsnittet registrerer vi et redigerbart felt for antall teller.

Registrering av et redigerbart felt

Vi registrerer nå et egendefinert felt for antall teller. Vi vil bare håndtere den faktiske registreringen av feltet med WP REST API, og utelate implementeringen for å øke talltallet.

Nedenfor er koden for bs_post_views tilpasset feltregistrering sammen med sitt skjema:

// skjema for bs_post_views-feltet $ bs_post_views_schema = array ('description' => 'Vis antall ganger', 'type' => 'heltall', 'context' => array ('view', 'edit')); // registrere bs_post_views feltet register_rest_field ('post', 'bs_post_views', array ('get_callback' => 'bs_get_post_views', 'update_callback' => 'bs_update_post_views', 'schema' => $ bs_post_views_schema));

Koden ligner den vi skrev i forrige avsnitt bortsett fra at den nå inneholder en tilbakeringingsmetode bs_update_post_views for $ update_callback nøkkel. Denne funksjonen er ansvarlig for å oppdatere verdien av feltet.

De $ sammenheng eiendom i $ bs_post_views_schema skjema array inneholder to verdier for utsikt og redigere. Inkludering av redigeringsverdien i $ sammenheng argument sikrer at bs_post_views feltet returneres i serverresponsen etter at det har blitt oppdatert.

Henting og oppdatering tilbakeringingsmetoder er som følger:

/ ** * Tilbakering for å hente inn antall postvisninger * @param array $ object Den nåværende postobjektet * @param string $ field_name Navnet på feltet * @param WP_REST_request $ request Den nåværende forespørselen * @return heltall Postvisninger teller * / funksjon bs_get_post_views ($ objekt, $ feltnavn, $ forespørsel) return (int) get_post_meta ($ object ['id'], $ field_name, true);  / ** * Tilbakeringing for å oppdatere postvisningstelling * @param blandet $ verdi Postvisningstelling * @paramobjekt $ objekt Objektet fra svaret * @paramstreng $ field_name Navn på gjeldende felt * @return bool | int * / funksjon bs_update_post_views ($ verdi, $ objekt, $ field_name) hvis (! $ verdi ||! er_numerisk ($ verdi)) return;  returnere update_post_meta ($ object-> ID, $ field_name, (int) $ value); 

Koden er ganske enkel som den bruker get_post_meta () og update_post_meta () metoder for å hente og oppdatere verdiene henholdsvis.

De bs_get_post_views () metoden henter først metaverdien for bs_post_views meta-nøkkel og kaster den inn i et heltall før du returnerer det.

Tilbakekallingsmetoden gikk inn $ update_callback mottar tre argumenter for følgende:

  1. $ verdi: Den nye verdien for feltet.
  2. $ objekt: Nåværende objekt fra svaret.
  3. $ FIELD_NAME: Navnet på feltet blir oppdatert.

bs_update_post_views () metode, vi kontrollerer først om verdien som er bestått ikke er tom og er en numerisk verdi. Hvis ikke, returnerer vi uten å gjøre noe.

Hvis verdien er numerisk, sender vi den til update_post_meta () funksjon som lagrer den til databasen etter type kaste den inn i et gyldig heltall.

Etter å ha registrert feltet vellykket, la oss teste det ved å sende en  be om:

$ GET / wp / v2 / innlegg

Nedenfor er en prøve respons for ovennevnte forespørsel:

Som vi kan se i bildet ovenfor, er dagens verdi av bs_post_views feltet er 0 for et gitt innlegg. Dette skyldes at get_post_meta () Metoden returnerer en tom streng fordi den ikke kunne finne en metaværdi for bs_post_views meta-nøkkel og type-casting en tom streng i et heltall i PHP resulterer i 0.

Vi kan oppdatere bs_post_views feltet ved å sende en POST forespørsel til / WP / v2 / innlegg / endepunkt. JSON-kroppen for forespørselen er som følger:

"bs_post_views": 4050

Hvis forespørselen er vellykket, returnerer serveren a 200 - OK statuskode sammen med det oppdaterte innlegget objektet som også inneholder bs_post_views felt:

De bs_post_views Tilpasset felt er nå oppdatert.

Merk at vi sendte en JSON-kropp sammen med forespørselen om å oppdatere feltet. JSON-kroppen inkluderte feltnavnet-bs_post_views-med et heltall på 4050. Hvis vi prøver å sende en ikke-numerisk verdi, si “abc1234”, Feltet vil ikke bli oppdatert siden vi har en tilstand som kontrollerer en numerisk verdi i bs_update_post_views () tilbakeringingsmetode.

Nedenfor er full kildekoden for plugin:

 'Navn på postforfatteren', 'type' => 'streng', 'kontekst' => array ('visning')); // registrerer feltet bs_author_name register_rest_field ('post', 'bs_author_name', array ('get_callback' => 'bs_get_author_name', 'update_callback' => null, 'schema' => $ bs_author_name_schema)); // skjema for bs_post_views-feltet $ bs_post_views_schema = array ('description' => 'Vis antall ganger', 'type' => 'heltall', 'context' => array ('view', 'edit')); // registrere bs_post_views feltet register_rest_field ('post', 'bs_post_views', array ('get_callback' => 'bs_get_post_views', 'update_callback' => 'bs_update_post_views', 'schema' => $ bs_post_views_schema));  / ** * Tilbakeringing for å hente forfatternavn * @param array $ object Det nåværende innlegget objektet @ @param string $ field_name Feltet navn * @param WP_REST_request $ request Den nåværende forespørselen * @return string Forfatterens navn * / funksjon bs_get_author_name ($ objekt, $ feltnavn, $ forespørsel) return get_the_author_meta ('display_name', $ object ['author']);  / ** * Tilbakering for å hente inn antall postvisninger * @param array $ object Den nåværende postobjektet * @param string $ field_name Feltens navn * @param WP_REST_request $ request Den nåværende forespørselen * @return heltall Postvisninger teller * / funksjon bs_get_post_views ($ objekt, $ feltnavn, $ forespørsel) return (int) get_post_meta ($ object ['id'], $ field_name, true);  / ** * Tilbakeringing for å oppdatere postvisningstelling * @param blandet $ verdi Postvisningstelling * @paramobjekt $ objekt Objektet fra svaret * @paramstreng $ field_name Navn på gjeldende felt * @return bool | int * / funksjon bs_update_post_views ($ verdi, $ objekt, $ field_name) hvis (! $ verdi ||! er_numerisk ($ verdi)) return;  returnere update_post_meta ($ object-> ID, $ field_name, (int) $ value); 

Det er alt for å modifisere serverresponser for standard API-endepunkter. Vi har knapt riper overflaten for å modifisere REST API fordi det gir mye mer fleksibilitet enn bare å endre serverresponser. Dette inkluderer å legge til støtte for den egendefinerte innholdstypen via egendefinerte kontroller og navneområder, og registrere tilpassede ruter for å eksponere og modifisere data. Vi vil forsøke å dekke disse avanserte emnene i fremtidige artikler.

Bare begynnelsen…

Her konkluderer vi vår reise med å introdusere oss til WP REST API. I denne serien har vi dekket ganske grunnleggende begreper som autentiseringsmetoder og henting, oppretting og oppdatering av data. I denne siste delen av serien så vi kort på de interne klassene i WP REST API og lærte da å modifisere serverresponser for standard endepunkter.

Det var aldri hensikten med denne serien å dekke alle aspekter av WP REST API-programmet, faktisk, det kan aldri oppnås i en enkelt serie. Men snarere var formålet med denne serien å få deg i gang med dette nye fantastiske tillegget og oppfordre deg til å leke og eksperimentere på egen hånd. Jeg håper at du har funnet denne serien å oppfylle sitt ultimate mål.