Come visualizzare i metabox in base al formato attuale del post

Oggi vorrei mostrarti come andare oltre con i metabox personalizzati e in particolare come usarli in base ai formati dei post.

Non copriremo come costruire metabox personalizzati riutilizzabili poiché è già stato trattato in un argomento precedente, quindi per favore fai riferimento a questo articolo se hai problemi con questo.


introduzione

Per prima cosa, se non ne hai mai sentito parlare prima, i formati dei post ti consentono di visualizzare un post in molti modi, a seconda del "formato" di post che hai impostato (immagine, link, galleria ecc.).

Per assicurarti che il tema sia "post formati", verifica che accetti formati diversi cercando questa funzione:

 add_theme_support ('post-formati', array ('link', 'quote'));

Ora con questo esempio, sarai in grado di utilizzare due formati di post: "link" e "quote".

L'idea è di visualizzare un metabox solo se è stato selezionato il pulsante di scelta del formato post corretto. Per questo, useremo hook (PHP) e jQuery (JavaScript).


Passaggio 1 Aggiunta di metabox personalizzati

Definiremo una serie di metabox applicabili solo ai post (puoi scriverli all'interno di functions.php file del tuo tema). Ci sono diverse opzioni di default (posizione, priorità) su cui non ci concentreremo (controlla di nuovo l'articolo sui metabox personalizzati riutilizzabili).

Definisci Metabox

oltre al i campi stiamo definendo, ciò che è importante notare nel codice qui sotto è il display_condition variabile che verrà utilizzata per mostrare / nascondere i metabox in base al formato corrente del post. Corrisponde all'ID del pulsante di opzione formato post.

 $ metaboxes = array ('link_url' => array ('title' => __ ('link information', 'twentyeleven'), 'applicableto' => 'post', 'location' => 'normal', 'display_condition' => 'post-format-link', 'priority' => 'low', 'fields' => array ('l_url' => array ('title' => __ ('link url:', 'twentyeleven') , 'type' => 'text', 'description' => ", 'size' => 60))), 'quote_author' => array ('title' => __ ('quote author', 'twentyeleven') , 'applicableto' => 'post', 'location' => 'normal', 'display_condition' => 'post-format-quote', 'priority' => 'low', 'fields' => array ('q_author '=> array (' title '=> __ (' quote author: ',' twentyeleven '),' type '=>' text ',' description '=> ",' size '=> 20))));

Per questo tutorial, aggiungeremo solo un input di testo di base per ogni metabox. Assicurati di controllare la chiave del campo è unica o non funzionerà correttamente.

Ora creeremo tre funzioni per aggiungere, aggiornare / salvare e mostrare i metabox.

Crea Metaboxes

 add_action ('admin_init', 'add_post_format_metabox'); function add_post_format_metabox () global $ metaboxes; if (! empty ($ metaboxes)) foreach ($ metaboxes come $ id => $ metabox) add_meta_box ($ id, $ metabox ['title'], 'show_metaboxes', $ metabox ['applicableto'], $ metabox ['location'], $ metabox ['priority'], $ id); 

Fondamentalmente, stiamo solo usando le nostre opzioni precedentemente definite per aggiungere questi metabox.

Mostra Metaboxes

 function show_metaboxes ($ post, $ args) global $ metaboxes; $ personalizzato = get_post_custom ($ post-> ID); $ fields = $ tabs = $ metaboxes [$ args ['id']] ['campi']; / ** Nonce ** / $ output = ''; if (sizeof ($ fields)) foreach ($ campi come $ id => $ campo) interruttore ($ campo ['tipo']) predefinito: caso "testo": $ output. = ''; rompere;  echo $ output; 

Finora, questo è quello che dovremmo avere su una nuova schermata di amministrazione post:

Salva Metaboxes

 add_action ('save_post', 'save_metaboxes'); function save_metaboxes ($ post_id) global $ metaboxes; // verifica nonce if (! wp_verify_nonce ($ _POST ['post_format_meta_box_nonce'], basename (__FILE__))) restituisce $ post_id; // controlla il salvataggio automatico se (definito ('DOING_AUTOSAVE') && DOING_AUTOSAVE) restituisce $ post_id; // controlla i permessi se ('page' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) restituisce $ post_id;  elseif (! current_user_can ('edit_post', $ post_id)) return $ post_id;  $ post_type = get_post_type (); // passa attraverso i campi e salva i dati foreach ($ metaboxes come $ id => $ metabox) // controlla se il metabox è applicabile per il tipo di post corrente se ($ metabox ['applicableto'] == $ post_type) $ fields = $ metaboxes [$ id] ['fields']; foreach ($ campi come $ id => $ campo) $ vecchio = get_post_meta ($ post_id, $ id, vero); $ nuovo = $ _POST [$ id]; se ($ nuovo && $ nuovo! = $ vecchio) update_post_meta ($ post_id, $ id, $ nuovo);  elseif ("== $ nuovo && $ vecchio ||! isset ($ _POST [$ id])) delete_post_meta ($ post_id, $ id, $ vecchio);

Ok, ora siamo a posto e siamo in grado di aggiungere e aggiornare i metati post a ciascun articolo e mostrarli all'interno dei metabox. Ora possiamo esaminare il nostro problema: visualizzare il corretto metabox in modo che corrisponda al formato del post corrente.


Passaggio 2 Visualizzare il Metabox corretto al momento giusto

Per questo, useremo jQuery per gestire gli eventi show, hide e radio change.

Per aggiungere JavaScript in linea solo nella sezione di amministrazione, possiamo usare questo hook di azione:

 add_action ('admin_print_scripts', 'display_metaboxes', 1000);

La priorità è impostata su 1000 per assicurarsi che jQuery sia stato caricato per primo.

Potremmo impostare un hook più preciso come admin_print_scripts-post o admin_print_scripts-post-new, ma per qualche ragione, se così facendo, jQuery viene chiamato dopo che il nostro script è stato stampato.

Inoltre, se dovessimo aggiungere formati di post a tipi di post personalizzati, non sarebbe molto comodo aggiungere tutte le possibili configurazioni.

Quello che faremo è costruire (tramite PHP) una stringa JavaScript contenente una lista di ID (la chiave di campo vista sopra) separata da una virgola. Verrà utilizzato per nascondere tutti i metabox, ma quello corrispondente al formato corrente del post.

Stiamo anche costruendo (sempre tramite PHP) un oggetto JavaScript che utilizzeremo per associare un ID di un pulsante di opzione post formato all'ID di un metabox.

 function display_metaboxes () global $ metaboxes; if (get_post_type () == "post"):?>   

E voilà! Ora puoi cambiare i formati dei post avanti e indietro e avrai sempre il giusto metabox visualizzato.


Conclusione

I formati dei post possono essere molto utili per personalizzare il layout di qualsiasi tipo di post e visualizzare i metabox di conseguenza è un ottimo modo per migliorare la facilità d'uso.

Inoltre consente di risparmiare spazio su una schermata di amministrazione già ben ingombra. Con un po 'più di CSS e diversi campi, puoi davvero migliorare il modo di scrivere post e ottenere un'interfaccia davvero intuitiva.