See postitus on mõeldud teile, kes loote kohandatud Gutenbergi plokki ja vajate viisi meediateegist pildi valimiseks või üleslaadimiseks. Enamikku muid väljatüüpe, nagu märkeruudud, tekstisisendid või värvivalijad, on üsna lihtne lisada, kuid meediumi üleslaadija nõuab natuke rohkem koodi. Loome komponendi Inspector, mis vastutab meediateegi avamise nupu renderdamise, pildi valimise ja soovi korral selle hiljem eemaldamise või muutmise eest. Kõik kasutavad standardseid WordPressi komponente.
Enne koodi sukeldumist pidage meeles, et see postitus nõuab teatud Gutenbergi teadmisi kohandatud plokkide kirjutamise kohta. Keskendume ainult meedia üleslaadija osale, mitte sellele, kuidas registreerida ja teha Gutenbergi blokk. Kui te pole kindel, kuidas kohandatud Gutenbergi plokki kirjutada, on mul õpetuste seeria, mis hõlmab täpselt seda:
Kui see on eemal, sukeldume otse sisse!
Mida me teeme
Valitud meediumifunktsioon on funktsionaalselt täpselt sama, mis WordPressi esiletõstetud pildifunktsioon. Lisame inspektorisse paneeli, mis koosneb nupust pildi valimiseks.
Kui klõpsate nupul, avaneb aken "Vali või laadige üles meedium", mis võimaldab teil valida faili meediumiteegist. Meediumiteek on piiratud ainult piltide kuvamisega. Kui pilt on valitud, hüpikaken sulgub ja paneel kuvab faili eelvaate. valitud pildi väike pisipilt. All kuvatakse eelvaate nupud pildi muutmiseks ja eemaldamiseks. Täpselt nagu esiletoodud pildi puhul.
See õpetus eeldab, et kasutate valitud pilti ploki taustana – lihtsalt näitena. Seetõttu salvestame pildi URL-i. Lisan näite, kuidas valitud pilti kasutada (nii funktsioonis edit
kui ka save
funktsioonis). Pildi valimisel kuvatakse pilt meie ploki taustana nii redaktoris kui ka eesmises.
Meediumi ID ja meediumi URL-i salvestame ploki atribuutidesse. Kood kasutab ID-ga valitud meediumi kohta lisateabe pärimiseks paketis withSelect
sisalduvat kõrgema järgu komponenti .wp.data
Samuti "laenan" klassinimesid WordPressi esiletõstetud pildifunktsioonidest, et kõik näeks hea välja ja poleks vaja ise CSS-i kirjutada. See on loomulikult vabatahtlik.
Valitud kandja salvestamine atribuutidesse
See, mida peate oma ploki atribuutidesse salvestama, on pisut teie enda otsustada. Ilmselgelt peame salvestama meediumi ID. Sellest võib piisata, kui te ei pea skriptikoodis kuskil kasutama meedia URL-i. Näiteks kui kasutate ServerSideRender
kohta, kus PHP vastutab ploki väljundi renderdamise eest. Sel juhul saate hõlpsasti meediumi ID-st pildi URL-i hankida, kasutades näiteks [wp_get_attachment_image_src](https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src/)()
. Allolevas näites näitan aga lihtsat näidet pildi kuvamisest meie ploki taustana, seega salvestan atribuudina ka meediumi URL-i. Kasutame URL-i atribuuti nii edit
(tausta lisamiseks redaktoris) kui ka save
(tausta lisamiseks kasutajaliidesesse).
Alustame oma atribuutide määratlemisest. Meediumi ID peaks olema tüübinumber ja vaikimisi 0. See muudab võrdlemise lihtsaks. Ja meediumi URL peaks olema tüüpstring ja vaikimisi tühi string.
attributes: {
mediaId: {
type: 'number',
default: 0
},
mediaUrl: {
type: 'string',
default: ''
}
},
Komponendi loomine
Koodi korrapärasemaks muutmiseks määratleme ploki edit
funktsiooni jaoks eraldi komponendi. Edastame selle komponendi hiljem withSelect
oma komponendi ümber mähkimiseks.
<div>
Komponendi tagastuses renderdame ploki sisu jaoks lihtsa. Eeldan, et näidissisu asendamiseks blokeerite või blokeerite tegeliku sisu. Samuti renderdame InspectorControls
(pakett wp.blockEditor
), et lisada inspektorile jaotis. Praegu lisan tühja PanelBody
sees InspectorControls
. Lisan <div>
sama klassiga, mida kasutab WordPressi esiletõstetud piltide jaotis. See tagab, et meie stiil näeb hea välja. Hiljem täidame selle PanelBody
valitud meediumifunktsiooni koodiga.
Kuid kõigepealt hävitame faili alguses vajaliku komponendi:
const { InspectorControls } = wp.blockEditor;
const { PanelBody } = wp.components;
const { Fragment } = wp.element;
Ülalpool registerBlockType
määratlen lihtsa komponendi nimega BlockEdit
. Kui eelistate selle teisaldada eraldi faili, võite seda teha. See on tavaline ja soovitatav, kuid selle õpetuse jaoks hoian asjad lihtsana ja hoian seda samas failis.
Nüüd tahame selle komponendi oma edit
funktsioonis renderdada. Kuid me tahame selle pakkida withSelect
.
Funktsioonis kasutamine withSelect
_edit
Kui te ei tunne withSelect
, on see kasulik kõrgemat järku komponent, mis võimaldab meil päringuid teha. Selle abil saate näiteks postitusi pärida. Siiski kasutame funktsiooni select('core').getMedia()
meediumi ID päringu tegemiseks. Vastuseks saame objekti kogu meedia teabega. Meediaobjekt, mille me vastuseks saame, esitatakse seejärel meie BlockEdit
komponendi rekvisiidina, mis on kasutusvalmis. Tubli.
Teeme meediumi päringu ainult siis, kui meediumi ID atribuudiks on tegelikult seatud midagi muud kui 0. Meie redigeerimisfunktsioon näeb välja selline:
Päris lõpus, pärast withSelect
järjekorras sulgemist, #3
palume withSelect
oma BlockEdit
komponendi tagastada. Sellega on meie BlockEdit
komponendil nüüd juurdepääs props.media
.
Meediumivaliku renderdamine
Lõpuks tuleb lõbus osa: inspektori osa.
Komponent, millest oleme huvitatud, on MediaUpload
(pakett wp.blockEditor
). Kui olete huvitatud, on Gutenbergi WordPressi Githubi repos selle komponendi kohta dokumentatsiooni. Samuti mähime selle komponendi komponendi sisse nimega MediaUploadCheck
(pakett wp.blockEditor
). See komponent tagab, et praegusel kasutajal on meediateegi kasutamise võimalused, seega on selle kasutamine hea tava.
Komponendil MediaUpload
on vajalik tugi: render
. See komponent töötab nii, et määratleme render
rekvisiidi jaoks funktsiooni, kus renderdame väljundi „meediumi üleslaadija ala" jaoks. Meie puhul renderdame Button
(paketi wp.components
). MediaUploadi renderdusrekvisiidis saame juurdepääsu open
funktsioonile, mida saame kutsuda, et panna WordPress avama Media Library hüpikakna:
Saadaval on veel mõned rekvisiidid MediaUpload
. Selles õpetuses käsitleme selle funktsionaalseks muutmiseks olulisi, kuid saate mängida veel mõnega. Teid võib vähemalt huvitada rekvisiit, allowedTypes
kus saate piirata, milliseid failitüüpe on võimalik teegis valida. Meie puhul määrasime selle lubama ainult pilte.
LisadesMediaUpload
Destruktureerige esmalt uued komponendid;
const { Button } = wp.components;
const { MediaUpload, MediaUploadCheck } = wp.blockEditor;
Lisame MediaUploadCheck
ja MediaUpload
meie div
sisse PanelBody
:
Eespool olev kood destruktureerib open
funktsiooni render
. Teeme lihtsaks, Button
kus selle onClick
atribuut funktsiooni käivitab open
. Lisasin ka samad klassinimed, mis WordPressi esiletõstetud pildifunktsioonidele, tagamaks, et meil pole vaja stiili lisada.
Komponendi sees Button
kontrollime, kas pilt on seatud või mitte (attributes.mediaId
). Kui ei ole, kordame teksti "Vali pilt". Peaksime selle nüüd oma plokki saama.
Kui klõpsate nuppu, peaks ilmuma hüpikaken Media Library. Kujutise valimine aga praegu ei toimi, kuna meil puuduvad küljes olevad rekvisiidid onSelect
ja. Teeme selle nüüd korda. Seadsime valitud meediumi ID-le ja käivitame funktsiooni, mille hiljem oma komponendi sees määratleme.value``MediaUpload``value``onSelect
Määratleme onSelectMedia
funktsiooni meie komponendis.
Meediumivaliku käsitlemine
Märkus: defineerin oma funktsioonid noolefunktsioonidena (onSelectMedia =() => { }
). Noolefunktsioonid on ESNextis üsna uued ja üsna nutikad. Negatiivne külg on see, et noolefunktsioonide kasutamine eeldab selle toe lisamist oma Babeli konfiguratsioonis. Kui te pole seda teinud, soovitan vaadata selle postituse pealkirja "Babeli seadistamine" alt .
Vahetult enne komponendi tagastuslauset defineerin onSelectMedia
funktsiooni. Kõik, mida me peame tegema, on värskendada oma atribuute kasutades setAttributes()
. Parameetrina onSelectMedia
saame meediumiobjekti. Me lihtsalt ammutame meediaobjektist selle, mida vajame. Meie puhul on see meediumi ID ja täissuuruses URL, mis on vastavalt atribuudid id
.url
Proovige seda kohe ja saate nüüd valida pildi meediumiteegist. Valitud meedium salvestatakse ploki atribuutidesse. Kuid Inspektoris pole selle eelvaadet veel näha ja kuna olete pildi valinud, kaob pildi valimise nupp. Paneel on nüüd tühi. Järgmine samm on eelvaate renderdamine iga kord, kui pilt on valitud, samuti valikuvõimaluste pakkumine selle eemaldamiseks või muutmiseks.
Eelvaatepildi renderdamine
Rekvisiidis Button
renderdatava komponendi sees kordame teksti "Vali pilt", kui pilt pole veel määratud MediaUpload
. render
Kuid me peame lisama koodi, kui pilt on siin seatud; eelvaade.
Kena eelvaate renderdamiseks kasutame komponenti ResponsiveWrapper
(pakett wp.components
). Täielikuks ResponsiveWrapper
toimimiseks peame tagama kõrguse ja laiuse rekvisiidid. Vajame ka pisipildi URL-i. Inspektori sees eelvaate kuvamiseks pole mõtet kasutada täielikku URL-i (mis võib olla hiiglaslik). Siit tulebki rekvisiit withSelect
. Komponendi sees renderdame lihtsa <img>
HTML-märgendi.
Kõigepealt destruktureerime vajaliku komponendi:
const { ResponsiveWrapper } = wp.components;
Nagu näete, pääseme juurde rekvisiidile, mille withSelect
komponent meile andis, props.media
. Toome objektilt meediumi pisipildi suuruse laiuse, kõrguse ja URL-i.
Nüüd peaksite saama valitud pildist kena eelvaate!
Kuna renderdame eelvaatepildi sees Button
, käivitab eelvaatepildil klõpsamine funktsiooni, Button
milleks onClick
on meediateegi avamine. Nii saad juba valitud pilti muuta.
Praegu ei saa valitud pilti eemaldada ega lähtestada. Teeme selle korda!
Eemaldamisfunktsiooni lisamine
Peaksime pakkuma vähemalt kasutajale võimalust valitud pilt eemaldada. Praeguse seisuga saate pärast pildi valimist seda ainult muuta, kuid mitte eemaldada.
Teeme seda sama, mida WordPress teeb esiletõstetud pildi puhul: uus Button
eelvaatepildi all (täiesti väljaspool seda MediaUploadCheck
). Pakkudes sellele nutikaid rekvisiite, Button
muudame selle isLink
punase tekstivärviga () lingiks (isDestructive
). Lugege Buttoni dokumentatsiooni, et näha, mis veel on võimalik. Mähkime nupu veel ühe sisse MediaUploadCheck
, et tagada kasutajal õiged võimalused.
Selle sündmuse jaoks Button
käivitame onClick
oma komponendi sees uue funktsiooni: removeMedia()
. Määratleme selle kuskil vahetult enne komponendi tagastusfunktsiooni, nagu tegime onSelectMedia
.
Kõik see funktsioon on meie kahe atribuudi väärtuse lähtestamine.
Nüüd on meil kena ja selge link pildi eemaldamiseks:
Kui klõpsate uuel nupul, kaob valitud pilt ja nupp ise ning uuesti ilmub pildi valimise nupp.
Asendusnupu lisamine
See samm on täiesti vabatahtlik. Nagu varem mainitud, avaneb pildi eelvaatepildil klõpsamine Media Library ja võimaldab pilti muuta. Kuid see ei pruugi kõigile nii intuitiivne olla. WordPress lisab pildi muutmiseks eraldi nupu, et see oleks väga selge. Meie saame sama teha.
Pildi muutmise nupu renderdamiseks kordame põhimõtteliselt koodi, mis meil on pildi valimiseks: teine MediaUpload
komponent. Pakume sama funktsiooni onSelect
nagu allowedFileTypes
varemgi value
. Rekvisiidi sees render
renderdame MediaUpload
lihtsalt teise Button
, mis avab meediumiteegi. Asetame selle nupu enne nuppu Eemalda – kuna see on lõppkasutaja jaoks mõttekam:
Nüüd peaksite saama selle:
Valitud pildi kasutamine
Nüüdseks peaks juba üsna selge olema, kuidas saad valitud pilti kasutada. Meediumi ID ja meediumi URL on salvestatud ploki atribuutidesse. Lihtsa näitena lisan aga koodi, mis seab valitud pildi ploki taustaks. Koodi saab teha täpselt sama nii funktsioonides edit
kui ka save
funktsioonides. Loome lihtsalt stiiliobjekti, mille rakendame ploki ümbrislausele. Stiiliobjektis määrame meediumi URL-i taustapildi.
Ülejäänud kohandatud ploki sisuga võib see hõlpsasti välja näha umbes selline:
Kui rakendate plokistiili mõlemas edit
ja save
, peaks teie plokk saama valitud meediumi taustaks. Nii toimetaja sees kui ka frontendis.
Järeldus
Meediumiteegist pildi (või faili) valimine on funktsioon, mida Gutenbergi arendajana kahtlemata oma plokkide jaoks vajate. Oleme õppinud, kuidas lisada oma kohandatud Gutenbergi plokis funktsiooni meediumiteegist pildi valimiseks. Oleme seda teinud samamoodi nagu WordPress ise teeb seda esiletoodud pildi puhul. (Redigeeri mai 2020: WordPress on nüüd värskendanud kasutamiseks esiletoodud pilti useSelect
, selle asemel Reacti konks). See tagab, et meie kood ei ole "häkkinud" ja tulevaste värskenduste puhul on suur oht, et see puruneb.
Andke mulle teada, kui teil on sellest kasu olnud!
Täielik kood
Allpool on täielik kood kohandatud ploki jaoks, millel on valitud meediumifunktsioon. Ja tegelikult ei midagi muud. See osa on teie otsustada!