Hur man visar metaboxer enligt det aktuella inlägget

Idag vill jag visa dig hur man går vidare med anpassade metaboxer och specifikt hur man använder dem enligt postformat.

Vi kommer inte att täcka hur man bygger återanvändbara anpassade metaboxer eftersom det redan har täcks i ett föregående ämne, så hänvisa till den här artikeln om du har några problem med detta.


Introduktion

Första saker först, om du aldrig har hört talas om dem tidigare, kan postformat visa dig ett inlägg på många sätt beroende på vilket format du har angett (bild, länk, galleri etc.).

För att vara säker på att ditt tema är "postformat" -revisat, kontrollera att det accepterar olika format genom att leta efter den här funktionen:

 add_theme_support ('postformat', array ('länk', 'citat'));

Nu med det här exemplet kan du använda två postformat: "länk" och "citat".

Tanken är att bara visa en metabox om den rätta postformatknappen är markerad. För detta ska vi använda krokar (PHP) och jQuery (JavaScript).


Steg 1 Lägga till anpassade metaboxer

Vi definierar en rad metaboxer som endast gäller för inlägg (du kan skriva det inuti functions.php fil av ditt tema). Det finns olika standardalternativ (plats, prioritet) vi kommer inte fokusera på (återigen kontrollera artikeln om återanvändbara anpassade metaboxer).

Definiera metaboxer

Förutom fält Vi definierar, vad som är viktigt att notera i koden nedan är display_condition variabel som kommer att användas för att visa / dölja metaboxer enligt det aktuella postformatet. Den matchar knappens ID för postformatet.

 $ metaboxer = array ('link_url' => array ('title' => __ ('länkinformation', 'twentyeleven'), 'applicableto' => 'inlägg', 'plats' => 'normal', 'display_condition' => 'postformat-länk', 'prioritet' => 'låg', 'fält' => array ('l_url' => array ('title' => __ ('länkadress:', 'tjugo tjugo') , 'typ' => 'text', 'beskrivning' => ", 'storlek' => 60))), 'quote_author' => array ('title' => __ ('citat författare', 'tjugo tjugo') , 'applicableto' => 'post', 'location' => 'normal', 'display_condition' => 'postformat-citat', 'prioritet' => 'låg', 'fält' => array ('q_author '=> array (' title '=> __ (' citat författare: ',' twentyeleven '),' typ '=>' text ',' description '=> ",' size '=> 20)))

För denna handledning lägger vi bara till en grundläggande textinmatning för varje metabox. Var noga med att kolla Fältnyckeln är unik eller det fungerar inte ordentligt.

Nu skapar vi tre funktioner för att lägga till, uppdatera / spara och visa metaboxerna.

Skapa metaboxer

 add_action ('admin_init', 'add_post_format_metabox'); funktion add_post_format_metabox () global $ metaboxes; empty ($ metabox)) ['location'], $ metabox ['priority'], $ id); 

I grund och botten använder vi bara våra tidigare definierade alternativ för att lägga till dessa metaboxer.

Visa metaboxer

 funktion show_metaboxes ($ post, $ args) global $ metaboxes; $ custom = get_post_custom ($ post-> ID); $ fält = $ flikar = $ metaboxer [$ args ['id']] ['fält']; / ** Nonce ** / $ output = ''; $ field $ field default case text $ id => $ field switch'; ha sönder;  echo $ output; 

Hittills är detta vad vi borde ha på en ny postadministratörsskärm:

Spara metaboxer

 add_action ('save_post', 'save_metaboxes'); funktion save_metaboxes ($ post_id) global $ metaboxes; // verifiera nonce om (! wp_verify_nonce ($ _POST ['post_format_meta_box_nonce'], basnamn (__FILE__))) returnera $ post_id; // kontrollera autosave om (definierad ('DOING_AUTOSAVE') && DOING_AUTOSAVE) returnera $ post_id; // kontrollera behörigheter om ('sida' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) returnera $ post_id;  elseif (! current_user_can ('edit_post', $ post_id)) return $ post_id;  $ post_type = get_post_type (); // loop genom fält och spara data foreach ($ metaboxer som $ id => $ metabox) // kolla om metabox är tillämplig för aktuell posttyp om ($ metabox ['applicableto'] == $ post_type) $ fält = $ metaboxer [$ id] ['fält']; foreach ($ fält som $ id => $ fält) $ old = get_post_meta ($ post_id, $ id, true); $ new = $ _POST [$ id]; om ($ new && $ new! = $ old) update_post_meta ($ post_id, $ id, $ new);  elseif ("== $ ny && $ old ||! isset ($ _POST [$ id])) delete_post_meta ($ post_id, $ id, $ old);

Okej, nu är vi alla klara och kan lägga till och uppdatera postmetoder till varje artikel och visa dem i metaboxerna. Vi kan nu gräva in i vårt problem: visa rätt metabox för att matcha det aktuella postformatet.


Steg 2 Visa rätt metabox vid rätt tid

För detta kommer vi att använda jQuery för att hantera show, hide and radio change events.

Om du bara vill lägga till inline JavaScript i administrativ avsnitt kan vi använda den här handlingen krok:

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

Prioriteten är inställd till 1000 för att säkerställa att jQuery har laddats först.

Vi kunde ställa en mer exakt krok som admin_print_scripts-inlägget eller admin_print_scripts-post-nytt, men av en eller annan anledning kallas jQuery efter det att vårt manus skrivs ut.

Dessutom skulle det inte vara väldigt bekvämt att lägga till alla möjliga konfigurationer om vi skulle lägga till inläggsformat till anpassade posttyper.

Vad vi ska göra är att bygga (via PHP) en JavaScript-sträng som innehåller en lista med ID-skivor (fältnyckeln ovan) separerad med ett komma. Den kommer att användas för att dölja alla metaboxer men den som matchar det aktuella postformatet.

Vi kommer också att bygga (fortfarande via PHP) ett JavaScript-objekt som vi ska använda för att binda ett radioformat ID för en postformat till en metabox ID.

 funktion display_metaboxes () global $ metaboxes; om (get_post_type () == "post"):?>   

Och voila! Nu kan du byta postformat fram och tillbaka och du får alltid rätt metabox som visas.


Slutsats

Postformat kan vara mycket praktiskt att anpassa layouten av någon form av inlägg och visa metaboxer är ett bra sätt att förbättra användarvänligheten.

Plus det sparar utrymme på en redan väl rotad admin skärm. Med lite mer CSS och flera fält kan du verkligen förbättra hur du skriver inlägg och få ett riktigt intuitivt gränssnitt.