Cum se afișează metaboxele în funcție de formatul postului curent

Astăzi aș vrea să vă arăt cum să mergeți mai departe cu metaboxurile personalizate și în special cum să le folosiți în funcție de formatele postale.

Nu vom acoperi cum să construim metaboxuri personalizate reutilizabile, deoarece acestea au fost deja acoperite într-un subiect anterior, deci vă rugăm să consultați acest articol dacă aveți probleme cu acest lucru.


Introducere

Mai intai, daca nu ai mai auzit niciodata despre acestea, formatele postate iti permit sa afisezi o postare in mai multe moduri, in functie de "formatul" postului pe care l-ai setat (imagine, link, galerie etc.).

Pentru a vă asigura că tema dvs. este "formate postate" - deja, verificați dacă acceptă diferite formate căutând această funcție:

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

Acum, cu acest exemplu, veți putea utiliza două formate postale: "link" și "quote".

Ideea este de a afișa un metabox numai dacă este bifat butonul radio corect. Pentru aceasta, vom folosi cârlige (PHP) și jQuery (JavaScript).


Pasul 1 Adăugarea metaboxelor personalizate

Vom defini o serie de metaboxi care se aplică numai pentru postări (îl puteți scrie în interiorul functions.php fișier al temei dvs.). Există diferite opțiuni implicite (locație, prioritate) pe care nu ne vom concentra (verificați din nou articolul despre metaboxuri personalizate reutilizabile).

Definiți metaboxele

Pe lângă câmpuri definim, ceea ce este important de notat în codul de mai jos este display_condition care va fi utilizată pentru a afișa / ascunde metaboxele în funcție de formatul postului curent. Se potrivește cu ID-ul butonului radio al postului.

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

Pentru acest tutorial, vom adăuga doar o intrare de bază pentru fiecare metabox. Asigurați-vă că verificați cheia de câmp este unică sau nu va funcționa corect.

Acum vom crea trei funcții pentru adăugarea, actualizarea / salvarea și afișarea metaboxelor.

Creați metaboxuri

 add_action ('admin_init', 'add_post_format_metabox'); funcția add_post_format_metabox () global $ metaboxes; dacă empty $ metaboxes)) foreach ($ metaboxes ca $ id => $ metabox) add_meta_box ($ id, $ metabox ['title'], 'metaboxes', $ metabox ['locație'], $ metabox ['prioritate'], $ id); 

În principiu, folosim doar opțiunile definite anterior pentru a adăuga aceste metaboxe.

Afișați metaboxele

 funcția show_metaboxes ($ post, $ args) global $ metaboxes; $ custom = get_post_custom ($ post-> ID); $ fields = $ tabs = $ metaboxes [$ args ['id']] ['câmpuri']; / ** Nonce ** / $ output = '„; dacă sizeof (câmpurile $)) foreach (câmpurile $ ca $ id => $ field) comutare (câmpul $ ['type']) default:„; pauză;  echo $ output; 

Până în prezent, aceasta este ceea ce ar trebui să avem pe un nou ecran post admin:

Salvați metaboxele

 add_action ('save_post', 'save_metaboxes'); funcția save_metaboxes ($ post_id) global $ metaboxes; // verificați nonce dacă (! wp_verify_nonce ($ _POST ['post_format_meta_box_nonce'], bazename (__FILE__)) returnează $ post_id; // verificați salvarea automată dacă (definit ('DOING_AUTOSAVE') && DOING_AUTOSAVE) returnați $ post_id; // verificați permisiunile dacă ('page' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) returnează $ post_id;  elseif (! current_user_can ('edit_post', $ post_id)) returnați $ post_id;  $ post_type = get_post_type (); // se citește prin câmpuri și se salvează datele foreach ($ metaboxes ca $ id => $ metabox) // verificați dacă metabox este aplicabil tipului curent de post dacă ($ metabox ['applicableto'] == $ post_type) câmpuri $ = $ metaboxuri [$ id] ['câmpuri']; foreach (câmpurile $ ca $ id => câmp $) $ old = get_post_meta ($ post_id, $ id, true); $ new = $ _POST [$ id]; dacă ($ new && $ new! = $ old) update_post_meta ($ post_id, $ id, $ new);  elseif ("== $ new && $ vechi ||! isset ($ _POST [$ id])) delete_post_meta ($ post_id, $ id, $ old);

Bine, acum suntem pregătiți și putem adăuga și actualiza metode postate pentru fiecare articol și le afișăm în metaboxuri. Putem acum să ne grăbiți problema: afișați metaboxul corect pentru a se potrivi cu formatul postului curent.


Pasul 2 Afișați metaboxul corect la ora corectă

Pentru aceasta, vom folosi jQuery pentru a gestiona evenimentele de afișare, ascundere și schimbare radio.

Pentru a adăuga JavaScript inline doar în secțiunea de administrare, putem folosi acest cârlig de acțiune:

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

Prioritatea este setată la 1000 pentru a se asigura că jQuery a fost încărcat mai întâi.

Am putea stabili un cârlig mai precis, cum ar fi admin_print_scripts-post sau admin_print_scripts-post-nou, dar din anumite motive, dacă facem acest lucru, jQuery este chemat după ce scriptul nostru este tipărit.

În plus, dacă adăugăm formate postate la tipuri personalizate de postări, nu ar fi foarte convenabil să adăugăm toate configurațiile posibile.

Ceea ce vom face este să construim (prin PHP) un șir JavaScript care conține o listă de ID-uri (cheia de câmp văzută mai sus) separate cu o virgulă. Acesta va fi folosit pentru a ascunde toate metabox-urile, dar cel care corespunde formatului postului curent.

De asemenea, vom construi (încă prin PHP) un obiect JavaScript pe care îl vom folosi pentru a lega ID-ul butonului radio al unui post de format pe un ID metabox.

 funcția display_metaboxes () global $ metaboxes; dacă (get_post_type () == "post"):?>   

Și voila! Acum puteți schimba formatele postate înainte și înapoi și veți avea mereu metaboxul corect afișat.


Concluzie

Formatele postate pot fi foarte utile pentru a personaliza aspectul oricărui tip de post și pentru a afișa metaboxele în consecință, este o modalitate foarte bună de a îmbunătăți ușurința în utilizare.

În plus, economisește spațiu pe un ecran de administrare deja bine confundat. Cu puțin mai multe CSS și mai multe câmpuri, puteți îmbunătăți cu adevărat modul în care scrieți mesaje și obțineți o interfață cu adevărat intuitivă.

Cod