Aangepaste velden toevoegen aan bijlagen

U moet bekend zijn met aangepaste velden in WordPress. We gebruiken ze op een post of een pagina om extra gegevens toe te voegen. In WordPress worden bijlagen ook als berichten opgeslagen, dus ook aangepaste velden zijn beschikbaar voor deze berichten.

Vandaag zullen we zien hoe we enkele aangepaste velden kunnen toevoegen, zodat bijlagen meer informatie kunnen bevatten dan alleen de standaardgegevens.


Wat we zullen doen

Allereerst gaan we een plug-in maken om de aangepaste velden van de bijlagen af ​​te handelen. Het krijgt een reeks opties, bak ze zodat ze deel gaan uitmaken van het formulier wanneer we een bijlage bewerken en opslaan in de database.

Hiervoor gebruiken we twee WordPress-hooks:

  • attachment_fields_to_edit om het bewerkingsformulier af te handelen
  • attachment_fields_to_save om de aangepaste velden op te slaan

1. Maak de plug-in

Ik zal dit deel snel doorgeven omdat het niet het hoofddoel van deze tutorial is.

Maak een nieuwe map in de map met plug-ins (wp-content / plugins / media-velden / bijvoorbeeld) en zet een bestand (genaamd plugin.php) binnen. Laten we ook een bestand met de naam custom_media_fields.php die onze opties zal houden.

Dit is wat jouw plugin.php bestand moet er in het begin uitzien:

 / * Plugin Naam: Wptuts + Aangepaste media velden Plugin URI: Beschrijving: Maak bijlagen aangepaste velden Versie: 0.1 Auteur: Guillaume Voisin Auteur URI: http://wp.tutsplus.com/author/guillaumevoisin Licentie: GPL2 * / require_once (plugin_dir_path ( __FILE__). '/Custom_media_fields.php'); Klasse Wptuts_Custom_Media_Fields private $ media_fields = array (); functie __construct ($ velden)  openbare functie applyFilter ($ form_fields, $ post = null)  functie saveFields ($ post, $ bijlage)  $ cmf = nieuw Wptuts_Custom_Media_Fields ($ attchments_options);

Dit is de basis die we in de volgende secties invullen. Laten we voorlopig onze reeks opties definiëren.


2. Definieer onze opties

Laten we in het andere bestand enkele opties toevoegen om het formulier voor het bewerken van bijlagen te verbeteren. We zullen voor deze tutorial overwegen om de afbeeldingen te verbeteren. We voegen bijvoorbeeld de velden auteursrecht, auteur, watermerk, beoordeling en afbeeldingsplaatsing toe.

 $ themename = "twentytwelve"; $ attchments_options = array ('image_copyright' => array ('label' => __ ('Image copyright', $ themename), 'input' => 'text', 'helps' => __ ('Als je afbeelding is beveiligd by copyrights ', $ themename),' application '=>' image ',' exclusions '=> array (' audio ',' video '),' required '=> true,' error_text '=> __ (' Auteursrechtveld vereist ', $ themename)),' image_author_desc '=> array (' label '=> __ (' Afbeelding auteur ', $ themename),' input '=>' textarea ',' application '=>' image ', 'exclusions' => array ('audio', 'video'),), 'image_watermark' => array ('label' => __ ('Image watermark', $ themename), 'input' => 'checkbox', 'toepassing' => 'afbeelding', 'uitsluitingen' => array ('audio', 'video')), 'image_stars' => array ('label' => __ ('Afbeeldingwaardering', $ themename), ' invoer '=>' radio ',' options '=> array (' 0 '=> 0,' 1 '=> 1,' 2 '=> 2,' 3 '=> 3,' 4 '=> 4) , 'application' => 'image', 'exclusions' => array ('audio', 'video')), 'image_disposition' => array ('label' => __ ('Afbeelding di sposition ', $ themename),' input '=>' select ',' options '=> array (' portrait '=> __ (' portrtait ', $ themename),' landscape '=> __ (' landscape ', $ themename)), 'application' => 'image', 'exclusions' => array ('audio', 'video')));

Het is in feite een associatieve array die deze parameters bevat:

  • label - de veldnaam die wordt weergegeven
  • invoer - het invoertype (bijvoorbeeld tekst, select, radio, ...)
  • helpt - informatie om de gebruiker te helpen bij het invullen van het veld
  • toepassing - welk tafereel mime-type toepast
  • uitsluitingen - welk tafereel mime-type uit te sluiten
  • verplicht - is het veld vereist? (standaard vals)
  • error_text - optioneel veld om de fout te beschrijven (indien nodig is ingesteld op waar)
  • opties - optioneel veld voor radio- en selectietypen
  • show_in_modal - of het veld in modaal moet worden getoond of niet (standaard waar)
  • show_in_edit - of het veld getoond moet worden in de klassieke bewerkingsweergave of niet (standaard waar)
  • extra_rows - extra rijen om inhoud weer te geven (binnen dezelfde "tr" label)
  • tr - extra rijen ("tr" label)

De highlitghted-opties vertegenwoordigen opties waarmee we handmatig omgaan, terwijl andere opties standaard zijn en WordPress automatisch zal verwerken.

Omdat we te maken hebben met afbeeldingen, hebben we de toepassing parameter naar "beeld". Het zal eigenlijk van toepassing zijn op alle soorten afbeeldingen waarvan het mime-type begint met"beeld" zoals image / jpeg, image / png enzovoorts. Je zou het kunnen uitsluiten gif mime-type door deze bijvoorbeeld in het uitsluitingsveld in te stellen.

Nu zijn onze opties ingesteld, laten we in de haken graven.


3. De haken

Zoals eerder vermeld, zullen we twee haken behandelen.

We binden onze twee functies aan die haken in de constructormethode.

 function __construct ($ fields) $ this-> media_fields = $ velden; add_filter ('attachment_fields_to_edit', array ($ this, 'applyFilter'), 11, 2); add_filter ('attachment_fields_to_save', array ($ this, 'saveFields'), 11, 2); 

Laten we nu die haken in detail bekijken.

attachment_fields_to_edit

Het heeft twee parameters:

  1. $ form_fields - Een reeks velden in het formulier voor het bewerken van bijlagen
  2. $ bericht - Object dat de bijlage zelf vertegenwoordigt

We zullen de gebruiken $ form_fields parameter om onze eigen velden samen te voegen en elk ervan te controleren aan de hand van bijlage-eisen (mime-type bijvoorbeeld).

 openbare functie applyFilter ($ form_fields, $ post = null) // Als onze veldenarray niet leeg is (! empty ($ this-> media_fields)) // We bladeren door onze set met opties voor elk ($ this-> media_fields als $ field => $ values) // Als het veld overeenkomt met de huidige bijlage mime type // en niet een van de uitzonderingen is als (preg_match ("/". $ values ​​['application']. "/", $ post-> post_mime_type) &&! in_array ($ post-> post_mime_type, $ values ​​['exclusions'])) // We krijgen de al opgeslagen meta-waarde van het veld $ meta = get_post_meta ($ post-> ID, '_'. $ field, true); // Definieer het invoertype standaard in 'tekst' $ values ​​['input'] = 'text'; // En stel het in op het veld voordat u het bouwt $ values ​​['value'] = $ meta; // We voegen ons veld toe aan de $ form_fields array $ form_fields [$ field] = $ values;  // We retourneren de voltooide $ form_fields array return $ form_fields; 

Bij deze stap moet uw bewerkingsformulier voor bijlagen worden uitgebreid met de nieuwe velden die we hebben toegevoegd. Maar ze zien eruit als tekstinvoer. We moeten nu verschillende soorten inputs overwegen (radio, checkbox, enz ...).

Dus laten we onze functie bewerken om hiermee om te gaan. Vervang de $ values ​​['input'] = 'text'; met de volgende code:

 switch ($ values ​​['input']) default: case 'text': $ values ​​['input'] = 'text'; breken; case 'textarea': $ values ​​['input'] = 'textarea'; breken; case 'select': // Select type bestaat niet, dus we zullen de html handmatig aanmaken // Hiervoor moeten we het invoertype instellen op 'html' $ values ​​['input'] = 'html'; // Maak het select element met de juiste naam (komt overeen met degene die wordpress creëert voor aangepaste velden) $ html = ''; // Stel de html-inhoud $ waarden ['html'] = $ html; breken; case 'checkbox': // Checkbox type bestaat niet $ waarden ['input'] = 'html'; // Schakel het selectievakje in of niet ($ meta == 'on') $ checked = 'checked = "checked"'; else $ checked = "; $ html = ''; $ values ​​['html'] = $ html; break; case 'radio': // radiotype bestaat niet $ values ​​['input'] = 'html'; $ html =" ; if (! empty ($ values ​​['options'])) $ i = 0; foreach ($ values ​​['options'] als $ k => $ v) if ($ meta == $ k) $ checked = 'checked = "checked"'; else $ checked = "; $ html. = ' 
'; $ I ++; $ waarden ['html'] = $ html; breken;

Nu kunnen we veelgebruikte HTML-elementen bouwen. Laten we eens kijken naar ons formulier voor het bewerken van bijlagen. Het zou er precies zo uit moeten zien:


Bijlage bewerkingsformulier met aangepaste velden

De aangepaste velden, afhankelijk van of u hun modale opties hebt ingesteld op true of niet, worden ook weergegeven in het media-modale formulier wanneer u een bericht bewerkt.

Aangepaste velden in modaal

Nu worden onze velden weergegeven in ons formulier voor het bewerken van bijlagen, we moeten ze opslaan in de database. Hiervoor gaan we de tweede haak gebruiken.

attachment_fields_to_save

Deze haak heeft ook twee parameters:

  1. $ bericht - rangschikking die de bijlage-entiteit vertegenwoordigt
  2. $ attachment - bevat alle velden die zijn gekoppeld aan de bijlage

Laten we nu de functie vullen saveFields we vertrokken in het vorige gedeelte.

 function saveFields ($ post, $ bijlage) // Als onze veldenarray niet leeg is (! empty ($ this-> media_fields)) // Browser die velden voor elke ($ this-> media_velden als $ field => $ waarden) // Als dit veld is ingediend (aanwezig in de $ bijlage-variabele) if (isset ($ bijlage [$ -veld])) // Als het verzonden veld leeg is // We voegen fouten toe aan het berichtobject met de parameter "error_text" die we in de opties if hebben ingesteld (strlen (trim ($ attachment [$ field])) == 0) $ post ['errors'] [$ field] ['errors'] [] = __ ($ waarden ['error_text']); // Anders updaten we het aangepaste veld anders update_post_meta ($ post ['ID'], '_'. $ Field, $ attachment [$ field]);  // Anders verwijderen we het als het al anders bestond delete_post_meta ($ post ['ID'], $ field);  return $ post; 

OK, nu worden onze aangepaste velden opgeslagen in de database en zijn ze beschikbaar voor de front-end.

  • Wees voorzichtig bij het manipuleren van de parameter post in beide haken. Het is een voorwerp in de eerste en een rangschikking in de tweede.
  • Tip: de update_post_meta maakt de meta als deze niet bestaat.
  • Tip: We geven de aangepaste veldsleutel een voorvoegsel met een onderstrepingsteken "_"zodat ze niet worden vermeld in de metaboxen voor aangepaste velden op pagina's voor het bewerken van berichten.

Foutoverwegingen

Vanaf versie 3.5 lijkt het erop dat fouten nog steeds niet verschijnen op bijgevoegde attachment-formulieren. Ik heb geprobeerd de kerncode te onderzoeken, en ondanks het feit dat het gecorrigeerd had moeten zijn (http://core.trac.wordpress.org/ticket/13810), lijkt het niet.

Voor het ajax-opslagproces is het zeker dat het nog niet klaar is zoals vermeld in de ajax-actions.php het dossier:

 $ errors = $ post ['errors']; // @todo retourneert me en geeft mij weer!

Dus op dit moment gaan fouten niet goed, maar de code is klaar, zodat wanneer die bugs verholpen zijn, het zal werken.


Voorkant

Als u deze aangepaste velden in uw sjablonen wilt gebruiken, moet u post-metas op dezelfde manier ophalen als voor gewone berichten. Vergeet niet om de "_"voorvoegsel aan de aangepaste velden" -toetsen.

Je zou bijvoorbeeld zo kunnen doen:

 echo "
    "; echo"
  • auteursrechten: ". get_post_meta (get_the_ID (), '_image_copyright', true)."
  • "; echo"
  • Beoordeling: ". get_post_meta (get_the_ID (), '_image_stars', true)."
  • "; echo"
  • Beschrijving van de auteur: ". get_post_meta (get_the_ID (), '_image_author_desc', true)."
  • "; echo"
  • Beeld dispositie: ". get_post_meta (get_the_ID (), '_image_disposition', true)."
  • "; echo"
  • Watermerk? ". (get_post_meta (get_the_ID (), '_image_watermark', true) ==" on "?" yes ":" no ")."
  • "; echo"
";
Toon aangepaste velden aan de voorkant

Ga verder

Er zijn verschillende verbeterpunten afhankelijk van uw behoeften:

  • U zou uw instellingen in de database kunnen hebben, zodat het flexibeler wordt om ze toe te voegen, te bewerken en te verwijderen
  • U kunt een standaardwaarde hebben die is ingesteld voor alle nieuwe bijlagen wanneer er geen waarde is ingesteld
  • Je moet wat stijl instellen voor het modale formulier zodat het de aangepaste velden correct weergeeft

Conclusie

Aarzel niet om uw ideeën over het verbeteren van deze plug-in met ons te delen en wat u van dergelijke functionaliteit zou verwachten.