Come aggiungere campi personalizzati agli allegati

Dovresti avere familiarità con i campi personalizzati in WordPress. Li usiamo su un post o una pagina per aggiungere dati extra. Anche gli allegati WordPress vengono salvati come post, quindi sono disponibili anche campi personalizzati.

Oggi vedremo come aggiungere alcuni campi personalizzati in modo che gli allegati possano contenere più informazioni rispetto ai soli dati predefiniti.


Cosa faremo

Prima di tutto, creeremo un plugin per gestire i campi personalizzati degli allegati. Otterrà una serie di opzioni, le infornerà in modo che diventino parte del modulo quando modifichiamo un allegato e le salviamo nel database.

Per questo, utilizzeremo due hook di WordPress:

  • attachment_fields_to_edit per gestire il modulo di modifica
  • attachment_fields_to_save per salvare i campi personalizzati

1. Crea il plugin

Passerò rapidamente su questa parte in quanto non è lo scopo principale di questo tutorial.

Crea una nuova cartella nella directory dei plugin (wp-content / plugins / media-campi / per esempio) e metti un file (chiamato plugin.php) dentro. Mettiamo anche un file chiamato custom_media_fields.php che manterrà le nostre opzioni.

Questo è ciò che è tuo plugin.php il file dovrebbe apparire come all'inizio:

 / * Nome plugin: Wptuts + URI plugin per campi multimediali personalizzati: Descrizione: Crea campi personalizzati allegati Versione: 0.1 Autore: Guillaume Voisin Autore URI: http://wp.tutsplus.com/author/guillaumevoisin Licenza: GPL2 * / require_once (plugin_dir_path ( __FILE__). '/Custom_media_fields.php'); Classe Wptuts_Custom_Media_Fields private $ media_fields = array (); function __construct ($ fields)  public function applyFilter ($ form_fields, $ post = null)  function saveFields ($ post, $ attachment)  $ cmf = new Wptuts_Custom_Media_Fields ($ attchments_options);

Questa è la base che popoleremo nelle seguenti sezioni. Per ora, definiamo il nostro set di opzioni.


2. Definisci le nostre opzioni

Nell'altro file, aggiungiamo alcune opzioni per migliorare il modulo di modifica degli allegati. Considereremo, per questo tutorial, le opzioni per migliorare le immagini. Ad esempio, aggiungeremo campi di copyright, descrizione dell'autore, filigrana, classificazione e disposizione dell'immagine.

 $ themename = "twentytwelve"; $ attchments_options = array ('image_copyright' => array ('label' => __ ('Immagine copyright', $ themename), 'input' => 'testo', 'aiuta' => __ ('Se la tua immagine è protetta da copyright, $ themename), 'application' => 'image', 'exclusions' => array ('audio', 'video'), 'required' => true, 'error_text' => __ ('Campo copyright richiesto ', $ themename)),' image_author_desc '=> array (' label '=> __ (' Descrizione dell'autore dell'immagine ', $ themename),' input '=>' textarea ',' application '=>' image ', 'exclusions' => array ('audio', 'video'),), 'image_watermark' => array ('label' => __ ('Filigrana immagine', $ themename), 'input' => 'checkbox', 'application' => 'image', 'exclusions' => array ('audio', 'video')), 'image_stars' => array ('label' => __ ('Image rating', $ themename), ' input '=>' radio ',' opzioni '=> array (' 0 '=> 0,' 1 '=> 1,' 2 '=> 2,' 3 '=> 3,' 4 '=> 4) , 'application' => 'image', 'exclusions' => array ('audio', 'video')), 'image_disposition' => array ('label' => __ ('Immagine di sposition ', $ themename),' input '=>' select ',' options '=> array (' portrait '=> __ (' portrtait ', $ themename),' landscape '=> __ (' landscape ', $ themename)), 'application' => 'image', 'exclusions' => array ('audio', 'video')));

È fondamentalmente un array associativo che contiene questi parametri:

  • etichetta - il nome del campo che verrà visualizzato
  • ingresso - il tipo di input (ad esempio testo, seleziona, radio, ...)
  • aiuta - informazioni per aiutare l'utente a compilare il campo
  • applicazione - quale tipo di mime di attage da applicare
  • esclusioni - quale tipo di mime di attage da escludere
  • necessario - è il campo richiesto? (predefinito falso)
  • error_text - campo facoltativo per descrivere l'errore (se richiesto è impostato su vero)
  • opzioni - campo opzionale per radio e selezionare i tipi
  • show_in_modal - se mostrare il campo in modale o no (predefinito vero)
  • show_in_edit - se mostrare il campo nella visualizzazione di modifica classica o no (predefinito vero)
  • extra_rows - righe aggiuntive per visualizzare il contenuto (all'interno dello stesso "TR"tag")
  • TR - righe aggiuntive ("TR"tag")

Le opzioni illuminate rappresentano le opzioni che tratteremo manualmente mentre altre sono quelle predefinite che WordPress elaborerà automaticamente.

Dato che abbiamo a che fare con le immagini, impostiamo il applicazione parametro su "Immagine". In realtà si applica a tutti i tipi di immagini il cui tipo MIME inizia con"Immagine" ad esempio image / jpeg, image / png e così via. Si potrebbe escludere il gif tipo mime impostandolo nel campo delle esclusioni, ad esempio.

Ora le nostre opzioni sono impostate, scaviamo nei ganci.


3. I ganci

Come menzionato in precedenza, ci occuperemo di due ganci.

Leghiamo le nostre due funzioni a quegli hook nel metodo del costruttore.

 funzione __construct ($ fields) $ 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); 

Ora vediamo questi ganci in dettaglio.

attachment_fields_to_edit

Ha due parametri:

  1. $ form_field - Una matrice di campi contenuti nel modulo di modifica degli allegati
  2. $ postale - Oggetto che rappresenta l'allegato stesso

Useremo il $ form_field parametro per unire i nostri campi e controllarli singolarmente rispetto ai requisiti degli allegati (tipo mime per esempio).

 funzione pubblica applyFilter ($ form_fields, $ post = null) // Se la matrice dei campi non è vuota se (! empty ($ this-> media_fields)) // Navigiamo nel set di opzioni foreach ($ this-> media_fields come $ campo => $ valori) // Se il campo corrisponde all'attuale allegato mime type // e non è una delle esclusioni if ​​(preg_match ("/". $ values ​​['application']. "/", $ post-> post_mime_type) &&! in_array ($ post-> post_mime_type, $ values ​​['exclusions'])) // Otteniamo il valore meta del campo già salvato $ meta = get_post_meta ($ post-> ID, '_'. $ campo, vero); // Definire il tipo di input in 'testo' per impostazione predefinita $ values ​​['input'] = 'text'; // E impostalo sul campo prima di costruirlo $ values ​​['value'] = $ meta; // Aggiungiamo il nostro campo all'array $ form_fields $ form_fields [$ field] = $ values;  // Restituiamo l'array $ form_fields completato return $ form_fields; 

In questo passaggio, dovresti avere il modulo di modifica degli allegati ottimizzato con i nuovi campi che abbiamo aggiunto. Ma sembreranno input di testo. Ora dobbiamo considerare diversi tipi di input (radio, checkbox, ecc ...).

Quindi modifichiamo la nostra funzione per gestirlo. Sostituisci il $ values ​​['input'] = 'testo'; con il seguente codice:

 switch ($ values ​​['input']) default: case 'text': $ values ​​['input'] = 'text'; rompere; caso 'textarea': $ values ​​['input'] = 'textarea'; rompere; case 'select': // Seleziona il tipo non esiste, quindi creeremo manualmente il codice html // Per questo, dobbiamo impostare il tipo di input su 'html' $ values ​​['input'] = 'html'; // Crea l'elemento select con il nome giusto (corrisponde a quello che wordpress crea per i campi personalizzati) $ html = ''; // Imposta il contenuto html $ values ​​['html'] = $ html; rompere; case 'checkbox': // Il tipo di checkbox non esiste né $ values ​​['input'] = 'html'; // Imposta la casella di spunta o meno se ($ meta == 'on') $ checked = 'checked = "checked"'; else $ checked = "; $ html = ''; $ values ​​['html'] = $ html; break; case 'radio': // il tipo di radio non esiste né $ values ​​['input'] = 'html'; $ html =" ; if (! empty ($ values ​​['options'])) $ i = 0; foreach ($ values ​​['options'] come $ k => $ v) if ($ meta == $ k) $ checked = 'checked = "checked"'; else $ checked = "; $ html. = ' 
'; $ I ++; $ values ​​['html'] = $ html; rompere;

Ora possiamo costruire elementi HTML comuni. Controlliamo il nostro modulo di modifica degli allegati. Dovrebbe assomigliare a questo:


Modulo di modifica allegato con campi personalizzati

I campi personalizzati, a seconda che tu abbia impostato le loro opzioni modali su true o no, appariranno anche nel modulo modale media quando modifichi un post.

Campi personalizzati in modal

Ora i nostri campi sono visualizzati nel nostro modulo di modifica degli allegati, dobbiamo salvarli nel database. Per questo, useremo il secondo gancio.

attachment_fields_to_save

Questo hook ha anche due parametri:

  1. $ postale - schieramento che rappresenta l'entità di attaccamento
  2. $ attacco - contiene tutti i campi allegati al post allegato

Ora, riempiamo la funzione saveFields abbiamo lasciato nella sezione precedente.

 function saveFields ($ post, $ attachment) // Se il nostro array di campi non è vuoto se (! empty ($ this-> media_fields)) // Browser quei campi foreach ($ this-> media_fields come $ campo => $ valori) // Se questo campo è stato inviato (è presente nella variabile $ attachment) if (isset ($ attachment [$ field])) // Se il campo inviato è vuoto // Aggiungiamo errori all'oggetto post con il parametro "error_text" che impostiamo nelle opzioni if ​​(strlen (trim ($ attachment [$ field])) == 0) $ post ['errors'] [$ field] ['errors'] [] = __ ($ values ​​['error_text']); // Altrimenti aggiorniamo il campo personalizzato else update_post_meta ($ post ['ID'], '_'. $ Campo, $ allegato [$ campo]);  // Altrimenti, lo eliminiamo se già esisteva altrove delete_post_meta ($ post ['ID'], $ campo);  return $ post; 

Ok, ora i nostri campi personalizzati sono salvati nel database e saranno disponibili per il front-end.

  • Si prega di fare attenzione quando si manipola il parametro post in entrambi i ganci. È un oggetto nel primo e un schieramento nella seconda.
  • Mancia: il update_post_meta creerà il meta se non esiste.
  • Mancia: Prefixiamo la chiave del campo personalizzato con un trattino basso "_"in modo che non vengano elencati nei metabox dei campi personalizzati nelle pagine di modifica.

Considerazioni sugli errori

A partire dalla versione 3.5, sembra che gli errori non vengano ancora visualizzati nei moduli di modifica degli allegati. Ho provato a indagare il codice di base e, nonostante il fatto che avrebbe dovuto essere risolto (http://core.trac.wordpress.org/ticket/13810), non sembra.

Per il processo di salvataggio ajax, è certo che non è stato ancora fatto come menzionato nel ajax-actions.php file:

 $ errors = $ post ['errors']; // @todo restituiscimi e mostrami!

Quindi, al momento, gli errori non funzioneranno correttamente, ma il codice è fatto in modo che quando questi bug sono corretti, funzionerà.


Fine frontale

Per utilizzare questi campi personalizzati nei tuoi modelli, devi solo recuperare i post metas come faresti per i post normali. Non dimenticare di aggiungere il "_tasti "prefisso ai campi personalizzati".

Ad esempio, potresti fare così:

 eco "
    "; eco "
  • Diritto d'autore: ". get_post_meta (get_the_ID (), '_image_copyright', true)."
  • "; eco "
  • Valutazione: ". get_post_meta (get_the_ID (), '_image_stars', true)."
  • "; eco "
  • Descrizione dell'autore: ". get_post_meta (get_the_ID (), '_image_author_desc', true)."
  • "; eco "
  • Disposizione dell'immagine: ". get_post_meta (get_the_ID (), '_image_disposition', true)."
  • "; eco "
  • Filigrana? ". (get_post_meta (get_the_ID (), '_image_watermark', true) ==" on "?" yes ":" no ")."
  • "; eco "
";
Mostra campi personalizzati sul front-end

Vai oltre

Ci sono diversi punti di miglioramento in base alle tue esigenze:

  • È possibile avere le impostazioni nel database in modo che diventi più flessibile da aggiungere, modificare e rimuovere
  • Si potrebbe avere un valore predefinito che è impostato per tutti i nuovi allegati quando non è impostato un valore
  • È necessario impostare uno stile per il modulo modale in modo che visualizzi correttamente i campi personalizzati

Conclusione

Non esitare a condividere con noi le tue idee su come migliorare questo plugin e cosa ti aspetti da tale funzionalità.