Hvordan vise metaboxer i henhold til gjeldende innleggformat

I dag vil jeg gjerne vise deg hvordan du går videre med tilpassede metaboxer og spesifikt hvordan du bruker dem i henhold til innleggformater.

Vi vil ikke dekke hvordan du bygger gjenbrukbare tilpassede metaboxer som det allerede er dekket i et tidligere emne, så vennligst se denne artikkelen hvis du har problemer med dette.


Introduksjon

Første ting først, hvis du aldri har hørt om dem før, kan postformater vise deg et innlegg på mange måter, avhengig av hvilket format du har satt inn (bilde, lenke, galleri etc.).

For å være sikker på at temaet ditt er "postformater", må du kontrollere at det aksepterer forskjellige formater ved å lete etter denne funksjonen:

 add_theme_support ('postformater', array ('link', 'quote'));

Nå med dette eksempelet, kan du bruke to innleggsformater: 'link' og 'quote'.

Tanken er bare å vise en metaboks hvis den riktige postformatknappen er merket. For dette skal vi bruke kroker (PHP) og jQuery (JavaScript).


Trinn 1 Legge til tilpassede metaboxer

Vi definerer en rekke metaboxer som kun gjelder for innlegg (du kan skrive det inn i functions.php fil av temaet ditt). Det finnes forskjellige standardalternativer (plassering, prioritet) vi vil ikke fokusere på (igjen sjekk artikkelen om gjenbrukbare tilpassede metaboxer).

Definer metaboxer

Ved siden av Enger Vi definerer, det som er viktig å merke seg i koden under er display_condition variabel som vil bli brukt til å vise / skjule metaboxer i henhold til gjeldende postformat. Den samsvarer med postformatknappens ID.

 $ metaboxer = array ('link_url' => array ('title' => __ ('lenkeinformasjon', 'twentyeleven'), 'applicableto' => 'innlegg', 'location' => 'normal', 'display_condition' => 'post-format-link', 'prioritet' => 'lav', 'felt' => array ('l_url' => array ('title' => __ ('link URL:', 'twentyeleven') , 'type' => 'tekst', 'beskrivelse' => ", 'size' => 60))) 'quote_author' => array ('title' => __ ('sitatforfatter', 'tjuefem') , 'applicableto' => 'post', 'location' => 'normal', 'display_condition' => 'postformat-sitat', 'prioritet' => 'lavt', 'felt' => array '=> array (' title '=> __ (' sitat forfatter: ',' twentyeleven '),' type '=>' tekst ',' beskrivelse '=> ",' size '=> 20)))));

For denne opplæringen legger vi bare til en grunnleggende tekstinnføring for hver metaboks. Husk å sjekke feltnøkkelen er unik eller det vil ikke fungere riktig.

Nå lager vi tre funksjoner for å legge til, oppdatere / lagre og vise metaboxene.

Lag metaboxer

 add_action ('admin_init', 'add_post_format_metabox'); funksjon add_post_format_metabox () global $ metaboxes; $ tom ['plassering'], $ metabox ['prioritet'], $ id); 

I utgangspunktet bruker vi bare våre tidligere definerte alternativer for å legge til disse metaboxene.

Vis metaboxer

 funksjon show_metaboxes ($ post, $ args) global $ metaboxes; $ custom = get_post_custom ($ post-> ID); $ felt = $ tabs = $ metaboxer [$ args ['id']] ['felt']; / ** Nonce ** / $ output = ''; hvis sizeof ($ field)) foreach ($ felt som $ id => $ felt) switch ($ field ['type']) default: case "text": $ output. = ''; gå i stykker;  ekko $ output; 

Så langt er dette det vi burde ha på et nytt innlegg admin skjermbilde:

Lagre metaboxer

 add_action ('save_post', 'save_metaboxes'); funksjon save_metaboxes ($ post_id) global $ metaboxes; // bekreft ikke hvis (! wp_verify_nonce ($ _POST ['post_format_meta_box_nonce'], basenavn (__FILE__)) returnere $ post_id; // Sjekk autosave hvis (definert ('DOING_AUTOSAVE') && DOING_AUTOSAVE) returnere $ post_id; // sjekk tillatelser hvis ('side' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) returnere $ post_id;  elseif (! current_user_can ('edit_post', $ post_id)) return $ post_id;  $ post_type = get_post_type (); // loop gjennom felt og lagre data foreach ($ metaboxer som $ id => $ metabox) // sjekk om metabox er aktuelt for gjeldende posttype hvis ($ metabox ['applicableto'] == $ post_type) $ felt = $ metaboxer [$ id] ['felt']; foreach ($ felt som $ id => $ felt) $ old = get_post_meta ($ post_id, $ id, true); $ new = $ _POST [$ id]; hvis ($ ny && $ ny! = $ gammel) update_post_meta ($ post_id, $ id, $ new);  elseif ("== $ ny && $ old ||! isset ($ _POST [$ id])) delete_post_meta ($ post_id, $ id, $ old);

Ok, nå er vi alle sammen og kan legge til og oppdatere postmetoder til hver artikkel og vise dem i metaboxene. Vi kan nå grave inn i vårt problem: vis riktig metaboks for å matche det nåværende innleggformatet.


Trinn 2 Vis riktig metaboks på riktig tidspunkt

For dette vil vi bruke jQuery å håndtere show, skjul og radio endre hendelser.

For å legge til bare inline JavaScript i administrasjonen, kan vi bruke denne handlingen krok:

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

Prioriteten er satt til 1000 for å sikre at jQuery er lastet først.

Vi kunne sette en mer presis krok som admin_print_scripts-post eller admin_print_scripts-post-nytt, men av en eller annen grunn kalles jQuery etter at skriptet er skrevet ut.

Pluss, hvis vi skulle legge til postformater til egendefinerte innleggstyper, ville det ikke være veldig praktisk å legge til alle mulige konfigurasjoner.

Hva vi skal gjøre er å bygge (via PHP) en JavaScript-streng som inneholder en liste over ID-er (feltnøkkelen sett over) skilt med komma. Det vil bli brukt til å skjule alle metaboxer, men den som samsvarer med det nåværende innleggformatet.

Vi skal også bygge (fremdeles via PHP) et JavaScript-objekt som vi skal bruke til å binde en postformat-radioknapps ID til en metaboks ID.

 funksjon display_metaboxes () global $ metaboxes; hvis (get_post_type () == "post"):?>   

Og voila! Nå kan du bytte innleggformater frem og tilbake, og du vil alltid ha riktig metaboks vist.


Konklusjon

Postformater kan være svært nyttig for å tilpasse utformingen av noen form for innlegg og vise metaboxer. Det er derfor en fin måte å forbedre brukervennlighet på..

Pluss det sparer plass på en allerede godt rotete admin skjerm. Med litt mer CSS og flere felt kan du virkelig forbedre måten du skriver innlegg på og få et veldig intuitivt grensesnitt.