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:
Så la oss begynne med å se på internene til WP REST API.
Klasser i WP REST API kan deles inn i følgende to kategorier:
La oss ta en titt på de enkelte klassene i hver av de to kategoriene ovenfor.
De tre infrastrukturklassen som sammen driver REST API er som følger:
WP_REST_Server
WP_REST_Request
WP_REST_Response
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.
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.
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-klassene i WP REST API er ansvarlige for å utføre CRUD-operasjoner. Disse klassene inkluderer WP_REST_Posts_Controller
, WP_REST_Taxonomies_Controller
, WP_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.
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.
register_rest_field ()
MetodeSom 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:
$ objekt
$ attributt
$ 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
, kommentar
, bruker
, 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:
$ get_callback
$ update_callback
$ 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.
Å 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 irest_api_init
handling. Derfor oppretter vi en funksjon som heterbs_add_custom_rest_fields ()
og bind den tilrest_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 brukeregister_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 forpost
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 passererbs_get_author_name
fungere som henting av tilbakeringingsmetode. Vi definerer denne funksjonen kort tid.For
$ update_callback
nøkkel, vi passerernull
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:
$ objekt
: Det nåværende objektet. I vårt tilfelle er det nåværende innlegg.$ FIELD_NAME
: Navnet på det egendefinerte feltet blir lagt til.$ forespørsel
: Forespørselsobjektet.Vi bruker
$ forfatter
eiendom av$ objekt
argument som inneholder postforfatterens id Og ved å brukeget_the_author_meta ()
funksjon, henter vi og returnerer visningsnavnet til forfatteren for gjeldende innlegg.Nå som feltet er registrert, kan vi sende en
FÅ
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 forutsikt
ogredigere
. Inkludering av redigeringsverdien i$ sammenheng
argument sikrer atbs_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 ()
ogupdate_post_meta ()
metoder for å hente og oppdatere verdiene henholdsvis.De
bs_get_post_views ()
metoden henter først metaverdien forbs_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:
$ verdi
: Den nye verdien for feltet.$ objekt
: Nåværende objekt fra svaret.$ FIELD_NAME
: Navnet på feltet blir oppdatert.I
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
FÅ
be om:$ GET / wp / v2 / innleggNedenfor 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 atget_post_meta ()
Metoden returnerer en tom streng fordi den ikke kunne finne en metaværdi forbs_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 enPOST
forespørsel til/ WP / v2 / innlegg /
endepunkt. JSON-kroppen for forespørselen er som følger:"bs_post_views": 4050Hvis 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 ibs_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.