Crearea câmpurilor personalizate pentru atașamente în Wordpress

Câmpurile personalizate din Wordpress ușurează personalizarea temei într-o varietate de moduri; plus, sunt ușor de implementat pentru postări și pagini. Atașamentele, pe de altă parte, necesită mai multă muncă pentru implementare, necesitând citirea și descifrarea codului sursă de bază pentru a le face să funcționeze. Vom trece prin folosirea unui cuplu de cârlige Wordpress nedocumentate în acest tutorial pentru a face acest proces mult mai ușor.


Prefață: Despre cârligele

Ambele aceste cârlige au fost în jur de la Wordpress 2.5 și sunt aplicate în wp-admin / include / media.php, dar rămân subutilizate în comunitate cel mai probabil pentru că sunt nedocumentate în Codex. Mai jos este locul în care cârligele sunt aplicate în codul de bază, permițându-ne să știm ce va fi trecut la funcțiile pe care le adăugăm la fiecare cârlig.

attachment_fields_to_edit

 funcția get_attachment_fields_to_edit ($ post, $ errors = null) // ... $ form_fields = apply_filters ("attachment_fields_to_edit", $ form_fields, $ post); // ...
  • $ form_fields este o matrice specială care va fi descrisă în detaliu într-un moment.
  • $ postare este atașamentul ca un obiect (atașamentele sunt tratate ca obiecte post în Wordpress).

attachment_fields_to_save

 funcția media_upload_form_handler () // ... $ post = apply_filters ("attachment_fields_to_save", $ post, $ attachment); // ...
  • $ postare este atașamentul ca un mulțime (atașamentele sunt tratate ca obiecte post în Wordpress).
  • atașament $ este partea de atașament a formei $ _POST care va include configurarea câmpurilor prin attachment_fields_to_edit cârlig.

Notă: Fii atent în codul tău, ca $ postare este trimis la o funcție ca un obiect și celălalt ca un mulțime.

Sfaturi personalizate pentru numirea câmpurilor

Noile câmpuri adăugate vor fi salvate ca post meta, la fel ca și secțiunea câmpuri personalizate din ecranul de editare a postului / paginii. Câmpurile prefixate cu o subliniere (_my_custom_field) nu vor fi listate în lista drop-down a câmpurilor personalizate disponibile pe ecranul post / pagină; toate celelalte câmpuri post meta existente vor fi listate. Putem folosi aceste cunoștințe pentru a ascunde câmpurile pe care le adăugăm la formularul media, deoarece acestea nu sunt relevante pentru postări / pagini.

Există o regulă similară pe care trebuie să o țineți cont atunci când alegeți $ form_fields array cheie pentru a utiliza pentru noul dvs. domeniu. Aici, dacă utilizați o subliniere ($ form_fields [ '_ my_custom_field']) câmpul dvs. va fi sărit și nu va fi adăugat la formular.

Deci, pentru a arăta câmpurile noastre în forma media, dar și pentru a nu le afișa în câmpurile paginilor / posturilor personalizate, trebuie să combinăm ambele metode. Aceasta va involuționa funcțiile de editare și salvare pe care le vom crea. Pentru 'attachment_fields_to_editCârlig pe care îl vom pune $ form_fields tastele să nu aibă prefixe de subliniere, iar pentru "attachment_fields_to_save'cârlig, vom prefixa câmpurile noastre cu o subliniere înainte de a le salva ca post meta. Este o soluție care merită făcută pentru a nu bloca interfața utilizatorilor noștri cu informații inutile.


Hook 1: attachment_fields_to_edit

Mai jos este un exemplu despre cum să adăugați propriile câmpuri personalizate în formularul de atașament.

 / ** * Adăugarea câmpurilor personalizate în array $ form_fields * * @param array $ form_fields * @param obiect $ post * @return array * / function my_image_attachment_fields_to_edit ($ form_fields, $ post) // $ form_fields este o array specială din câmpuri pentru a include în formularul de atașament // $ post este înregistrarea atașamentului din baza de date // $ post-> post_type == 'attachment' // // (atașamentele sunt tratate ca posturi în Wordpress) // adăugați câmpul nostru personalizat la $ form_fields array // input type = "text" nume / id = "fișiere atașate [$ attachment-> ID] [custom1]" $ form_fields ["custom1"] = array ), "input" => "text", // aceasta este implicită dacă "input" este omis "value" => get_post_meta ($ post-> ID, "_custom1", true)); // dacă veți adăuga mesaje de eroare pentru câmpul dvs., // pentru a nu le suprascrie, deoarece acestea sunt pre-atașate // la această matrice, va trebui să setați câmpul astfel: $ form_fields [ custom1 "] [" label "] = __ (" câmp de text personalizat "); $ form_fields ["custom1"] ["intrare"] = "text"; $ form_fields ["custom1"] ["valoare"] = get_post_meta ($ post-> ID, "_custom1", true); returnați $ form_fields;  / / atașați funcția noastră la cârligul corect add_filter ("attachment_fields_to_edit", "my_image_attachment_fields_to_edit", null, 2);

$ form_fields matrice are mai multe opțiuni pentru a include diferite tipuri de intrări și conținut personalizat. Am compilat diferitele metode de mai jos cu note și capturi de ecran ale modului în care sunt prezentate în formular.

Introducerea textului

 // input type = "text" $ form_fields ["custom1"] ["label"] = __ ("câmp text personalizat"); $ form_fields ["custom1"] ["intrare"] = "text"; // aceasta este implicită dacă "o intrare" este omisă $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true);

Renders în formă ca:

textarea

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

Renders în formă ca:

Câmp ascuns

Căsuțele ascunse sunt compilate împreună și sunt trimise la sfârșitul formularului.

 // input type = "hidden" // nu este nevoie de o etichetă $ form_fields ["custom3"] ["input"] = "ascuns"; $ form_fields ["custom3"] ["valoare"] = get_post_meta ($ post-> ID, "_custom3", true);

Alte tipuri de câmpuri

Dacă aveți nevoie de un tip de intrare diferit de "text", "textarea" sau "ascuns", utilizați "html", care vă permite să transmiteți propriul conținut personalizat pentru a utiliza elementul de intrare ales. Când creați propriul html de intrare, este important să setați corect atributul "name" pe element, pentru ca câmpul să fie transferat ulterior la funcția noastră de salvare. Vrei ceva de genul asta: nume = "atașamente [$ post-> ID] [my_custom_key]" .

 $ form_fields ["custom4"] ["label"] = __ ("Selectare personalizată"); $ form_fields ["custom4"] ["intrare"] = "html"; $ form_fields ["custom4"] ["html"] = " "$ // form_fields [" custom5 "] [" input "] =" html "; $ form_fields [" custom5 "]; ] ["html"] = "ieșirea html merge aici, ca o casetă de selectare: ";

Renders în formă ca:

Atribute speciale

Există mai multe atribute speciale pe care le puteți adăuga la câmpurile personalizate pentru a le îmbunătăți.

ajută - Acest atribut adaugă un șir de ajutor în câmpul dvs. personalizat.

 $ form_fields ["custom6"] ["label"] = __ ("Câmp obligatoriu cu text util"); $ form_fields ["custom6"] ["valoare"] = get_post_meta ($ post-> ID, "_custom6", true); $ form_fields ["custom6"] ["ajutor"] = "Introduceți aici un text util.";

Aceasta se realizează sub forma:

necesar - Acest atribut va marca câmpul după cum este necesar; dar este doar o referință vizuală. Va trebui să scriem cod mai târziu în funcția de salvare pentru al aplica.

 $ form_fields ["custom7"] ["label"] = __ ("Câmp obligatoriu"); $ form_fields ["custom7"] ["valoare"] = get_post_meta ($ post-> ID, "_custom7", true); $ form_fields ["custom7"] ["cerut"] = TRUE; // implicit este FALSE

Renders în formă ca:

extra_rows - Acest atribut vă permite să adăugați o serie de rânduri imediat după câmpul dvs. personalizat. Marcajul pentru fiecare element de matrice este prezentat mai jos: cheia de matrice va deveni clasa td, iar valoarea este conținutul:

 // marcaj extra_rows: //  //  // ArrayItemValue //  $ form_fields ["custom8"] ["label"] = __ ("Câmp obligatoriu cu extra rânduri"); $ form_fields ["custom8"] ["valoare"] = get_post_meta ($ post-> ID, "_custom8", true); // extra_rows trebuie să fie o matrice asociativă $ cssClass => $ content $ form_fields ["custom8"] ["extra_rows"] = array ("cssClass1" => "Dacă aveți nevoie de câteva rânduri după câmpul ..." => "... poate să explice ceva sau să adauge niște imagini?   ",);

Renders în formă ca:

tr - In timp ce extra_rows vă permite să adăugați celule de tabelă direct sub elementul de intrare al câmpului personalizat, acest atribut vă permite să creați rânduri întregi.

Tabelul în care adăugăm un rând are două coloane, deci țineți cont de acest lucru atunci când utilizați această metodă. Și asta nu este avea pentru a fi un câmp de formular, puteți adăuga un rând care explică următoarele câmpuri, adăugați manual toate câmpurile sau altceva în întregime.

 $ form_fields ["custom8"] ["tr"] = "   Poți să faci ce-ți dorești, să-l stilizezi, să adaugi câmpuri, să afișezi un tabel de date ... cerul e limita  „;

Renders în formă ca:


Cârlig 2: attachment_fields_to_save

Salvarea câmpurilor personalizate este un proces mult mai simplu decât să le adăugați la formular; verificați dacă câmpul este setat și actualizați valoarea acestuia ca post meta. Amintiți-vă să vă prefixați câmpul cu o subliniere atunci când salvați-o pentru al ascunde în ecranul de editare post / pagină.

 ($ post, $ attachment) // $ parte de atasare a formularului $ _POST ($ _POST [attachments] [postID] / $ * @param array $ post * @param array $ attachment * @return array * / function my_image_attachment_fields_to_save ) // $ post attachments wp post array - va fi salvat după returnare // $ post ['post_type'] == 'attachment' dacă (isset ($ attachment ['my_field'])) // update_post_meta (postID, meta_key , meta_value); update_post_meta ($ post ['ID'], '_my_field', $ atașament ['my_field']);  returnați $ post; 

De asemenea, puteți adăuga aici erori care vor fi afișate automat sub câmpul dvs. în formular. $ Posta [ 'erori'] array devine fuzionat cu $ form_fields înainte de a fi trimis prin attachment_fields_to_edit cârlig.

 ($ attachment) if ($ attachment ['my_field'])) if (trim ($)) atașament ['my_field']) == ") // adăugarea erorii personalizate $ post ['erori'] ['my_field'] ['erori'] [] = __ update_post_meta ($ post ['ID'], 'my_field', $ attachment ['my_field']); retur $ post;

Notă privind erorile personalizate: Există câteva bug-uri de lungă durată în Wordpress (ca și versiunea 3.0-RC3) care au de a face cu afișarea de erori personalizate.

  1. Unul va împiedica afișarea mesajelor personalizate de eroare pe pagina de editare a unui singur media.
  2. Celălalt bug este în fereastra pop-up modală pentru elementele media utilizate pe ecranul de editare post / pagină. Se afișează erorile
    aici este doar problema inițială vedere lor. După salvare, vi se trece automat la
    Fila "Galerie" unde există o listă minimă de articole media. Dacă dați clic pe "afișați" pentru a deschide elementul nou,
    veți vedea mesajele dvs. de eroare în formular. Problema este că, dacă există erori, acea formă este presupus la
    fi deschis în mod implicit. Există o eroare în css unde clasa "startopen" (care este prezent pe element dacă
    există erori de afișat) are valoarea "afișare: niciuna" în câteva locuri din foile de stil de bază.

Am trimis păpuși pentru ambele probleme (# 13810 & # 13838) și le-a fost spus că ar trebui revizuite și incluse în versiunea 3.1. Deci, pentru moment, nu vă bazați prea mult pe mesajele dvs. de eroare, fiți bucuroși să știți cum să lucrați cu ei atunci când devin mai folositori în viitorul apropiat.


Alte idei

Poate doriți să includeți câteva câmpuri numai pe atașamente audio sau doar pe imagini atașate la prima pagină. Pentru a personaliza în continuare formularele de atașament, trebuie doar să înfășurați câmpurile speciale în instrucțiunile de distincție pentru funcțiile de editare și salvare.

 // pentru fișierele audio dacă (substr ($ post-> post_mime_type, 0, 5) == 'audio') // adăugați câmpurile personalizate pentru fișiere audio // SAU pentru imagini de pe o anumită pagină $ page_id = 5; // setați ID-ul la orice pagină doriți să fie aplicată dacă ($ post-> post_parent == $ page_id && substr ($ post-> post_mime_type, 0, 5) == 'imagine') // adăugați imaginea specifică câmpuri personalizate pentru această pagină particulară

Dacă vă gândiți la modalități inteligente de a utiliza câmpuri personalizate cu atașamente, trimiteți-le la noi în comentarii!

Cod