Vandaag wil ik je laten zien hoe je verder kunt gaan met aangepaste metaboxen en specifiek hoe je ze kunt gebruiken volgens postformaten.
We bespreken niet hoe we herbruikbare aangepaste metaboxen kunnen maken, omdat dit al in een vorig onderwerp is behandeld. Raadpleeg dit artikel als u hier problemen mee heeft..
Allereerst, als je nog nooit van hen hebt gehoord, kun je met postformaten een bericht op verschillende manieren weergeven, afhankelijk van het "formaat" van de post die je hebt ingesteld (afbeelding, link, galerij, enz.).
Om er zeker van te zijn dat je thema "postformaten" is, controleer je of het een ander formaat accepteert door naar deze functie te zoeken:
add_theme_support ('post-formats', array ('link', 'quote'));
In dit voorbeeld kunt u nu twee postformaten gebruiken: 'link' en 'quote'.
Het idee is om een metabox alleen weer te geven als het juiste keuzerondje voor het postformaat is aangevinkt. Hiervoor gebruiken we hooks (PHP) en jQuery (JavaScript).
We definiëren een reeks metaboxen die alleen van toepassing zijn op berichten (u kunt deze in de map schrijven functions.php bestand van uw thema). Er zijn verschillende standaardopties (locatie, prioriteit) waar we ons niet op zullen concentreren (bekijk nogmaals het artikel over herbruikbare aangepaste metaboxen).
naast de velden we definiëren, wat belangrijk is om op te merken in de onderstaande code is de display_condition
variabele die zal worden gebruikt om metaboxen te tonen / verbergen volgens het huidige berichtformaat. Het komt overeen met de ID van het berichtformaat.
$ 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' => 'normaal', 'display_condition' => 'post-format-quote', 'priority' => 'low', 'fields' => array ('q_author '=> array (' title '=> __ (' quote author: ',' twentyeleven '),' type '=>' text ',' description '=> ",' size '=> 20))));
Voor deze zelfstudie voegen we alleen een basistekstinvoer toe voor elke metabox. Controleer het zeker de veldsleutel is uniek of het zal niet goed werken.
Nu maken we drie functies om de metaboxen toe te voegen, bij te werken / op te slaan en weer te geven.
add_action ('admin_init', 'add_post_format_metabox'); functie add_post_format_metabox () global $ metaboxes; if (! empty ($ metaboxes)) foreach ($ metaboxes as $ id => $ metabox) add_meta_box ($ id, $ metabox ['title'], 'show_metaboxes', $ metabox ['applicableto'], $ metabox ['locatie'], $ metabox ['prioriteit'], $ id);
In principe gebruiken we alleen onze eerder gedefinieerde opties om deze metaboxen toe te voegen.
functie show_metaboxes ($ post, $ args) global $ metaboxes; $ custom = get_post_custom ($ post-> ID); $ fields = $ tabs = $ metaboxes [$ args ['id']] ['fields']; / ** Nonce ** / $ output = ''; if (sizeof ($ fields)) foreach ($ fields as $ id => $ field) switch ($ field ['type']) default: case "text": $ output. = ''; breken; echo $ uitvoer;
Tot nu toe is dit wat we zouden moeten hebben op een nieuw scherm voor post-beheerders:
add_action ('save_post', 'save_metaboxes'); function save_metaboxes ($ post_id) global $ metaboxes; // verifieer nonce als (! wp_verify_nonce ($ _POST ['post_format_meta_box_nonce'], basename (__FILE__))) $ post_id retourneert; // schakel automatisch opslaan in als (define ('DOING_AUTOSAVE') && DOING_AUTOSAVE) $ post_id retourneert; // controleer machtigingen als ('page' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) $ post_id retourneert; elseif (! current_user_can ('edit_post', $ post_id)) return $ post_id; $ post_type = get_post_type (); // doorloop velden en bewaar de gegevens voor elke ($ metaboxen als $ id => $ metabox) // controleer of metabox van toepassing is voor het huidige berichttype if ($ metabox ['applicableto'] == $ post_type) $ velden = $ metaboxen [$ id] ['velden']; foreach ($ velden als $ id => $ veld) $ oud = get_post_meta ($ post_id, $ id, true); $ new = $ _POST [$ id]; if ($ nieuw && $ nieuw! = $ oud) update_post_meta ($ post_id, $ id, $ nieuw); elseif ("== $ new && $ old ||! isset ($ _POST [$ id])) delete_post_meta ($ post_id, $ id, $ old);
Ok, nu zijn we helemaal klaar en kunnen postmeta's aan elk artikel toevoegen en bijwerken en ze weergeven in metaboxen. We kunnen nu ingaan op ons probleem: de juiste metabox weergeven voor het huidige postformaat.
Hiervoor zullen we gebruiken jQuery om show-, hide- en radio-change-events af te handelen.
Om inline JavaScript alleen in het admin-gedeelte toe te voegen, kunnen we deze actiehaak gebruiken:
add_action ('admin_print_scripts', 'display_metaboxes', 1000);
De prioriteit is ingesteld op 1000 om te zorgen dat jQuery eerst is geladen.
We kunnen een meer precieze haak plaatsen zoals admin_print_scripts achteraf
of admin_print_scripts-post-new
, maar om een of andere reden wordt jQuery aangeroepen als ons script is afgedrukt.
Plus, als we postformaten zouden toevoegen aan aangepaste berichttypen, zou het niet erg handig zijn om alle mogelijke configuraties toe te voegen.
Wat we zullen doen is het bouwen (via PHP) van een JavaScript-string met een lijst met ID's (de hierboven getoonde veldsleutel) gescheiden door een komma. Het zal worden gebruikt om alle metaboxen te verbergen, maar degene die overeenkomt met het huidige postformaat.
We gaan ook een JavaScript-object bouwen (nog steeds via PHP) dat we gebruiken om de ID van een post-format voor de radioknop te koppelen aan de ID van een metabox.
function display_metaboxes () global $ metaboxes; if (get_post_type () == "post"):?>En voila! Nu kunt u heen en weer schakelen tussen postformaten en u krijgt altijd de juiste metabox weergegeven.
Conclusie
Postformaten kunnen erg handig zijn om de lay-out van elke post te personaliseren en het weergeven van metaboxen is daarom een geweldige manier om de gebruiksvriendelijkheid te verbeteren.
Bovendien bespaart het ruimte op een al behoorlijk rommelig beheerdersscherm. Met een beetje meer CSS en verschillende velden, kun je de manier waarop je berichten schrijft echt verbeteren en een echt intuïtieve interface krijgen.