Aangepaste velden voor bijlagen maken in Wordpress

Aangepaste velden in Wordpress maken het gemakkelijk om uw thema op verschillende manieren aan te passen; plus, ze zijn eenvoudig te implementeren voor berichten en pagina's. Bijlagen, aan de andere kant, nemen een beetje meer werk om te implementeren, waardoor je kerncode van de kern moet doorlezen en ontcijferen om ze te laten werken. In deze tutorial lopen we het gebruik van een paar ongedocumenteerde Wordpress-hooks om dit proces een stuk eenvoudiger te maken.


Voorwoord: Over The Hooks

Beide hooks bestaan ​​al sinds Wordpress 2.5 en worden toegepast in wp-admin / includes / media.php, maar blijven onderbenut in de community hoogstwaarschijnlijk omdat ze niet gedocumenteerd zijn in de Codex. Hieronder is waar de haken worden toegepast in de kerncode, en laat ons weten wat er zal worden doorgegeven aan de functies die we aan elke haak toevoegen.

attachment_fields_to_edit

 function get_attachment_fields_to_edit ($ post, $ errors = null) // ... $ form_fields = apply_filters ("attachment_fields_to_edit", $ form_fields, $ post); // ...
  • $ form_fields is een speciale array die in een moment in detail wordt beschreven.
  • $ bericht is de bijlage als een voorwerp (bijlagen worden behandeld als post-objecten in WordPress).

attachment_fields_to_save

 function media_upload_form_handler () // ... $ post = apply_filters ("attachment_fields_to_save", $ post, $ bijlage); // ...
  • $ bericht is de bijlage als een rangschikking (bijlagen worden behandeld als post-objecten in WordPress).
  • $ attachment is het bijlageonderdeel van het formulier $ _POST die de velden bevat die zijn ingesteld via de attachment_fields_to_edit haak.

Notitie: Wees voorzichtig in je code, zoals $ bericht wordt naar één functie verzonden als een voorwerp en aan de ander als een rangschikking.

Aangepaste namen voor het benoemen van velden

De nieuwe velden die worden toegevoegd, worden opgeslagen als meta-meta, net als het gedeelte met aangepaste velden van het bewerkingsscherm voor berichten / pagina's. Velden voorafgegaan door een onderstrepingsteken (_my_custom_field) zal niet worden vermeld in de vervolgkeuzelijst van beschikbare aangepaste velden op het bericht / pagina scherm; alle andere bestaande berichtmeta-velden worden weergegeven. We kunnen deze kennis gebruiken om de velden te verbergen die we aan het mediabestand toevoegen, omdat deze niet relevant zijn voor berichten / pagina's.

Er is een soortgelijke regel om in gedachten te houden bij het kiezen van de $ form_fields matrixsleutel om te gebruiken voor uw nieuwe veld. Hier, als u een onderstrepingsteken gebruikt ($ Form_fields [ '_ my_custom_field']) uw veld zal worden overgeslagen en zal niet worden toegevoegd aan het formulier.

Dus om onze velden in het mediabestand te tonen, maar ook om ze niet in de vervolgkeuzelijst Aangepaste pagina's / berichten te vermelden, moeten we beide methoden combineren. Dit zal zowel de bewerkings- als opslagfuncties beïnvloeden die we zullen maken. Voor de 'attachment_fields_to_edit'Hook we zullen de $ form_fields sleutels om geen voorvoegsels voor onderstrepingstekens te hebben en voor de 'attachment_fields_to_save'hook we prefixen onze velden met een onderstrepingsteken voordat ze als post-meta worden opgeslagen. Dit is een oplossing die het waard is om te doen om de interface van onze gebruikers niet te vervuilen met onnodige informatie.


Hook 1: attachment_fields_to_edit

Hieronder ziet u een voorbeeld van hoe u uw eigen aangepaste velden aan het bijlageformulier kunt toevoegen.

 / ** * Toevoegen van onze aangepaste velden aan de array $ form_fields * * @param array $ form_fields * @param-object $ post * @return array * / function my_image_attachment_fields_to_edit ($ form_fields, $ post) // $ form_fields is een speciale array van de velden die moeten worden opgenomen in het bijlageformulier // $ post is de bijlage record in de database // $ post-> post_type == 'bijlage' // (bijlagen worden behandeld als berichten in WordPress) // voeg ons aangepast veld toe aan de $ form_fields array // input type = "text" name / id = "attachments [$ attachment-> ID] [custom1]" $ form_fields ["custom1"] = array ("label" => __ ("Aangepast tekstveld" ), "invoer" => "tekst", // dit is standaard als "invoer" wordt weggelaten "waarde" => get_post_meta ($ post-> ID, "_custom1", true)); // als u foutberichten voor uw veld toevoegt, // dan om ze niet te overschrijven, omdat ze vooraf aan // zijn toegevoegd, moet u het veld als volgt instellen: $ form_fields [" custom1 "] [" label "] = __ (" Aangepast tekstveld "); $ form_fields ["custom1"] ["input"] = "tekst"; $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true); return $ form_fields;  // voeg onze functie toe aan de juiste haak add_filter ("attachment_fields_to_edit", "my_image_attachment_fields_to_edit", null, 2);

De $ form_fields array heeft verschillende opties voor het opnemen van verschillende soorten invoer en aangepaste inhoud. Ik heb de verschillende methoden hieronder gecompileerd met notities en screenshots van hoe ze in de vorm worden weergegeven.

Tekst invoer

 // input type = "text" $ form_fields ["custom1"] ["label"] = __ ("Aangepast tekstveld"); $ form_fields ["custom1"] ["input"] = "tekst"; // dit is standaard als "input" is weggelaten $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true);

Renders in de vorm als:

textarea

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

Renders in de vorm als:

Verborgen veld

Verborgen velden worden samen gecompileerd en weergegeven aan het einde van het formulier.

 // input type = "hidden" // geen label $ form_fields ["custom3"] ["input"] = "verborgen"; $ form_fields ["custom3"] ["value"] = get_post_meta ($ post-> ID, "_custom3", true);

Andere veldtypen

Als u een ander invoertype dan 'tekst', 'textarea' of 'verborgen' nodig heeft, gebruikt u 'html' waarmee u uw eigen aangepaste inhoud kunt doorgeven voor gebruik met het invoerelement van uw keuze. Wanneer u uw eigen invoerhtml maakt, is het belangrijk om het attribuut 'naam' op het element correct in te stellen, zodat het veld later wordt doorgegeven aan onze opslagfunctie. U wilt zoiets als dit: name = "bijlagen [$ post-> ID] [mijn_custom_key]" .

 $ form_fields ["custom4"] ["label"] = __ ("Aangepaste selectie"); $ form_fields ["custom4"] ["input"] = "html"; $ form_fields ["custom4"] ["html"] = " "; // een ander voorbeeld $ form_fields [" custom5 "] [" label "] = __ (" Aangepast selectievakje "); $ form_fields [" custom5 "] [" input "] =" html "; $ form_fields [" custom5 " ] ["html"] = "de HTML-uitvoer komt hier, zoals een selectievakje: ";

Renders in de vorm als:

Speciale kenmerken

Er zijn verschillende speciale kenmerken die u kunt toevoegen aan uw aangepaste velden om ze te verbeteren.

helpt - Dit kenmerk voegt een hulpstring toe aan uw aangepaste veld.

 $ form_fields ["custom6"] ["label"] = __ ("Aangepast veld met nuttige tekst"); $ form_fields ["custom6"] ["waarde"] = get_post_meta ($ post-> ID, "_custom6", waar); $ form_fields ["custom6"] ["help"] = "Zet hier een nuttige tekst in.";

Dit wordt in de vorm weergegeven als:

verplicht - Dit attribuut markeert het veld zoals vereist; maar het is slechts een visuele referentie. We zullen later code moeten schrijven in de opslagfunctie om deze te handhaven.

 $ form_fields ["custom7"] ["label"] = __ ("Verplicht veld"); $ form_fields ["custom7"] ["value"] = get_post_meta ($ post-> ID, "_custom7", true); $ form_fields ["custom7"] ["verplicht"] = TRUE; // standaard is ONWAAR

Renders in de vorm als:

extra_rows - Met dit kenmerk kunt u een reeks rijen toevoegen direct na uw aangepaste veld. De markup voor elk array-item wordt hieronder weergegeven: de array-sleutel wordt de klasse van de td, en de waarde is de inhoud:

 // extra_rows markup: //  //  //  ArrayItemValue //  $ form_fields ["custom8"] ["label"] = __ ("Aangepast veld met extra rijen"); $ form_fields ["custom8"] ["value"] = get_post_meta ($ post-> ID, "_custom8", true); // extra_rows moet een associatieve array zijn $ cssClass => $ content $ form_fields ["custom8"] ["extra_rows"] = array ("cssClass1" => "Als u enkele rijen nodig heeft na uw veld ...", "cssClass2" => "... om misschien iets uit te leggen of wat afbeeldingen toe te voegen?   ",);

Renders in de vorm als:

tr - Terwijl extra_rows alleen kunt u tabelcellen toevoegen direct onder het invoerelement van uw aangepaste veld, met dit kenmerk kunt u hele rijen maken.

De tabel waaraan we een rij toevoegen, heeft twee kolommen, houd daar dus rekening mee wanneer u deze methode gebruikt. En dat is niet zo hebben om een ​​formulierveld te zijn, kunt u gewoon een rij toevoegen die de volgende velden toelicht, al uw velden handmatig toevoegen of iets anders volledig.

 $ form_fields ["custom8"] ["tr"] = "   Kan doen wat je wilt, het in model brengen, een paar velden toevoegen, een tabel met gegevens weergeven ... sky's the limit  ";

Renders in de vorm als:


Hook 2: attachment_fields_to_save

Het opslaan van uw aangepaste velden is een veel eenvoudiger proces dan ze aan het formulier toevoegen; controleer gewoon of je veld is ingesteld en update de waarde ervan als post-meta. Vergeet niet om uw veld een voorvoegsel te geven met een onderstrepingsteken bij het opslaan om het te verbergen op het bewerkingsscherm voor berichten / pagina's.

 / ** * @param array $ post * @param array $ attachment * @return array * / function my_image_attachment_fields_to_save ($ post, $ attachment) // $ attachment deel van het formulier $ _POST ($ _POST [bijlagen] [postID] ) // $ berichtbijlagen wp bericht array - wordt opgeslagen na het terugzenden // $ post ['post_type'] == 'bijlage' if (isset ($ attachment ['my_field'])) // update_post_meta (postID, meta_key , meta_value); update_post_meta ($ post ['ID'], '_my_field', $ attachment ['my_field']);  retourneer $ post; 

U kunt hier ook fouten toevoegen die automatisch onder uw veld in het formulier worden weergegeven. De $ Posten [ 'fouten'] array wordt samengevoegd met de $ form_fields array voordat het doorgestuurd wordt attachment_fields_to_edit haak.

 / ** * @param array $ post * @param array $ attachment * @return array * / function my_image_attachment_fields_to_save ($ post, $ bijlage) if (isset ($ attachment ['my_field'])) if (isset ($ bijlage ['mijn_veld']) == ") // het toevoegen van onze aangepaste fout $ post ['fouten'] ['mijn_veld'] ['fouten'] [] = __ ('Fouttekst hier.'); anders update_post_meta ($ post ['ID'], 'my_field', $ attachment ['my_field']); return $ post;

Opmerking met betrekking tot aangepaste fouten: Er zijn een paar langdurige fouten in WordPress (vanaf versie 3.0-RC3) die te maken hebben met het weergeven van aangepaste fouten.

  1. Men zal voorkomen dat uw aangepaste foutmeldingen worden weergegeven op de pagina voor het bewerken van enkele media.
  2. De andere bug bevindt zich in de modale pop-up voor media-items die worden gebruikt op het bewerkingsscherm voor berichten / pagina's. De fouten worden wel weergegeven
    hier is het alleen het probleem van in het begin ziend hen. Na het opslaan gaat u automatisch naar de
    Tabblad 'Galerij' met een geminimaliseerde lijst met media-items. Als u op 'weergeven' klikt om uw nieuwe item te openen,
    je ziet je foutmeldingen in het formulier. Het probleem is dat als er fouten zijn, dat formulier is vermeend naar
    standaard open zijn. Er is een fout in de css waar de klasse 'startopen' is (die aanwezig is op het item als
    er zijn fouten te zien) heeft de waarde van 'display: none' op een paar plaatsen in de hoofd stylesheets.

Ik heb patches voor beide problemen ingediend (# 13810 & # 13838) en mij is meegedeeld dat ze moeten worden gecontroleerd en opgenomen in versie 3.1. Vertrouw dus niet te veel op uw foutmeldingen, maar wees blij dat u weet hoe u ermee moet werken als ze in de nabije toekomst nuttiger worden.


Andere ideeën

Mogelijk wilt u een aantal van uw velden opnemen in alleen audio-bijlagen of alleen afbeeldingen die zijn bijgevoegd bij de voorpagina. Om uw bijlageformulieren verder aan te passen, wikkelt u uw speciale velden in onderscheidende uitspraken voor zowel de bewerkings- als de opslagfuncties.

 // voor audiobestanden if (substr ($ post-> post_mime_type, 0, 5) == 'audio') // voeg uw aangepaste velden toe voor audiobestanden // OF voor afbeeldingen op een specifieke pagina $ page_id = 5; // stel het ID in op de pagina waarop u deze wilt toepassen indien ($ post-> post_parent == $ page_id && substr ($ post-> post_mime_type, 0, 5) == 'afbeelding') // voeg uw afbeelding specifiek toe aangepaste velden voor deze specifieke pagina

Als je slimme manieren bedenkt om aangepaste velden met bijlagen te gebruiken, deel deze dan met ons in de opmerkingen!