Opprette egendefinerte felt for vedlegg i Wordpress

Egendefinerte felt i Wordpress gjør det enkelt å tilpasse temaet ditt på en rekke måter; pluss, de er enkle å implementere for innlegg og sider. Vedlegg, derimot, tar litt mer arbeid å implementere, og krever at du leser og deklarer kjernekode for å få dem til å fungere. Vi går gjennom bruk av et par uokumenterte Wordpress-kroker i denne opplæringen for å gjøre denne prosessen mye lettere.


Forord: Om krokene

Begge disse krokene har eksistert siden Wordpress 2.5, og brukes i wp-admin / includes / media.php, men forblir underutnyttet i samfunnet mest sannsynlig fordi de er utokumenterte i Codex. Nedenfor er hvor krokene brukes i kjernekoden, og lar oss få vite hva som skal sendes til de funksjonene vi legger til hver krok.

attachment_fields_to_edit

 funksjon get_attachment_fields_to_edit ($ post, $ errors = null) // ... $ form_fields = apply_filters ("attachment_fields_to_edit", $ form_fields, $ post); // ...
  • $ form_fields er et spesielt utvalg som vil bli beskrevet i detalj i et øyeblikk.
  • $ post er vedlegget som en gjenstand (vedlegg behandles som postobjekter i Wordpress).

attachment_fields_to_save

 funksjon media_upload_form_handler () // ... $ post = apply_filters ("attachment_fields_to_save", $ post, $ vedlegg); // ...
  • $ post er vedlegget som en matrise (vedlegg behandles som postobjekter i Wordpress).
  • $ vedlegg er vedleggsdelen av skjemaet $ _POST som vil inkludere feltoppsett gjennom attachment_fields_to_edit krok.

Merk: Vær forsiktig i koden din, som $ post Sendes til en funksjon som en gjenstand og til den andre som en matrise.

Egendefinerte feltnavnstips

De nye feltene som legges til, blir lagret som post-meta, akkurat som de egendefinerte feltene på skjermbildet for innlegg / side. Felt prefiks med underskrift (_my_custom_field) vil ikke bli oppført i nedtrekk av tilgjengelige egendefinerte felt på post / side skjermen; alle andre eksisterende postmetafelt vil bli oppført. Vi kan bruke denne kunnskapen til å skjule feltene vi legger til medieformularen, siden de ikke er relevante for innlegg / sider.

Det er en lignende regel å huske når du velger $ form_fields matrise-nøkkel for bruk for det nye feltet. Her, hvis du bruker en understreking ($ form_fields [ '_ my_custom_field']) feltet ditt vil bli hoppet over og vil ikke bli lagt til skjemaet.

For å kunne vise feltene i medieformen, men ikke liste dem i siden / legge inn egendefinerte felt, må vi kombinere begge metodene. Dette vil omfatte både redigerings- og lagringsfunksjonene vi skal skape. For 'attachment_fields_to_edit'krok vi setter $ form_fields tastene opp til ikke å ha understreket prefiks, og for 'attachment_fields_to_save'krok vi prefixer feltene våre med en understreking før du lagrer dem som postmeta. Dette er en løsning som er verdt å gjøre for ikke å slamle brukerens grensesnitt med unødvendig info.


Hook 1: attachment_fields_to_edit

Nedenfor er et eksempel på hvordan du legger til dine egne tilpassede felt i vedleggsskjemaet.

 / ** * Legge til våre egendefinerte felt til $ form_fields array * * @param array $ form_fields * @param object $ post * @return array * / funksjon my_image_attachment_fields_to_edit ($ form_fields, $ post) // $ form_fields er et spesielt utvalg av felt som skal inkluderes i vedlegget // $ post er vedlegget i databasen // $ post-> post_type == 'vedlegg' // (vedleggene behandles som innlegg i Wordpress) // legg til vårt egendefinerte felt til $ form_fields array // input type = "text" navn / id = "vedlegg [$ vedlegg-> ID] [custom1]" $ form_fields ["custom1"] = array ("label" => __ ("Custom Text Field" ), "input" => "tekst", // dette er standard hvis "input" er utelatt "value" => get_post_meta ($ post-> ID, "_custom1", true)); // hvis du vil legge til feilmeldinger for ditt felt, // så for ikke å overskrive dem, slik de er forhåndsbestemt // til dette arrayet, må du sette feltet opp slik: $ form_fields [" custom1 "] [" label "] = __ (" Egendefinert tekstfelt "); $ form_fields ["custom1"] ["input"] = "text"; $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true); returner $ form_fields;  // fester vår funksjon til riktig krok add_filter ("attachment_fields_to_edit", "my_image_attachment_fields_to_edit", null, 2);

De $ form_fields array har flere alternativer for å inkludere ulike typer innganger og tilpasset innhold. Jeg har samlet de forskjellige metodene nedenfor med notater og skjermbilder av hvordan de gjengis i skjemaet.

Tekstinngang

 // input type = "text" $ form_fields ["custom1"] ["label"] = __ ("Egendefinert tekstfelt"); $ form_fields ["custom1"] ["input"] = "text"; // dette er standard hvis "input" utelates $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true);

Gjengis i skjemaet som:

textarea

 // textarea $ form_fields ["custom2"] ["label"] = __ ("Custom Textarea"); $ form_fields ["custom2"] ["input"] = "textarea"; $ form_fields ["custom2"] ["value"] = get_post_meta ($ post-> ID, "_custom2", true);

Gjengis i skjemaet som:

Skjult felt

Skjulte felt er samlet sammen og utdata på slutten av skjemaet.

 // input type = "hidden" // ikke behov for en etikett $ form_fields ["custom3"] ["input"] = "hidden"; $ form_fields ["custom3"] ["value"] = get_post_meta ($ post-> ID, "_custom3", true);

Andre felttyper

Hvis du trenger en annen inntasting enn 'tekst', 'textarea' eller 'skjult', bruk deretter 'html' som lar deg passere ditt eget tilpassede innhold for å bruke for innspillingselementet du ønsker. Når du oppretter din egen inntasting html, er det viktig å sette «navn» attributtet på elementet riktig, for at feltet skal sendes til lagringsfunksjonen senere. Du vil ha noe slikt: navn = "vedlegg [$ post-> ID] [my_custom_key]" .

 $ form_fields ["custom4"] ["label"] = __ ("Custom Select"); $ form_fields ["custom4"] ["input"] = "html"; $ form_fields ["custom4"] ["html"] = " "; // et annet eksempel $ form_fields [" custom5 "] [" label "] = __ (" Custom Checkbox "); $ form_fields [" custom5 "] [" input "] =" html "; $ form_fields [" custom5 " ] ["html"] = "HTML-utgangen går her, som en avkrysningsboks: ";

Gjengis i skjemaet som:

Spesielle egenskaper

Det er flere spesielle attributter du kan legge til i egendefinerte felt for å forbedre dem.

hjelper - Dette attributtet legger til en hjelpestreng i ditt egendefinerte felt.

 $ form_fields ["custom6"] ["label"] = __ ("Tilpasset felt med nyttig tekst"); $ form_fields ["custom6"] ["value"] = get_post_meta ($ post-> ID, "_custom6", true); $ form_fields ["custom6"] ["helps"] = "Sett nyttig tekst her.";

Dette gjøres i form som:

nødvendig - Denne attributtet vil markere feltet etter behov men det er bare en visuell referanse. Vi må skrive kode senere i lagringsfunksjonen for å håndheve den.

 $ form_fields ["custom7"] ["label"] = __ ("Obligatorisk felt"); $ form_fields ["custom7"] ["value"] = get_post_meta ($ post-> ID, "_custom7", true); $ form_fields ["custom7"] ["required"] = TRUE; // standard er FALSK

Gjengis i skjemaet som:

extra_rows - Dette attributtet lar deg legge til en rekke rader rett etter det tilpassede feltet. Markeringen for hvert array element er vist nedenfor: array-nøkkelen vil bli klassen av td, og verdien er innholdet:

 // ekstra_rows markup: //  //  //  ArrayItemValue //  $ form_fields ["custom8"] ["label"] = __ ("Tilpasset felt med ekstra rader"); $ form_fields ["custom8"] ["value"] = get_post_meta ($ post-> ID, "_custom8", true); // extra_rows må være en assosiativ array $ cssClass => $ content $ form_fields ["custom8"] ["extra_rows"] = array ("cssClass1" => "Hvis du trenger noen rader etter ditt felt ...", "cssClass2" => "... for å forklare noe eller legge til noen bilder?   ",);

Gjengis i skjemaet som:

tr - Samtidig som extra_rows Bare lar deg legge til tabellceller direkte under inntastingselementet til egendefinert felt, dette attributtet lar deg lage hele rader.

Tabellen vi legger til en rad til, har to kolonner, så hold det i bakhodet når du bruker denne metoden. Og det gjør det ikke ha å være et skjemafelt, kan du bare legge til en rad som forklarer de neste feltene, legger til alle feltene manuelt, eller noe helt annet.

 $ form_fields ["custom8"] ["tr"] = "   Kan gjøre hva du vil, stil det, legg til noen felt, vis en tabell med data ... himmelen er grensen  ";

Gjengis i skjemaet som:


Hook 2: attachment_fields_to_save

Lagre egendefinerte felt er en mye enklere prosess enn å legge dem til skjemaet; bare sjekk om feltet er angitt og oppdater dets verdi som postmeta. Husk å prefiks ditt felt med et understreke når du lagrer for å skjule det på skjermbildet for innlegg / side.

 / ** * @param array $ post * @param array $ vedlegg * @return array * / funksjon my_image_attachment_fields_to_save ($ post, $ attachment) // $ vedlegg del av skjemaet $ _POST ($ _POST [vedlegg] [postID] ) // $ postvedlegg wp post array - vil bli lagret etter retur // $ post ['post_type'] == 'vedlegg' hvis (isset ($ vedlegg ['my_field'])) // update_post_meta (postID, meta_key , meta_value); update_post_meta ($ post ['ID'], '_my_field', $ vedlegg ['my_field']);  returner $ post; 

Du kan også legge til feil her som automatisk vil bli vist under ditt felt i skjemaet. De $ Poste [ 'feil'] array blir fusjonert med $ form_fields array før du sendes gjennom attachment_fields_to_edit krok.

 / ** * @param array $ post * @param array $ vedlegg * @return array * / funksjon my_image_attachment_fields_to_save ($ post, $ vedlegg) if (isset ($ attachment ['my_field'])) hvis vedlegg ['my_field']) == ") // legger til vår egendefinerte feil $ post ['feil'] ['my_field'] ['feil'] [] = __ ('Feiltekst her.';; else update_post_meta ($ post ['ID'], 'my_field', $ attachment ['my_field']); returnere $ post;

Merknad om egendefinerte feil: Det er et par lange stående bugs i Wordpress (som av versjon 3.0-RC3) som har å gjøre med visning av tilpassede feil.

  1. En vil forhindre at dine egendefinerte feilmeldinger vises på siden for enkeltmediaendring.
  2. Den andre feilen er i den modale popupen for medieelementer som brukes på skjermbildet for innlegg / side. Feilene vises
    her er det bare problemet med å begynne med ser dem. Etter lagring blir du automatisk byttet til
    'Galleri' -fanen der det er en minimert liste over medieobjekter. Hvis du klikker på "show" for å åpne det nye elementet,
    Du får se feilmeldingene dine i skjemaet. Problemet er at hvis det er feil, er dette elementet form ment til
    være åpen som standard. Det er en feil i css hvor klassen "startopen" (som er tilstede på varen hvis
    det er feil å vise) har verdien av 'display: none' noen steder i kjerne stilark.

Jeg har sendt inn oppdateringer for begge disse problemene (# 13810 & # 13838), og har blitt fortalt at de skulle bli vurdert og inkludert i versjon 3.1. Så for nå, ikke stole på feilmeldingene dine for mye, bare vær glad du vet hvordan du skal jobbe med dem når de blir mer nyttige i nær fremtid.


Andre ideer

Du vil kanskje inkludere noen av feltene dine på bare lydvedlegg, eller bare bilder knyttet til forsiden. For å tilpasse vedleggsskjemaene dine, kan du bare pakke inn dine spesifikke felt i skillesetninger for både redigerings- og lagringsfunksjonene.

 // for lydfiler hvis (substr ($ post-> post_mime_type, 0, 5) == 'lyd') // legg til dine egendefinerte felt for lydfiler // ELLER for bilder på en bestemt side $ page_id = 5; // angi id til hvilken side du vil bruke disse på hvis ($ post-> post_parent == $ page_id && substr ($ post-> post_mime_type, 0, 5) == 'bilde') // legg til bildespesifikke egendefinerte felt for denne siden

Hvis du tenker på noen smarte måter å bruke egendefinerte felt med vedlegg, kan du dele den med oss ​​i kommentarene!