V dnešním tutoriálu si ukážeme, jak vytvořit vlastní metabox. Co jsou vlastně metaboxy? Narazil na ně každý, kdo kdy ve WordPressu vytvářel stránku, nebo článek. Jsou to přesouvatelné boxy, které se nachází v administraci, při vytváření článku, nebo stránky. Všechny akce, které děláte při ukládání článku, přidávání náhledového obrázku, nebo zařazení do kategorie, děláte v jednom z metaboxů.
Metaboxy v administraci
Jak můžete vidět, na obrázku jsou dva metaboxy, jeden v umístění Advanced, to je Custom Fields a potom umístění Side – Page Attributes.
Do těchto metaboxů pak můžete vkládat různé prvky, které vám pomohou vytvářet vlastní nastavení. Může se v podstatě jednat o jakékoliv funkce, my si dnes ukážeme. jak vytvořit metabox, jenž z textového pole formuláře, uloží zadanou hodnotu do post meta.
Post meta, jsou informace ukládané do databáze, společně s id obsahu, ke kterému patří. Řekněme, že budeme mít o automobilech. Každou značku pak budeme chtít v šabloně odlišit a zobrazit její logo. Vytvoříme si post meta s názvem „znacka“ a u každého článku budeme mít možnost vložit informaci o značce.
Vytvoření metaboxu
Možná se to na první pohled zdá složité, ale ve skutečnosti už vývojáři WordPressu udělali většinu práce za vás a máte k dispozici funkci add_meta_box, pomocí níž jednoduše metabox vytvoříme.
function pridani_znacky_box() { add_meta_box( 'muj_metabox_znacka', __('Informace o vozidle','textdomain'), 'funkce_zobrazeni_metaboxu', 'post', 'side', 'default' ); }
Id metaboxu – muj_metabox_znacka, html id metaboxu.
Titulek metaboxu – Informace o vozidle, titulek, který se bude zobrazovat v horní části metaboxu.
Funkce pro obrazení metaboxu – funkce_zobrazeni_metaboxu, funkce, která se postará o vykreslení metaboxu.
Druh obsahu – post, typ obsahu, kde se bude metabox zobrazovat. Díky tomu můžete vytvořit i metabox, který se bude zobrazovat jen na custom post type, nebo jen u článků. V našem případě to jsou články.
Umístění metaboxu – side, určuje, kde se bude metabox zobrazovat.
Priority – default, určuje prioritu metaboxu, v našem případě jsme ji nechali na default.
Celá funkce add_meta_box je uvnitř funkce pridani_znacky_box, protože musíme WordPressu říci, že má metabox zaregistrovat a proto pomocí akce add_meta_boxes zavoláme funkci pridani_znacky_box. Tím se přiřadí add_meta_box k ostatním metaboxům a při zobrazení administrace se zobrazí také.
Jako poslední vytvoříme funkci, pro zobrazení obsahu metaboxu.
function funkce_zobrazeni_metaboxu( $post ) { wp_nonce_field( basename( __FILE__ ), 'znacka_vozu_post_class_nonce' ); ?>
Pomocí wp_nonce_field přidáme skrytá pole, pro kontrolu autorizace. Je to z bezpečnostních důvodů, protože tak můžeme určit, zda byla post hodnota skutečně odeslána z aktuální stránky.
Funkce get_post_meta ve value inputu se stará o zobrazení již uložené hodnoty, protože, pokud bude pole prázdné, dojde při uložení článku k přepsání hodnoty.
Výsledek je vidět zde:
Uložení hodnot
Vytvoříme si funkci, pro uložení hodnoty z metaboxu:
function znacka_save_post_meta( $post_id, $post ){ if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; if ( !isset( $_POST['znacka_vozu_post_class_nonce'] ) || !wp_verify_nonce( $_POST['znacka_vozu_post_class_nonce'], basename( __FILE__ ) ) ) return $post_id; $new_meta_value = ( isset( $_POST['znacka_vozu'] ) ? sanitize_html_class( $_POST['znacka_vozu'] ) : '' ); update_post_meta( $post_id, 'znacka_vozu', $new_meta_value ); }
Nejprve zkontrolujeme, zda se jedná o automatické uložení článku. Protože jsme článek neukládali, není potřeba měnit hodnotu post_meta.
Při zobrazení metaboxu jsme vytvořili nonce field a zde zkontrolujeme, zda nonce existuje a zda odpovídá správné hodnotě. Pokud ne, nebudeme nic ukládat.
Do proměnné $new_meta_value vložíme po sanitování hodnotu odeslanou z formuláře. Měli bychom vždy sanitovat textová pole, protože nemůžeme vědět, zda někdo nevkládá škodlivý kód.
Jako poslední uložíme post meta. Funkce update_post_meta kontroluje, zda již hodnota existuje a pokud ne, vytvoří ji. Nemusíme tedy používat add_post_meta.
Funkci máme hotovou a musíme ji zaregistrovat do akce save_post, což znamená, že vždy, když budeme článek ukládat, provede se i tato funkce:
add_action( 'save_post', 'znacka_save_post_meta', 10, 2 );
Pokud tedy nyní vložíte do formuláře značku vozu a uložíte článek, bude se vám v metaboxu zobrazovat uložená hodnota.
Závěr
V tuto chvíli máte u článku možnost přidat post_meta s názvem znacka_vozu. To vám dává možnost pomocí podmínky v šabloně kontrolovat hodnotu meta a nabídnout uživateli pro každou značku jiné logo vozu.
Dobry den,
jak vypisu hodnotu tohoto svého pole v šabloně?
Echo get_post_meta($post->ID, ‚nazevpole‘,true);
Pokud je uvedeno true, bude vrácen řetězec, pokud ne, bude to pole.
Má takový zvláštní problém.
Metaboxy používám a fungují skvěle ne však když chci pracovat s obrázky.
Když nahraju obrázky a nechám zobrazit obsah the_meta();
ukáže to
fotecky: 106, 105, 104
což je správně
když však zobrazím obsah get_post_meta($post->ID, ‚fotecky‘, true)
ukáže to jen 106
jak je to možné?
Vyřešeno.
true vracel podivný string
po změně na false už lze pracovat s polem