Cum se adaugă câmpurile personalizate în atașamente

Ar trebui să fiți familiarizați cu câmpurile personalizate din WordPress. Le folosim într-o postare sau într-o pagină pentru a adăuga date suplimentare. În WordPress, atașamentele sunt, de asemenea, salvate ca postări, astfel încât și câmpurile personalizate sunt disponibile pentru ele.

Astăzi vom vedea cum putem adăuga câteva câmpuri personalizate, astfel încât atașamentele să poată purta mai multe informații decât doar datele implicite.


Ce vom face

Mai întâi de toate, vom crea un plugin pentru a gestiona câmpurile personalizate ale atașamentelor. Acesta va primi un set de opțiuni, le va coace, astfel încât acestea să devină parte a formularului atunci când vom edita un atașament și le vom salva în baza de date.

Pentru aceasta, vom folosi două cârlige WordPress:

  • attachment_fields_to_edit pentru a gestiona formularul de editare
  • attachment_fields_to_save pentru a salva câmpurile personalizate

1. Creați pluginul

Voi trece repede în această parte deoarece nu este scopul principal al acestui tutorial.

Creați un folder nou în directorul de pluginuri (wp-content / plugins / media-domenii / de exemplu) și a pus un fișier (numit plugin.php) interior. Să punem, de asemenea, un fișier numit custom_media_fields.php care ne vor păstra opțiunile.

Asta e ceea ce ai plugin.php fișierul ar trebui să arate ca la început:

 / * Nume Plugin: Wptuts + Custom Media Fields Plugin URI: Descriere: Creare câmpuri atașate personalizate Versiune: 0.1 Autor: Guillaume Voisin Autor URI: http://wp.tutsplus.com/author/guillaumevoisin Licență: GPL2 * / require_once (plugin_dir_path __FILE__). '/ Custom_media_fields.php'); Clasa Wptuts_Custom_Media_Fields private $ media_fields = array (); funcția __construct ($ fields)  funcția publică applyFilter ($ form_fields, $ post = null)  funcția saveFields ($ post, $ attachment)  $ cmf = noi Wptuts_Custom_Media_Fields ($ attchments_options);

Aceasta este baza pe care o vom ocupa în următoarele secțiuni. Pentru moment, să definim setul nostru de opțiuni.


2. Definiți opțiunile noastre

În celălalt fișier, să adăugăm câteva opțiuni pentru îmbunătățirea formularului de editare a atașamentului. Vom lua în considerare, pentru acest tutorial, opțiuni de îmbunătățire a imaginilor. De exemplu, vom adăuga câmpurile privind drepturile de autor, descrierea autorului, filigranul, evaluarea și imaginea.

 $ numele = "twentytwelve"; $ attchments_options = array ('image_copyright' => array ('etichetă' => __ (' ("audio", "video"), "obligatoriu" => true, "error_text" => __ ("Drept de autor", $ themename) , "image_author_desc" => array ('label' => __ ('descrierea autorului imaginii', $ themename) 'excluderi' => array ('audio', 'video'), 'image_watermark' => array ('label' => __ ('Watermark'; 'image' => 'imagine', 'excluderi' => array ('audio', 'video')), 'image_stars' => array de intrare '=>' radio ',' opțiuni '=> array (' 0 '=> 0,' 1 '=> 1, , 'application' => 'image', 'excludions' => array ('audio', 'video')), 'image_disposition' => array ('portret' => __ ('portratait', 'themename'), 'peisaj' => __ ('peisaj', numele ")," aplicație "=>" imagine "," excluderi "=> array (" audio "," video ")));

Este în esență o matrice asociativă care conține acești parametri:

  • eticheta - numele câmpului care va fi afișat
  • intrare - tipul de intrare (de exemplu, text, selectați, radio, ...)
  • ajută - informații pentru a ajuta utilizatorul să completeze câmpul
  • cerere - care tip mime attchment să se aplice
  • excluderi - care tip de mime atribuire pentru a exclude
  • necesar - este domeniul necesar? (Mod implicit fals)
  • ERROR_TEXT - câmp opțional pentru a descrie eroarea (dacă este necesar este setată la Adevărat)
  • Opțiuni - câmp opțional pentru radio și selectați tipuri
  • show_in_modal - dacă doriți să afișați câmpul în modal sau nu (implicit Adevărat)
  • show_in_edit - dacă doriți să afișați câmpul în vizualizarea clasică de editare sau nu (implicit Adevărat)
  • extra_rows - rânduri suplimentare pentru afișarea conținutului (în cadrul aceluiași "tr" etichetă)
  • tr - rânduri suplimentare ("tr" etichetă)

Opțiunile cu luminozitate ridicată reprezintă opțiuni pe care le vom rezolva manual, în timp ce altele sunt cele implicite WordPress va procesa automat.

Pe măsură ce avem de-a face cu imagini, setăm cerere parametru pentru a "imagine"Se va aplica de fapt tuturor tipurilor de imagini al căror tip de mime începe cu"imagine" precum image / jpeg, image / png si asa mai departe. Ai putea exclude gif tip mime prin setarea în câmpul de excluderi, de exemplu.

Acum, opțiunile noastre sunt stabilite, să săpăm în cârlige.


3. Cârligele

Așa cum am menționat mai devreme, vom aborda două cârlige.

Legăm cele două funcții ale acestor cârlige în metoda constructorului.

 funcția __construct (câmpuri $) $ this-> media_fields = $ fields; add_filter ('attachment_fields_to_edit', array ($ this, 'applyFilter'), 11, 2); add_filter ('attachment_fields_to_save', array ($ this, 'saveFields'), 11, 2); 

Acum, să vedem aceste cârlige în detaliu.

attachment_fields_to_edit

Are doi parametri:

  1. $ form_fields - O serie de câmpuri conținute în formularul de modificare a fișierului atașat
  2. $ postare - Obiect care reprezintă atașamentul în sine

Vom folosi $ form_fields parametru pentru a fuziona propriile câmpuri și a verifica fiecare dintre ele împotriva cerințelor atașamentului (de exemplu, tipul de mime).

 functie publica applyFilter ($ form_fields, $ post = null) // Daca campurile noastre nu sunt goale daca (! empty ($ this-> media_fields)) // Răsfoim setul de opțiuni foreach ($ this-> media_fields ca $ field => $ values) // Dacă câmpul se potrivește cu atașamentul curent tip mime // și nu este unul dintre excluderile if (preg_match ("/". $ values ​​['application'] "/", $ ($ post-> post_mime_type) &&! in_array ($ post-> post_mime_type, $ values ​​['excludes'])) // Avem valoarea meta de câmp deja salvată $ meta = get_post_meta ($ post-> ID, '_'. $ field, true); // Definiți tipul de intrare la 'text' în mod implicit $ values ​​['input'] = 'text'; // și setați-l la câmp înainte de al construi $ values ​​['value'] = $ meta; // Adăugăm câmpul nostru în câmpul $ form_fields $ form_fields [$ field] = $ valori;  // Returăm returnarea matricei $ form_fields completate $ form_fields; 

La acest pas, trebuie să aveți formatul de editare a atașamentului îmbunătățit cu noile câmpuri pe care le-am adăugat. Dar ele vor arata ca intrarile de text. Acum trebuie să luăm în considerare diferite tipuri de intrări (radio, casetă de selectare etc.).

Deci, să ne editați funcția pentru a face față acestei situații. Inlocuieste $ valori ['input'] = 'text'; cu următorul cod:

 comutator ($ valori ['input']) implicit: caz 'text': $ values ​​['input'] = 'text'; pauză; cazul 'textarea': $ values ​​['input'] = 'textarea'; pauză; caz selectați: // Selectează tipul nu există, așa că vom crea html manual // Pentru aceasta, trebuie să setăm tipul de intrare în 'html' $ values ​​['input'] = 'html'; // Creați elementul de selectare cu numele corect (se potrivește cu cel creat de wordpress pentru câmpurile personalizate) $ html = '„; // Setați conținutul html $ values ​​['html'] = $ html; pauză; caseta "case": // Tipul căsuței de validare nu există nici $ valori ['input'] = 'html'; // Setați caseta de selectare bifată sau nu dacă ($ meta == 'on') $ checked = 'checked =' checked ''; altfel $ checked = "; $ html = ' 
„; $ I ++; valori $ ['html'] = $ html; pauză;

Acum, putem construi elemente HTML comune. Să verificăm formularul de modificare a atasamentului. Ar trebui să arate exact așa:


Formularul de modificare a atașamentului cu câmpuri personalizate

Câmpurile personalizate, în funcție de alegerea opțiunilor modale la adevărat sau nu, vor apărea și în forma modală media atunci când editați o postare.

Câmpuri personalizate în modal

Acum câmpurile noastre sunt afișate în formularul de editare a atasamentelor, trebuie să le salvăm în baza de date. Pentru aceasta, vom folosi al doilea cârlig.

attachment_fields_to_save

Acest cârlig are de asemenea doi parametri:

  1. $ postare - mulțime care reprezintă entitatea de atașament
  2. atașament $ - conține toate câmpurile atașate postului de atașament

Acum, să umplem funcția saveFields am plecat în secțiunea anterioară.

 ($ this-> media_fields)) // Browser acele câmpuri foreach ($ this-> media_fields ca $ field => $ ($ this => media_fields) valori) // Dacă acest câmp a fost trimis (este prezent în variabila atașament $) dacă (isset ($ attachment [$ field])) // Dacă câmpul trimis este gol // Adăugăm erori la obiectul post cu parametrul "error_text" pe care l-am setat în opțiuni dacă (strlen (trim ($ attachment [$ field])) == 0 $ post ['errors'] [$ field] valori ['error_text']); // În caz contrar actualizăm alt câmp personalizat update_post_meta ($ post ['ID'], '_'. $ Field, $ attachment [$ field]);  // În caz contrar, îl ștergem dacă există deja altceva delete_post_meta ($ post ['ID'], câmp $);  returnați $ post; 

Ok, acum câmpurile noastre personalizate sunt salvate în baza de date și vor fi disponibile pentru front-end.

  • Aveți grijă când manipulați parametrul post în ambele cârlige. Este un obiect în primul și an mulțime în cel de-al doilea.
  • Bacsis: update_post_meta va crea meta dacă nu există.
  • Bacsis: Prefixăm cheia personalizată cu o subliniere "_"astfel încât să nu fie afișate în metaboxurile câmpurilor personalizate din paginile de editare postate.

Observații privind eroarea

Încă de la versiunea 3.5, se pare că erorile încă nu apar în formularele de modificare a fișierelor atașate. Am încercat să investighez codul de bază și, în ciuda faptului că ar fi trebuit să fie fixat (http://core.trac.wordpress.org/ticket/13810), nu pare.

Pentru procesul de salvare ajax, este sigur că nu sa făcut încă așa cum se menționează în ajax-actions.php fişier:

 $ eroare = $ post ['erori']; // @todo mă întoarce și mă afișează!

Deci, chiar acum, erorile nu vor funcționa corect, dar codul se face astfel încât atunci când aceste bug-uri sunt fixe, va funcționa.


În față

Pentru a utiliza acele câmpuri personalizate în șabloanele dvs., trebuie doar să preluați metazele postărilor la fel ca și pentru postările obișnuite. Nu uitați să adăugați mesajul "_"prefixul tastelor câmpurilor personalizate".

De exemplu, ați putea face acest lucru:

 ecou "
    "ecou"
  • Drepturi de autor: "get_post_meta (get_the_ID ()," _image_copyright ", adevărat)."
  • "ecou"
  • evaluare: "get_post_meta (get_the_ID ()," _image_stars ", adevărat)."
  • "ecou"
  • Descrierea autorului: "get_post_meta (get_the_ID ()," _image_author_desc ", adevărat)."
  • "ecou"
  • Poziția imaginii: "get_post_meta (get_the_ID ()," _image_disposition ", adevărat)."
  • "ecou"
  • filigran? "(get_post_meta (get_the_ID ()," _image_watermark ", adevărat) ==" on "?" yes ":" no ")."
  • "ecou"
„;
Afișați câmpuri personalizate în front-end

Mergi mai departe

Există câteva puncte de îmbunătățire în funcție de nevoile dvs.:

  • Ați putea avea setările dvs. în baza de date, astfel încât să devină mai flexibilă pentru a le adăuga, edita și elimina
  • Ați putea să aveți o valoare implicită setată pentru toate atașamentele noi când nu este setată o valoare
  • Ar trebui să setați un stil pentru forma modală, astfel încât acesta să afișeze corect câmpurile personalizate

Concluzie

Nu ezitați să vă împărtășiți ideile dvs. despre cum să îmbunătățiți acest plugin și ce vă așteptați de la o astfel de funcție.

Cod