Så här lägger du till anpassade fält till bilagor

Du borde vara bekant med anpassade fält i WordPress. Vi använder dem på ett inlägg eller en sida för att lägga till extra data. I WordPress sparas bilagor också som inlägg, så anpassade fält är tillgängliga för dem också.

Idag ser vi hur vi kan lägga till några anpassade fält så att bilagor kan ha mer information än bara standarddata.


Vad vi ska göra

Först och främst kommer vi att skapa ett plugin för att hantera de anpassade fälten för bilagor. Det kommer att få en uppsättning alternativ, baka dem så att de blir en del av formuläret när vi redigerar en bilaga och lagrar dem i databasen.

För detta kommer vi att använda två WordPress krokar:

  • attachment_fields_to_edit att hantera redigeringsformuläret
  • attachment_fields_to_save för att spara de anpassade fälten

1. Skapa plugin

Jag kommer att skicka snabbt på den här delen eftersom det inte är huvudsyftet med denna handledning.

Skapa en ny mapp i plugin-katalogen (wp-content / plugins / media-fält / till exempel) och sätta en fil (namngiven plugin.php) inuti. Låt oss också sätta en fil som heter custom_media_fields.php som kommer att hålla våra alternativ.

Detta är vad din plugin.php filen ska se ut först:

 / * Plugin Name: Wptuts + Anpassade Mediafält Plugin URI: Beskrivning: Skapa bifogade anpassade fält Version: 0.1 Författare: Guillaume Voisin Författare URI: http://wp.tutsplus.com/author/guillaumevoisin Licens: GPL2 * / require_once (plugin_dir_path __FILE__). '/Custom_media_fields.php'); Klass Wptuts_Custom_Media_Fields private $ media_fields = array (); funktion __construct ($ fields)  allmän funktion applyFilter ($ form_fields, $ post = null)  funktion saveFields ($ post, $ attachment)  $ cmf = nya Wptuts_Custom_Media_Fields ($ attchments_options);

Detta är basen som vi kommer att fylla i följande avsnitt. För nu, låt oss definiera vår uppsättning alternativ.


2. Definiera våra alternativ

I den andra filen, låt oss lägga till några alternativ för att förbättra bilagans redigeringsformulär. Vi kommer att överväga, för denna handledning, alternativ att förbättra bilder. Till exempel lägger vi till upphovsrätts-, författarbeskrivningar, vattenstämpel, betygsättning och bildfält.

 $ themename = "twentytwelve"; $ attchments_options = array ('image_copyright' => array ('label' => __ ('Bild upphovsrätt', $ themename), 'input' => 'text', 'helps' => __ ('Om din bild är skyddad av upphovsrätten ', $ themename),' application '=>' image ',' exclusions '=> array (' ljud ',' video '),' required '=> true,' error_text '=> __ krävs ', $ themename)),' image_author_desc '=> array (' label '=> __ (' Bildförfattningsbeskrivning ', $ themename),' input '=>' textarea ',' application '=>' image ' 'exclusions' => array ('ljud', 'video'),), 'image_watermark' => array ('label' => __ ('bild vattenstämpel', $ themename), 'input' => 'checkbox' 'image'stars' => array ('label' => __ ('Image rating', $ themename), ' input '=>' radio ',' options '=> array (' 0 '=> 0,' 1 '=> 1,' 2 '=> 2,' 3 '=> 3,' 4 '=> 4) , 'application' => 'bild', 'uteslutningar' => array ('ljud', 'video')), 'image_disposition' => array ('label' => __ spelling ', $ themename),' input '=>' välj ',' options '=> array (' portrait '=> __ (' portrtait ', $ themename),' landscape '=> __ themename)), 'application' => 'image', 'exclusions' => array ('ljud', 'video')));

Det är i grunden en associativ grupp som innehåller dessa parametrar:

  • märka - Fältnamnet som kommer att visas
  • inmatning - ingångstypen (tex text, välj, radio, ...)
  • hjälper - information som hjälper användaren att fylla i fältet
  • Ansökan - vilken tilläggsmime-typ som ska tillämpas
  • uteslutningar - vilken bekräftelse mime typ att utesluta
  • nödvändig - är fältet nödvändigt? (standard falsk)
  • ERROR_TEXT - valfritt fält för att beskriva felet (om det behövs är inställt på Sann)
  • alternativ - valfritt fält för radio och valda typer
  • show_in_modal - om fältet ska visas i modal eller ej (standard Sann)
  • show_in_edit - huruvida fältet ska visas i klassiskt redigeringsvy eller inte (standard Sann)
  • extra_rows - ytterligare rader för att visa innehåll (inom samma "tr"taggen)
  • tr - ytterligare rader ("tr"taggen)

De högljudda alternativen representerar alternativ som vi manuellt kommer att hantera medan andra är standard som WordPress kommer att behandla automatiskt.

När vi hanterar bilder ställer vi in Ansökan parameter till "bild". Det kommer faktiskt att gälla alla typer av bilder vars mime-typ börjar med"bild" som image / jpeg, image / png och så vidare. Du kan utesluta gif mime-typen genom att ställa in den i exkluderingsfältet till exempel.

Nu är våra alternativ inställda, låt oss gräva in i krokarna.


3. Krokarna

Som nämnts tidigare behandlar vi två krokar.

Vi binder våra två funktioner till de krokarna i konstruktormetoden.

 funktion __construct ($ fält) $ this-> media_fields = $ fält; add_filter ('attachment_fields_to_edit', array ($ this, 'applyFilter'), 11, 2); add_filter ('attachment_fields_to_save', array ($ this, 'saveFields'), 11, 2); 

Låt oss nu se dessa krokar i detalj.

attachment_fields_to_edit

Den har två parametrar:

  1. $ form_fields - En uppsättning fält som finns i bilagans redigeringsformulär
  2. $ post - Objekt som representerar själva bilagan

Vi kommer att använda $ form_fields parameter för att slå samman våra egna fält och kontrollera var och en av dem mot bifogningskrav (t.ex. mime-typ).

 public function applyFilter ($ form_fields, $ post = null) // Om vårt fält array inte är tomt om (! tomt ($ this-> media_fields)) // Vi tittar på vår uppsättning alternativ föreach ($ this-> media_fields som $ field => $ värden) // Om fältet matchar den aktuella bilagans mime-typ // och inte är en av uteslutningarna om (preg_match ("/". $ values ​​['application']. "/", $ post-> post_mime_type) &&! in_array ($ post-> post_mime_type, $ values ​​['exclusions'])) // Vi får det redan sparade fältmeta-värdet $ meta = get_post_meta ($ post-> ID, '_'. $ fält, sant); // Definiera ingångstypen till "text" som standard $ värden ['input'] = 'text'; // Och ställ det till fältet innan du bygger det $ values ​​['value'] = $ meta; // Vi lägger till vårt fält i $ form_fields array $ form_fields [$ field] = $ värden;  // Vi returnerar de färdiga $ form_fields array return $ form_fields; 

I det här steget borde du ha ditt redigeringsformulär för bilagan förbättrad med de nya fälten vi har lagt till. Men de kommer att se ut som textingångar. Vi måste nu överväga olika typer av ingångar (radio, kryssruta, etc ...).

Så låt oss redigera vår funktion för att hantera detta. Ersätt $ värden ['input'] = 'text'; med följande kod:

 växla ($ värden ['input']) standard: case 'text': $ values ​​['input'] = 'text'; ha sönder; case 'textarea': $ values ​​['input'] = 'textarea'; ha sönder; case 'select': // Välj typ existerar inte, så vi kommer att skapa html manuellt // För detta måste vi ange inmatningstypen till 'html' $ values ​​['input'] = 'html'; // Skapa väljelementet med rätt namn (matchar det som wordpress skapar för egna fält) $ html = ''; // Ange html-innehållet $ värden ['html'] = $ html; ha sönder; fallet "kryssrutan": // Typ av kryssrutan finns inte heller $ värden ['input'] = 'html'; // Ange kryssrutan markerad eller inte om ($ meta == 'på') $ checked = 'checked = "checked"'; annars $ checked = "; $ html = ' $ v) om ($ meta == $ k) $ checked = 'checked = "checked"'; annars $ checked = "; $ html. = ' 
'; $ I ++; $ värden ['html'] = $ html; ha sönder;

Nu kan vi bygga vanliga HTML-element. Låt oss kolla in vårt bifogade redigeringsformulär. Det borde se ut så här:


Byt redigeringsformulär med anpassade fält

De anpassade fälten, beroende på om du ställer in sina modala alternativ till sant eller inte, kommer också att visas i medieformen när du redigerar ett inlägg.

Anpassade fält i modal

Nu visas våra fält i vår bilaga redigeringsform, vi måste spara dem i databasen. För detta ska vi använda den andra kroken.

attachment_fields_to_save

Denna krok har också två parametrar:

  1. $ post - array vilket representerar den bifogade enheten
  2. $ fäste - innehåller alla fält bifogade bilagan

Nu, låt oss fylla funktionen saveFields vi lämnade i föregående avsnitt.

 funktion saveFields ($ post, $ attachment) // Om vårt fält array inte är tomt om (! tomt ($ this-> media_fields)) // Browser dessa fält föreach ($ this-> media_fields som $ field => $ värden) // Om det här fältet har skickats in (finns i variabeln $ attachment) om (isset ($ attachment [$ field]) // Om inmatat fält är tomt // Vi lägger till fel i postobjektet med parametern "error_text" vi ställer in i alternativen om (strlen (trim ($ attachment [$ field]) == 0) $ post ['fel'] [$ fält] ['errors'] [] = __ värden ['error_text']); // Annars uppdaterar vi det anpassade fältet other update_post_meta ($ post ['ID'], '_'. $ Fält, $ attachment [$ field]);  // Annars raderar vi den om den redan existerade delete_post_meta ($ post ['ID'], $ field);  returnera $ post; 

Ok, nu sparas våra anpassade fält i databasen och kommer att vara tillgängliga för fronten.

  • Var försiktig när du manipulerar postparametern i båda krokarna. Det är en objekt i den första och en array i den andra.
  • Tips: update_post_meta kommer att skapa meta om den inte existerar.
  • Tips: Vi prefixar den anpassade fältnyckeln med ett understreck "_"så att de inte kommer att listas i metaboxerna på anpassade fält på postredigeringssidor.

Fel överväganden

Från version 3.5 verkar det som om fel fortfarande inte visas på bilagningsredigeringsformulär. Jag försökte undersöka kärnkoden, och trots att den borde ha blivit fixad (http://core.trac.wordpress.org/ticket/13810) verkar det inte.

För ajax spara processen är det säkert att det inte är gjort ännu som nämnts i ajax-actions.php fil:

 $ errors = $ post ['errors']; // @Todo returnera mig och visa mig!

Så just nu kommer fel inte att fungera ordentligt, men koden är klar så att när de buggar fixas, kommer det att fungera.


Främre änden

Om du vill använda de anpassade fälten i dina mallar behöver du bara hämta postmetas på samma sätt som du skulle för regelbundna inlägg. Glöm inte att lägga till "_"prefix till de anpassade fälten" -tangenterna.

Du kan till exempel göra så här:

 eko "
    "echo"
  • upphovsrätt: ". get_post_meta (get_the_ID (), '_image_copyright', true)."
  • "echo"
  • Betyg: ". get_post_meta (get_the_ID (), '_image_stars', true)."
  • "echo"
  • Författarbeskrivning: ". get_post_meta (get_the_ID (), '_image_author_desc', true)."
  • "echo"
  • Bild disposition: ". get_post_meta (get_the_ID (), '_image_disposition', true)."
  • "echo"
  • Watermark? ". (get_post_meta (get_the_ID (), '_image_watermark', true) ==" on "?" ja ":" nej ")."
  • "echo"
";
Visa anpassade fält på fronten

Gå längre

Det finns flera förbättringspunkter beroende på dina behov:

  • Du kan få dina inställningar i databasen så att det blir mer flexibelt att lägga till, redigera och ta bort dem
  • Du kan ha ett standardvärde som är inställt för alla nya bilagor när ett värde inte är inställt
  • Du borde ställa in någon stil för modalformen så att den visar de anpassade fälten ordentligt

Slutsats

Tveka inte med att dela med dig av dina idéer om hur du förbättrar det här pluginet och vad du kan förvänta dig av sådan funktionalitet.