Jak rozdělit dlouhý příspěvek na několik stránek? WordPress Quicktags!

Pokud řešíte problém, jak rozdělit dlouhý příspěvek ve WordPressu na několik stránek a hledáte nějaký šikovný pluign pro tuto činnost, nehledejte. To WordPress umí již v základu, jen málo kdo čte dokumentaci.

Snad každý uživatel ví, že WordPress umožňuje rozdělit text na perex a hlavní část textu. Tak se děje pomocí quicktagu <!- -more- -> Jeho použitím docílíte toto, že na výpisu článku se zobrazí jen vámi vybraná úvodní pasáž příspěvku, aniž byste museli v šabloně něco přenastavovat.

Poznámka: Jinou možností je použití Stručného výpisu příspěvku v kombinaci s funkcí the_excerpt() namíto funkce the_content(). Viz http://codex.wordpress.org/Function_Reference/the_excerpt

Neexistuje ale pouze <!- -more- ->, ale také <!- -nextpage- ->

O dalším dostupném quicktagu ví jen málokdo. A přitom se jedná o velmi užitečnou značku. Tuto značku můžete v příspěvku, na rozdíl od <!- -more- -> užít kolikrát chcete. Na místě, kde ji použijete se příspěvek rozdělí a při správném použití funkce wp_link_pages() : http://codex.wordpress.org/Template_Tags/wp_link_pages, se také zobrazí odkazy na další stránky příspěvku. Můžete tak příspěvek rozdělit na několik stránek a usnadnit tak čtenářovi čtení (dlouhý text většinou odrazuje).

Použití funkce wp_link_pages() není nijak obtížné. Profesionální šabona by měla tuto funkci mít již v základu připravenou k použití a není tedy třeba nic upravovat. Pokud jste si třeba šablonu ale dělali sami, nebo vaše šablona z nějakého jiného důvodu tuto fci neobsahuje, není nic jednoduššího, než ji do šablony vložit. A to klidně rovnou pod funkci the_content() v souboru single.php, popřípadě také page.php

Tato funkce, bez změny parametrů, Vypíše Tento kód:

1
<p>Stránky: ODKAZY NA JEDNOTLIVÉ STRÁNKY</p>

Čili je obsah umístěn uvnitř odstavce a nebude se tedy s obsahem nějak přímo mísit. Použití je tedy následující:

<?php
...
the_content();
wp_link_pages();
...
?>

Pokud používáte k výpisu článku vlastní query_posts funkci, zkontrolujte, jestli jste pamatovali na možnost stránkování (parametr paged). Více o této problematice zde: http://david.binda.cz/wordpress-nefunkcni-strankovani-v-dusledku-query_posts

Reference:

http://codex.wordpress.org/Write_Post_SubPanel#Quicktags
http://codex.wordpress.org/Template_Tags/wp_link_pages
http://codex.wordpress.org/Function_Reference/the_excerpt
http://codex.wordpress.org/Function_Reference/the_content

Více výpisů článků najednou (Multiple loops)

Proč někdo potřebuje více výpisů článků (dále již jen multiple loops)? WordPress codex odpovídá v tomto duchu:

Odpověď na tuto otázku je, v zásadě taková, že chceme udělat s jednou skupinou článků něco jiného, než s druhou skupinou článk, ale přitom chceme obě skupiny vypsat na jedné stránce zároveň. „Něco jiného“ může znamenat prakticky cokoli. Limitovaní jste pouze vašemi znalostmi PHP a vaší představivostí.

Stručný popis základního cyklu pro výpis příspěvků

Než se pustíme do multiple loops, je dobré vědět něco o základní cyklu pro výspis článků. Tento vypadá takto:

/—code php





\—

Nejprve se ujistíme, že je co vypisovat (první řádek). Na stránce archivu či kategorie (soubory archive.php či category.php) jde o to, jestli jsou v daném archivu (dle měsíce, data, roku, autora, štítku) či kategorii nějaké články. Určení okruhu článků (výběr kategorie či archivu) je provedeno z url adresy. Pakliže máme články, které splňují kritéria, vezme kód každý jednotlivý článek a provede s ním to, co mu řekneme.

Zpracování stejného souboru článku dvakrát

No a nyní se již můžeme pustit do více výpisů takových článků. Nejdříve si předvedeme jak zpracovat stejný okruh článků znovu. Čili ještě jednou provést výpis stejných článků, ovšem třeba s jiným formátováním výstupu.

Jde o celkem jednoduchou operaci. Stačí použít funkci rewind_posts(). Ta přetočí pomyslné počítadlo vypsaných článků zpět na začátek a další výpis začně znovu, pěkně od začátku.

/—code php






\—

Dva různé soubory článků

Pokud ovšem chceme mít na stránce dva různé soubory článků, bude již operace trochu složitější, ovšem stále jde celkem o banalitu, kterou se lze snadno naučit.

Poumůže nám funkce query_posts(), která vytvoří nový objekt s články a přetočí jej na začátek, přičemž stávající smaže a nelze jej dále znovu použít. Na stránce popisu funkce query_posts() se dočtete možnosti, jak specifikovat jaké články chcete vybrat.

Použití je poté následující:

/—code php
// nejprve proběhne výpis tradičních článků



// a poté vybereme posledních 5 článků z kategorie nezařazené
// parametr category_name využívá název url tzv. slug, nikoli název




\—

Dva různé soubory článků se zachováním původního souboru

Výše uvedené řešení, jak bylo napsáno, nezachovává původní soubor článků. To může být někdy na škodu, jelikož s ním třeba chceme také ještě pracovat. Původní soubor lze ovšem zachovat. Řešení je následující:

/—code php



have_posts()) : $muj_soubor->the_post(); ?>

// pro pochopení toho,že původní soubor byl zachován přidávám jeho přetočení a nový výpis původního souboru







\—

Jak vidíte v kódu, nemáte přístup, v novém souboru, k funkcím have_posts či the_post přímo. Ale skrze název vámi vytvořeného objektu muj_soubor. Na to je nutné pamatovat. A zároveň platí, že uvnitř cyklu while již máte přístup ke všem funkcím (the_content, the_title, the_permalink a podobně) přímo, bez reference na objekt.

Objekt typu WP_Query() přijímá stejné parametry jako funkce query_posts().

Vnořené soubory článků (nested loops)

Také se může stát, že potřebujete ještě před dokončením jednoho výpisu článků vypsat další soubor. I toto je řešitelné, ovšem má to svá specifika, na která je nutné myslet. Je zde opět nutnost vytvořit nový objekt a na konci výpisu je nutné zavolat funkci wp_reset_postdata()

/—code php
// vybereme články z kategorie s ID 3
$muj_soubor = new WP_Query( „cat=3“ );
if ( $muj_soubor->have_posts() ) {
while ( $muj_soubor->have_posts() ) {
$muj_soubor->the_post();
the_content(); //výpis obsahu již probíhá bez reference na objekt muj_soubor
}
}
wp_reset_postdata(); // tento řádek je nesmírně důležitý a u vnořených výpisů nesmí chybět!
\—

Informace o této problematice na WordPress codex (anglicky):

http://codex.wordpress.org/The_Loop#Multiple_Loops

Vnořené výpisy článků: http://codex.wordpress.org/The_Loop#Nested_Loops

Reference funkce query_posts: http://codex.wordpress.org/Function_Reference/query_posts

Popis objektu WP_Query: http://codex.wordpress.org/Function_Reference/WP_Query

Speciální šablona pro konkrétní rubriku, stránku či příspěvek

Někdy se stane, že potřebujete v redakčním systému WordPress pro nějakou konkrétní kategorii, stránku či příspěvek zvláštní zobrazení – šablonu. Chcete třeba pro určitou rubriku odstranit nadpis, nebo nechat vypsat nějaký text navíc. K docílení tohoto efektu můžete použít složitý systém podmínek v php, nebo jednoduše vytvořit nový soubor (od WordPress 2.9). Jak tedy na to?

Řešení 1: WordPress template slug

Máte-li již existující šablonu, na které chcete provést změny (dejme tomu category.php  pro zobrazení výpisu rubrik), vezmete tento soubor a nakopírujete jeho aktuální obsah do nového souboru se speciálním názvem. Název souboru bude podle jednoho z následujících schémat:

(pokud ve vaší šabloně neexistuje soubor category.php, užijte soubor archive.php a pokud ani ten neexistuje, použijte index.php – déle uvedené názvy souborů se ale nemění v závislosti na názvu souboru s původním obsahem)

category-1.php (pro kategorii s ID 1)

category-nazev-kategorie.php (pro kategorii s názvem „Název kategorie“)

Obsah tohoto nově vytvořeného souboru si poté upravíte dle potřeby.

Obdobně lze vytvořit takto speciální šablony pro jednotlivé příspěvky (post-5.php či post-nazev-prispevku.php) i stránky (page-1.php či page-nazev-stranky.php).

Řešení 2: Custom templates for wordpress page

Přiřazení speciální šablony ke konkrétní kategorii, přípěvku či článku si už WordPress dále zařídí sám.

Pro stránky navíc můžete vytvořit speciální šablonu, která bude přístupná skrze administrační rozhraní při tvorbě či editaci stránky a můžete ji tedy užít pro více stránek na vašem webu. Opět vyjdeme ze základního souboru page.php, jehož obsah si nakopírujeme do nového souboru, nyní již s libovolným názvem. Na úvod (na úplně první řádek) tohoto .php souboru vložíte následující kód:

<?php
/*
Template Name: Nazev sablony
*/
?>

Upravíte si samozřejmě název šablony, který je zapsán za dvojtečkou. V našem případě jde o Nazev sablony (je rozumné nepoužívat při volbě názvu diakritiku, co kdy to někdy přeci jen zlobilo ;) )

Poznámka: Pro úpravu souborů můžete využít například Bluefish editor s nainstalovaným neoficiálním rozšířením pro podporu WordPress syntaxe a možností vložit již hotovou část kódu (mezi již hotovými kódy je i kód pro vytvoření nové šablony pro stránku): http://david.binda.cz/turn-bluefish-editor-into-powerful-wordpress-ide

Vlastní řazení výpisu rubrik ve widgetech i funkcích

Použití rubrik, respektive jejich výpisu častou používáme k vytvoření navigace. Funkce wp_list_categories() je snad každému tvůrci WordPress šablon známá. Tato funkce nám ovšem, stejně jako její „front-end“ ve widgetech, dává na výběr řazení dle následujících kritérií:

  • ID
  • name – Defaultní nastavení
  • slug
  • count
  • term_group

**Vlastní řazení výpisu rubrik**

Často by se nám ale hodilo vlastní řazení, ideálně takové, které si můžeme přizpůsobit. Od verze 3.0 máme ve WordPressu možnost vytvářet uživatelská menu, čímž lze toto vlastní řazení nahradit (O WordPress menu bude některý další příspěvek). Ovšem existuje také jednoduchý plugin – My Category Order -, který nám do navigačního menu v administraci do sekce „Příspěvky“ přidá položku „Pořadí rubrik“, kde si pořadí můžeme namixovat dle svých představ jednoduchým „drag & drop“ (tažením, jak se hezky česky překládá)

Tohoto pluginu můžeme poté využít ve widgetech. Sem již česká lokalizace nedorazila a tak máme k dispozici widget „My Category Order“ s volbou Order by: „My order“ zohledňující naše pořadí.

Ovšem jak již titulek napovídá, lze naše pořadí zohlednit i při použití funkce wp_list_categories() a to přidáním parametru ‘orderby=order’ (namísto například orderby=slug či orderby=name).

**Nevýhody užití pluginu oproti řešení dle WordPress Menu**

Jistou, i když drobnou a odstranitelnou, nevýhodou u tohoto postupu, oproti wordpress menu, je nemožnost tažením při sestavování pořadí, nějakou tu rubriku vyjmout (to při použití wordpress menu lze). Ovšem i rozhraní widgetu nabízí možnosti „Vyjmout“ (sem čeština dorazila) a „Exclude Tree“ (sem nedorazila :) ). Samozřejmě při použití funkce wp_list_categories() používáme analogicky ‘exclude=1,2′ a ‘exclude_tree=1′. Jak jsem již psal, při použití wordpress menu máme posléze možnost skrze administraci bez zásah do šablony jednoduše kategorie vyjmout. A není nutné to navíc, při použití jak ve widgetu tak v šabloně, nastavovat na dvou místech.

Poznámka: Rozdíl mezi ‘exclude’ a ‘exclude_tree’ – Při užití exclude se z výpisu vyjme jen a pouze kategorie s korespondujícím ID. Při použití exclude_tree se vyjme kategorie s korespondujícím číslem, ale také všechny její podkategorie (subcategories).

**Ošetření pro případ nezapnutného pluginu**

Použití tohoto pluginu v šabloně není navíc nutné ošetřovat pomocí function_exists() či is_plugin_active() funkcí. Pakliže plugin nebude aktivní, funkce wp_list_categories() v šabloně s nastaveným ‘orderby=order’ bude tento parametr ignorovat a výpis provede dle defaultní hodnoty parametru orderby ‘orderby=name’ (čili vypíše kategorie seřazené dle názvu).

Neočekávaný výstup (unexpected output) při aktivaci pluginu

Po vydání WordPressu 3.0 se mnoha uživatelům objevila během aktivace některých pluginů chybová hláška o vygenerovaném neočekávaném výstupu (unexpected output). I přesto, že plugin v mnoha případech nakonec v pořádku fungoval, tak to rozhodně nebyl ideální první dojem na uživatele, kteří si plugin nainstalovali a chtěli ho vyzkoušet (nehledě na možné zástupné problémy). Kde se tato hláška vzala, co přesně znamená a jak mohou […]

Přidejte Váš web!

Máte zajímavý web postavený na redakčním systému WordPress? Přidejte ho do seznamu webů, používajících WordPress! Web můžete přidat přes „tento formulář“:http://www.cwordpress.cz/portfolio/pridejte-vas-web.html. Schválení webu probíhá ručně. Může trvat několik dnů a vyhrazujeme si právo web zamítnout!

Dobré pro získání zpětných odkazů.

Jak udělat jednoduchý plugin pro WordPress

Tvoření pluginů pro platformu WordPress není nijak složité. V podstatě bohatě stačí, když umíte alespoň základy jazyka PHP (případně SQL). V první části seriálu se podíváme na to, jak dát dohromady velmi triviální plugin.
Tvorbu budu názorně demonstrovat na imaginárním pluginu „Database Optimization“, který bude mít za úkol defragmentovat (optimalizovat) všechny tabulky s nastaveným prefixem přes […]

Zvýraznění aktuálního měsíce v celkovém výpisu archivu

Nedávno se objevil dotaz na možnost zvýrazňování aktuálního měsíce v přehledném výpisu archivu, takže jsme se zkusili poohlédnout po nějakém jednoduchém řešení, aniž bychom museli modifikovat zdrojové kódy WordPressu či použít nějaký plugin. A nakonec je to jednodušší než to původně vypadalo a funguje to jak v archivu zobrazovaném v šabloně pomocí funkce wp_get_archives(), tak i ve widgetu Archiv. A jak […]

Problém s funkcí query_post při stránkování

Jestliže v šabloně z nějakých důvodů nevystačíme se standardním načtením článků pomocí konstrukce

/—code php
if (have_posts()) : while (have_posts()) : the_post();
\—

a potřebujeme využít funkci „query_posts()“:http://codex.wordpress.org/Function_Reference/query_posts například pro vyloučení některých kategorií, tagů, autora a podobně, typicky v podobě:

/—code php
// výběr článků z vybraných rubrik
query_posts(‚cat=2,6,17,38‘);

// výběr článků patřících do několika rubrik současně
query_posts(array(‚category__and‘ => array(2,6)));

// výběr článků s vyloučením určité rubriky
query_posts(‚cat=-3‘);
\—

Rychle zjistíme, že tento postup sice vede k cíli, nicméně **přestane fungovat stránkování** a tím i pluginy jako např. výborný „WP-PageNavi“:222.

Náprava je jednoduchá:

/—code php
if (have_posts()):

// obnovíme parametr ‚paged‘
$paged = (get_query_var(‚paged‘)) ? get_query_var(‚paged‘) : 1;
query_posts(„cat=-3&paged=$paged“);

// a pak už pokračujeme standardním
while (have_posts()) : the_post();
\—

Viz též „Separatista“:http://www.separatista.net/wordpress/tipy-a-triky/problemy-se-strankovanim-prispevku-pri-pouziti-funkce-query_posts nebo „David Binda“:http://david.binda.cz/wordpress-nefunkcni-strankovani-v-dusledku-query_posts.

„Properly using wp_reset_postdata(), wp_reset_query() and variable naming in queries »“:http://www.poststat.us/properly-reset-wordpress-query/

„How to fix pagination for custom loops »“:http://wordpress.stackexchange.com/questions/120407/how-to-fix-pagination-for-custom-loops