WordPress – tvorba šablony od A do Z – 13.díl – Práce s templaty


V dnešním díle se trochu podíváme na to, jak WordPress includuje jednotlivé soubory a jak s tím můžeme pracovat právě my. Dnešní díl našeho seriálu bude trochu o samotné struktuře WordPressu. Kompletní dokumentaci naleznete na již několikrát zmiňovaném WordPress Codexu.

Celý systém je dosti rozsáhlý, takže se zaměřím na nejčastěji používané templaty, díky kterým se do toho trochu dostaneme. Další práce by již nemusela být velký problém.

Co je to ve WordPressu Template?

Ve WordPressu se „templatě“ říká něčemu, co WordPress nahrává za účelem zobrazení nějaké obsahu. Již jsme si v našem seriálu několik template připravily. Logika je jednoduchá… Na základě požadavku ze strany návštěvníka a „kliknutého“ url dojde ve WordPressu ke zjištění o jaký druh obsahu se jedná (stránka, příspěvek, výpis příspěvků, detail autora, atd…), obsah si načte, zvolí příslušnou templatu a do ní data pošle.

Určitě si zapamatujte, že WordPress vždy jako poslední volá index.php, pokud příslušnou templatu nenajde. 

Základní templaty ve WordPressu

  • index – úvodní stránka
  • archive – výpis všech příspěvků (často řízené časovým údajem)
  • category – výpis příspěvků v jedné kategori
  • tag – výpis příspěvků s určitým tagem
  • single – detail příspěvku
  • page – detail stránky

Výše popsané templaty bych já (pouze můj názor) považoval za takový základ běžného blogu nebo stránky. Template mám poněkud více, ale na to bych si mohli dát skoro vlastní díl.

Trocha té praxe!

Jak s tím tedy můžeme naložit? Pojďme si vzít nějaký reálný příklad…

Mám webové stránky, a klient požaduje, aby kategorie ‚naše akce‘ měla místo běžného výpisu příspěvků boxy, kde budou informace o tom, kdy akce proběhla. Tedy, pro jednu kategorii potřebujeme použít jinou templatu než tu základní.

Jak WordPress hledá templaty pro kategorie?

  1. category-{slug}.php
  2. category-{id}.php
  3. category.php
  4. archive.php
  5. index.php

Co to znamená pro nás? Pokud chceme, aby se naše kategorie „Naše akce“ zobrazovala v jiném souboru než v category.php, tak dle pořadí založíme nový soubor, který nazveme category-nase-akce.php a vložíme jej do rootu šablony. Nyní, pokud budeme mít založenou tuto kategorii, bude se volat soubor category-nase-akce.php místo category.php. Pokud se nechceme spolehnout na stringovou hodnotu, můžeme použít ID kategorie – category-16.php

Možná Vás nepřekvapí, že v ostatních případech je to velmi podobné.

Page – „custom template page“ -> page-{slug}.php -> page-{id}.php -> page.php -> index.php

Tag – tag-{slug}.php -> tag-{id}.php -> tag.php -> archive.php -> index.php

Archive.php – archive-{post-type}.php -> archive.php -> index.php

Post – single-{post-type}.php -> single.php -> index.php

 

  • Slug – Název záznamu vytvořený pro url, tedy bez diakritky, mezer, atd…
  • id – id prvku v DB (dost často dohledatelné v URL v administraci)
  • post-type – V případě vlastního post-typu používáte jeho název

 

Pár příkladů z WordPressu, proč používat templaty

 Příklad 1 !

Zákazník požaduje na stránce s kontakty uveřejnit kontaktní formulář. Ti z vás, kteří již pochopili, že pluginy nejsou cestou osvícení, ale cestou záhuby si napíšou vlastní kontaktní formulář, který odešle email klientovi s dotazem návštěvníka. Ano, mohli bychom vytvořit shortcode a nechat samotného klienta, aby si ho tam vložil (mohu Vás ujistit, že slova „vložit, upravit, aktualizovat, přepsat, změnit“ jsou pro zákazníky zcela cizí a nebezpečné jako česnek pro upíra nebo vysavač pro mužské polovičky. A tak co! Vložím tam shortcode sám a je to, že? Ne, není… Co když Vám zákazník shortcode smaže ve stylu -“ Jejda, co mi to tu vzniklo za podivný shluk znaků, kterým nerozumím, raději je smažu, to je jistota“. Vím, že stránka se jmenuje kontakty, takže si založím soubor page-kontakty.php, kde těsně pod značku the_content() vložím svůj formulář.

Nyní byste mohli říct, co když zákazník změní název stránky, nooo? Ano, i to se může stát, může jí také smazat! Ale pořád to vnímám jako méně pravděpodobné, než smazání nějaké textu v editoru. Ti zkušenější určitě namítnout – „A co custom page template“ – ano, i to je řešení. Ale změnit hodnotu v comboxu vidím stále větší riziko editace než u toho ostatní. Ostatní templaty pak však už custom templaty nemají.

Vždy by mělo být na vašem uvážení, co je to správné řešení. Jsou i metody, jak si založit vlastní URL a uživatele do stránky vůbec nepustit, ale to třeba v dalším díle.

Závěrem

Dnešním dílem jsme si ukázali další „lvl“ kontroly nad naším WordPressem a vypisování dat do jednotlivých šablon. V šablonách si pak následně můžeme dělat co chceme a náš web dostává také trochu hezkou podobu a můžeme si hrát se vzhledem na základě vybraného obsahu.

Tomáš Kocifaj, KTStudio.cz

, , ,

  1. #1 Radek P. 16.7.2013 - 13:44

    Super – uvažuji o nějaké sólo stránce a toto mi přišlo vhod. Určitě to vyzkouším. Děkuji

  2. #2 Tomáš Kocifaj 16.7.2013 - 14:47

    Zdravím tě Radku, přesně pro tyto účely to tam WP má. V případě, že potřebuješ oddělit vzhled nebo obsah jedné stránky, rubriky, nebo dalších věcí od druhých. V případě zájmu to lze udělat i na sólo php soubor mimo templatu. Tedy založení vlastní URL bez toho, aby klient viděl, že nějaká stránka založená je a nemohl jí třeba smazat

  3. #3 dakarin 4.2.2014 - 09:37

    Výborné – pochopit strukturu je základní předpoklad zevrubné orientace (alespoň pro mě :-) Každopádně mě tento kurz významně ukracuje takové to úvodní učení (tápání), kdy musíte pojmout kvantum látky a prakticky ještě téměř nic netvoříte, ještě si nehrajete … u všech systémů je to vždy stejný efekt ;-)

    děkuji, Jirka ze Znoma

  4. #4 Tomáš Kocifaj 4.2.2014 - 09:56

    Zdravím, jsem rád, že seriál přináší nějaké ovoce čtenářům. Pro rychlejší a individuální „nalejvárnu“ můžu nabídnout – http://www.ktstudio.cz/skoleni-tvorba-wordpress-sablon-praha/

  5. #5 Kamil 18.3.2014 - 18:41

    Zdravím, chtěl jsem se zeptat, zdali nevíte kde počeštit v názvu url slovo /category/, mam na mysli http://www.neco.cz/category/nejakakategorie.. Díky a omlouvám se, zdali o tom byla někde již zmínka..

    • #6 Tomáš Kocifaj 18.3.2014 - 18:58

      Zdravím Kamile, ano, to lze zajistit v části Nastavení -> Trvalé odkazy. Dole jsou dva nenápadné vstupy pro název „category“ a „tag“

  6. #7 Patrik 27.4.2014 - 20:51

    Ahoj,

    mám dotaz. V šabloně, ze které vycházím mám soubor archive.php. Ve své pak soubor archive-produkty.php pro zobrazení archivu daného post-typu.
    Bohužel se pořád načítá jen soubor archive.php. U souboru pro zobrazení příspěvku (single-produkty.php) to ale funguje.
    Netušíš kde může být zádrhel?

    Díky moc.

    • #8 Tomáš Kocifaj 28.4.2014 - 05:54

      Popravdě se mi to ze začátku stávalo dost často :-) První na co bych kouknu je název post_typu a název souboru. Poté bych zkusil přeuložit permalinks a když ani to ne, kouknul bych, jaké URL používáš na to, aby ses do archivu dostal. Pokud máš zapnué permalinky mělo by to být */produkty

  7. #9 Patrik 28.4.2014 - 17:36

    No, projel jsem další návody a udělal soubor taxonomy-kategorie.php a ten už načítá ok.
    Prozatím jsou to pro mně hodně věci mezi nebem a zemí, hodně zkouším a testuju.

    • #10 Tomáš Kocifaj 28.4.2014 - 17:39

      Ahoj,

      pozor, soubor taxonomy-kategorie.php načítá pouze v v případě, že voláš nějaký „term“. Například všechny produkty, které jsou v kategorii „Televize“. Pokud chceš výpis produktů bez ohledu na kategorii, musíš použít právě onen Archive. Také tvůj custom post type musí mít archiv povolen has_archive = true. To se definuje při registraci postypu.

      • #11 Patrik 28.4.2014 - 18:20

        Kategorie jsou taxonomy.. teda jestli dobře chápu.
        Je to druhé v hearchii:
        taxonomy-{taxonomy}.php – If the taxonomy were sometax, WordPress would look for taxonomy-sometax.php

        has_archive jsem tam neměl, přidal ale stejně to nejde.-((

  8. #13 Patrik 28.4.2014 - 18:31

    Ted nerozumím, proto sem dám celý kod.
    Mám registrované post type produkty a k tomu přiděleny kategorie, viz níže:

    function registrace_katalogu() {

    $labels = array(
    ‚name‘ => __(‚Katalog‘),
    ‚singular_name‘ => __(‚Položka‘),
    ‚add_new‘ => __(‚Nová položka‘),
    ‚add_new_item‘ => __(‚Přidat nový produkt‘),
    ‚edit_item‘ => __(‚Změnit produkt‘),
    ‚new_item‘ => __(‚Nový produkt‘),
    ‚view_item‘ => __(‚Zobrazit produkt‘),
    );

    $args = array(
    ‚labels‘ => $labels,
    ‚public‘ => true,
    ‚publicly_queryable‘ => true,
    ‚show_ui‘ => true,
    ‚query_var‘ => true,
    ‚rewrite‘ => array( ‚slug‘ => ‚produkt‘, ‚with_front‘ => false),
    ‚hierarchical‘ => true,
    ‚has_archive‘ => true,
    ‚supports‘ => array(‚title‘,’editor‘,’thumbnail‘,’custom-fields‘,’revisions‘),
    ‚menu_icon‘ => get_bloginfo(‚template_url‘).’/images/product_icon.png‘
    );

    register_post_type( ‚produkty‘ , $args );

    }

    add_action( ‚init‘, ‚build_taxonomies‘, 0 );

    function build_taxonomies() {
    register_taxonomy( ‚kategorie‘, ‚produkty‘, array(
    ‚hierarchical‘ => true,
    ‚label‘ => ‚Kategorie‘,
    ‚swho_ui‘ => true,
    ‚query_var‘ => true,
    ‚rewrite‘ => array( ‚slug‘ => ‚katalog‘, ‚with_front‘ => false ),
    ‚singular_label‘ => ‚Kategorie‘,
    ‚public‘ => true,
    ‚show_in_nav_menus‘ => true,
    ‚show_admin_column‘ => true
    ) );
    }

    • #14 Tomáš Kocifaj 28.4.2014 - 18:33

      Super, teď bys měl mít někde link, kde url bude tvořit tento kód: get_post_type_archive_link( ‚produkty‘ );

      V tu chvíli se bude volat archive-produkty.php z rootu šablony.

  9. #15 Patrik 28.4.2014 - 19:20

    Zkusil jsem a hází to nějakou chybu… musím mít na to klid, teď mám prcky doma a to je masakr.-)

    Každopádně díky za pomoc, když tak dám ještě vědět.

    Ještě studuju vlastní MetaBoxy a jak řadit a filtrovat podle jejich obsahu, takže veselo a hlava mi jde kolem.

    Jinak návody jsou jedny z nejnázornějších co jsem našel, díky za ně.

    Patrik

Komentáře jsou uzavřeny.