Speciální šablona pro všechny příspěvky v konkrétní kategorii

O různých zobrazení vybraných příspěvků, stránek a kategorií jsem napsal již dva články:

Speciální šablona pro konkrétní rubriku, stránku či příspěvek
Dvě různé WordPress šablony na jednom blogu

Pokud ale chceme pro všechny příspěvky v dané kategorii užít rozdílný layout, a vůbec jinou šablonu, se slug a id si moc nevystačíme. V tom případě budeme muset využít komplikovanější techniky.

Musíme si vytvořit “prakticky prázný” soubor single.php, který bude obsahovat pouze rozhodovací algoritmus. Na to využijeme WordPress funkce in_category()php funkce include() ve spolupráci s WordPress konstantou TEMPLATEPATH.

Obsah bude následující (v případě, že chceme speciální šalonu pro příspěvky v rubrice speciální a moje kategorie):

<php 
if ( in_category( array('specialni', 'moje-kategorie' ) ) ) {
 include (TEMPLATEPATH.'single-specialni.php');
}else {
 include (TEMPLATEPATH.'single-normalni.php');
}
?>

Přičemž soubor single-normalni.php bude obsahovat původní obsah souboru single.php. Popřípadě, pokud do této doby neexistoval single.php, obsah souboru index.php. A soubor single-specialni.php bude obsahovat upravený kód vašeho speciálního zobrazení všech příspěvků v kategorii speciální a moje kategorie.

Pozor, soubor single-normalni.php a single-specialni.php musí obsahovat get_header() a get_footer(), jako každý jiný tradiční soubor WordPress šablony. Jen, dle tohoto článku, upravený soubor single.php tyto funkce obsahovat nesmí.

Jak vytvářet speciální hlavičky a patičky a sidebary jsem probíral v předchozím článku.

Vytvoření WordPress šablony z vašeho statického HTML webu – 1.díl

Tento článek si klade za cíl pouze uvést do problematiky tvorby WordPress šablon a má být první zastávkou na dlouhé trati pro ty, kteří se rozhodli svůj doposud statický HTML web napsaný v poznámkovém bloku převést na WordPress svépomocí.

Demonstrační HTML kódy užité v následujícím článku pochází ze šablony perplex ze serveru freecsstemplates.org

Nejjednodušší WordPress šablona se musí sestávat aspoň ze souboru index.php a ideálně také ze souboru style.css. WordPress si všímá pouze šablon umístěných v adresáři /wp-content/themes/ a každá šablona musí být umístěna ještě ve vlastním adresáři. Čili při vytváření naší šablony si založíme adresář my_template a do ní vytvoříme dva soubory index.php a style.css.

Takže zatím máme v adresáři /wp-content/themes/my_template dva prázdné soubory index.php a style.css.
Do souboru style.css, na jeho začátek, vložíme následující obsah, kterým si zajistíme to, že šablona se bude v administraci hlásit jako Moje Šablona 1.0 od Já :

/*
Theme Name: Moje Šablona
Description: Můj první pokus o WordPress šablonu
Author: Já
Version: 1.0
*/

Dále by se do souboru style.css slušelo nakopírovat WordPress Generated Classes, se kterými WordPress automaticky počítá, aspoň co se WYSIWYG editoru týká a obsah našeho stávajícího css souboru.

.aligncenter, div.aligncenter {
	display: block;
	margin-left: auto;
	margin-right: auto;
}
.alignleft {
	float: left;
}
.alignright {
	float: right;
}
.wp-caption {
	background-color: #f3f3f3;
	border: 1px solid #ddd;
	-khtml-border-radius: 3px;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px; /* optional rounded corners for browsers that support it */
	margin: 10px;
	padding-top: 4px;
	text-align: center;
}
.wp-caption img {
	border: 0 none;
	margin: 0;
	padding: 0;
}
.wp-caption p.wp-caption-text {
	font-size: 11px;
	line-height: 17px;
	margin: 0;
	padding: 0 4px 5px;
}

No a do souboru index.php nakopírujeme html kód úvodní stránky stránky našeho webu (velmi pravděpodobně jde o soubor index.html).

No a nyní se již musíme vrhnout na úpravy našeho původního HTML kódu a okořenit jej o nějaké ty php příkazy, kterým WordPress rozumí.

Úpravy sekce head

Nejdříve začneme s úpravou hlavičky. Sekce head by vždy měla obsahovat, těsně před svým ukončením, čili před tagem </head>, volání funkce wp_head().

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Perplex   by Free CSS Templates</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
<?php wp_head(); ?>
</head>

V kódu je funkce wp_head() volána na řáku 8. Jde o funkci, kterou využívají prakticky všechny pluginy, její vynechání by tedy znamenalo znemožnění jejich fungování.

Dále budeme chtít nalinkovat náš css soubor. Ve výše uvedeném příkladě máme relativní odkaz na style.css. Ačkoli je název shodný (a to je pouze náhoda, že mnou vybraná demonstrační šablona má tento název pro soubor s css styly) nebude nám tento odkaz fungovat. Musíme jej doplnit o celou cestu z rootu webu k našemu souboru style.css. Opět to zajistí php funkce, tentokráte funkce bloginfo():

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Perplex   by Free CSS Templates</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="<?php bloginfo('template_url'); ?>/style.css" rel="stylesheet" type="text/css" media="screen" />
<?php wp_head(); ?>
</head>

Všimněte si změny na řádku 7, kdy sme doplnili jak volání funkce bloginfo, tak lomítko před název našeho souboru se styly. Funkce bloginfo totiž vrací něco v tomto smyslu “http://example/home/wp/wp-content/themes/parent-theme” (bez uvozovek) a tudíž by bez námi doplněného lomítka vypadala adresa poté takto: “http://example/home/wp/wp-content/themes/parent-themestyle.css” ale my chceme takovouto adresu: “http://example/home/wp/wp-content/themes/parent-theme/style.css”.

Tak nyní bychom snad chtěli ještě mít možnost ovlivňovat titlek stránky, tag <title>. To nám zajistí funkce wp_title(), ideálně v kombinaci s nám již známou funkcí bloginfo(). Změnu provedeme na řádku 4 následujícího kódu, přičem smažeme “natvrdo” vložený titulek bývalé HTML statickéh stránky:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><?php bloginfo('name'); ?> <?php wp_title(); ?></title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="<?php bloginfo('template_url'); ?>/style.css" rel="stylesheet" type="text/css" media="screen" />
<?php wp_head(); ?>
</head>

Titulek stránky při zobrazení příspěvku poté bude vypadat nějak takto: My WordPress Blog » Hello world!. Kde My WordPress Blog je název blogu, který lze upravit v administraci a Hello world! je název příspěvku, který lze nastavit při editaci příspěvku. Na titulní stránce bude zobrazeno jen My WordPress Blog. Pakliže chcete jiné pořadí nebo jiný oddělovač názvu blogu od názvu příspěvku, podívejte se do dokumentace.

Tím bychom byli s úpravami hlavičky, aspoň pro základní fungování naší nové WordPress šablony, hotovi. Dále se vrhneme na úpravu patičky, která je o dost jednodušší a po níž nám chybí již “jen” to hlavní, motor zobrazování obsahu vytvořený skrze administraci.

Úprava patičky – funkce wp_footer()

Stejně jako je velmi důležitá, pro fungování pluginů, funkce wp_head() v hlavičce, je důležitá i funkce wp_footer() v patičce webu. Přesněji její umístění těsně před uzavírajícím </body> tagem:

.
.
.
<?php wp_footer(); ?>
</body>
</html>

The Loop – zobrazování obsahu vytvořeného v administraci

Základním kamenem každé WordPress šablony je cyklus (anglicky loop), který se stará o výpis všech článků, které odpovídají dané kategorii (či zobrazení hlavní stránky) a nebo jen zobrazení jednoho jediného příspěvku. V případě jednoho příspěvku (single post) proběhne cyklus pouze jednou, ale stále je nutné, aby vše bylo zapsáno v cyklu. Základní WordPress cyklus vypadá takto:

<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
...
<?php endwhile; ?>
<?php else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

Čili nejdříve se otestuje, jestli jsou vůbec pro danou stránku (kategorii, příspěvek, titulní stránku) vůbec nějaké příspěvky k zobrazení(řádek 1). A pakliže ne(řádek 5), vyhodí se chybová hláška (řádek 6).
Pakliže nějaké příspěvky ale jsou, spustí se cyklus while, který proběhne pro každý jednotlivý příspěvek (řádek 2).

Ve výše uvedeném zdrojovém kódu cyklu samozřejmě něco chybí. A sice způsob, jakým se má příspěvek zpracovat. Způsob zpracování je ve zmíněném kódu nahrazen třemi tečkami. Na jejich místo přijde samotný kód. Příkladem budiž the loop z defaultní šablony WordPressu 2.9 :

<?php if (have_posts()) : /* existují příspěvky pro danou stránku */ ?>
 
		<?php while (have_posts()) : the_post(); /* zpracuj následujícím kódem každý jeden příspěvek */ ?>
 
			<div <?php post_class() /* přidá třídu */ ?> id="post-<?php the_ID(); ?>">
				<h2><a href="<?php the_permalink() /* trvalý odkaz na příspěvek */?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); /* titulek příspěvku */ ?></a></h2>
				<small><?php the_time('j. F. Y') /* datum publikace */ ?> <!-- by <?php the_author() ?> --></small>
 
				<div class="entry">
					<?php the_content('Celý článek &raquo;'); /* to nejdůležitější, zobrazí obsah příspěvku*/ ?>
				</div>
 
				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Categories: <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
			</div>
 
		<?php endwhile; /* konec zpracování každého jednoho příspěvku */ ?>
 
		<div class="navigation">
			<div class="alignleft"><?php next_posts_link('&laquo; Další články') ?></div>
			<div class="alignright"><?php previous_posts_link('Předchozí články &raquo;') ?></div>
		</div>
 
	<?php else : /* žádné příspěvky pro danou stránku neexistují */ ?>
 
		<h2 class="center">Not Found</h2>
		<p><?php _e('Sorry, no posts matched your criteria.'); /* chybová hláška */ ?></p>
		<?php get_search_form(); /* přidá vyhledávací formulář */ ?>
 
	<?php endif; ?>

Takže jak bylo řečeno, každá šablona musí mít tento (nebo samozřejmě nějakým způsobem upravený) cyklus ve svém těle.

Již máte přesunuté css předpisy do souboru style.css a ten je správně nalinkován z hlavičky (sekce <head>) a v hlavičce máte také titulek webu s titulkem příspěvku a hook pro pluigny. Hook máte také vv patičce webu a výše zmíněným cyklem, nahradíte hlavní obsahovou část vaší šabony. V demonstrační HTML stánce jde o obsah divu s id=”content”:

<div id="content">
				<div class="post">
					<div class="post-bgtop">
						<div class="post-bgbtm">
							<h2 class="title"><a href="#">Welcome to Perplex </a></h2>
							<p class="meta"><span class="date">Sunday, January 26, 2011</span> 7:27 AM Posted by <a href="#">Someone</a></p>
							<div class="entry">
								<p>This is <strong>Perplex </strong>, a free, fully standards-compliant CSS template designed by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>, released for free under the <a href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5</a> license.  You're free to use this template for anything as long as you link back to <a href="http://www.freecsstemplates.org/">my site</a>. Enjoy :)</p>
								<p>Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum ipsum. Proin imperdiet est. Phasellus dapibus semper urna. Pellentesque ornare, orci in felis. </p>
							</div>
						</div>
					</div>
				</div>
				<div class="post">
					<div class="post-bgtop">
						<div class="post-bgbtm">
							<h2 class="title"><a href="#">Lorem ipsum sed aliquam</a></h2>
							<p class="meta"><span class="date">Sunday, January 26, 2011</span> 7:27 AM Posted by <a href="#">Someone</a></p>
							<div class="entry">
								<p>Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec   consectetuer. Donec ipsum. Proin imperdiet est. Phasellus <a href="#">dapibus semper urna</a>. Pellentesque ornare, orci in consectetuer hendrerit, urna elit eleifend nunc, ut consectetuer nisl felis ac diam. Etiam non felis. Donec ut ante. In id eros.</p>
								<p>Mauris vitae nisl nec metus placerat consectetuer. Donec ipsum. Proin imperdiet est. Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer. Donec ipsum. Proin imperdiet est. Phasellus <a href="#">dapibus semper urna</a>. Pellentesque ornare, orci in consectetuer hendrerit, urna elit eleifend nunc, ut consectetuer nisl felis ac diam. </p>
							</div>
						</div>
					</div>
				</div>
				<div class="post">
					<div class="post-bgtop">
						<div class="post-bgbtm">
							<h2 class="title"><a href="#">Lorem ipsum sed aliquam</a></h2>
							<p class="meta"><span class="date">Sunday, January 26, 2011</span> 7:27 AM Posted by <a href="#">Someone</a></p>
							<div class="entry">
								<p>Mauris vitae nisl nec metus placerat consectetuer. Donec ipsum. Proin imperdiet est. Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer. Donec ipsum. Proin imperdiet est. Phasellus <a href="#">dapibus semper urna</a>. Pellentesque ornare, orci in consectetuer hendrerit, urna elit eleifend nunc, ut consectetuer nisl felis ac diam. </p>
								<p> In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer. Donec ipsum. Proin imperdiet est. Phasellus <a href="#">dapibus semper urna</a>. Pellentesque ornare, orci in consectetuer hendrerit, urna elit eleifend nunc, ut consectetuer nisl felis ac diam. </p>
							</div>
						</div>
					</div>
				</div>
			</div>

Po nahrazení bude vypadat takto:

<div id="content">
<?php if (have_posts()) : /* existují příspěvky pro danou stránku */ ?>
 
		<?php while (have_posts()) : the_post(); /* zpracuj následujícím kódem každý jeden příspěvek */ ?>
 
			<div <?php post_class() /* přidá třídu */ ?> id="post-<?php the_ID(); ?>">
				<h2><a href="<?php the_permalink() /* trvalý odkaz na příspěvek */?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); /* titulek příspěvku */ ?></a></h2>
				<small><?php the_time('j. F. Y') /* datum publikace */ ?> <!-- by <?php the_author() ?> --></small>
 
				<div class="entry">
					<?php the_content('Celý článek &raquo;'); /* to nejdůležitější, zobrazí obsah příspěvku*/ ?>
				</div>
 
				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Categories: <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
			</div>
 
		<?php endwhile; /* konec zpracování každého jednoho příspěvku */ ?>
 
		<div class="navigation">
			<div class="alignleft"><?php next_posts_link('&laquo; Další články') ?></div>
			<div class="alignright"><?php previous_posts_link('Předchozí články &raquo;') ?></div>
		</div>
 
	<?php else : /* žádné příspěvky pro danou stránku neexistují */ ?>
 
		<h2 class="center">Not Found</h2>
		<p><?php _e('Sorry, no posts matched your criteria.'); /* chybová hláška */ ?></p>
		<?php get_search_form(); /* přidá vyhledávací formulář */ ?>
 
	<?php endif; ?>
</div>

Závěrem

Tímto způsobem vytvořená šablona nebude využívat všech možností WordPressu. Bude jen a pouze zobrazovat obsah, který vytvoříte přes administraci (a to dokonce jen a pouze na příspěvky). Zobrazování seznamu kategorií, widgetized sidebar, uživatelsky vytvořená menu a další ze skvělých funkcí WordPressu se musí ještě dokódovat.

Stejně tak je tato šablona stejná pro všechny druhy obsahu (příspěvek, vyhledávání, rubrika, titulní stránka). Pro různá zobrazení pro různé druhy obsahu je nutné šablony rozdělit na více souborů.

To všechno bude ale obsahem až příštího článku.

Update:
Přečtěte si také druhý díl

Reference a další čtení:

http://codex.wordpress.org/Templates
http://codex.wordpress.org/Theme_Development
http://codex.wordpress.org/Site_Design_and_Layout
http://codex.wordpress.org/Template_Hierarchy
http://codex.wordpress.org/Template_Tags
http://codex.wordpress.org/The_Loop

Vytvoření WordPress šablony z vašeho statického HTML webu – 2.díl

V přechozím článku jsem vysvětloval, jak zajistit aspoň základní funkcionalitu šablony. Tento článek na předchozí navazuje a ukážu v něm, jakým způsobem přidat možnost rozdílných zobrazení pro titulní stránku, stránku příspěvku a stránku kategorie, jak přidat widgetized sidebar a podporu pro uživatelská menu.

Přečtěte si také: První díl věnovaný úvodu do vytváření WordPress šablon ze statického HTML

Rozdílné zobrazení pro příspěvek, kategorii a titulní stránku

WordPress umožňuje použít pro různé druhy obsahu užít různé soubory šablony a tím snadno zajistit rozdílné zobrazení. Ovšem snad všechny webové stránky mají nějaké části společné, minimálně jde o hlavičku a patičku. WordPress na to pamatuje a umožňuje vytvořit samostatný soubor s patičkou a s hlavičkou, a to v širším smyslu. Čili nejde jen o sekci <head>, ale také o grafické záhlaví, popřípadě i navigační menu.

header.php a footer.php

Pro to, abychom při změně záhlaví webu nemuseli vždy měnit více souborů, ale změnu sme mohli provést jen na jednom souboru, máme k dispozici soubor header.php a funkci get_header();

V našem demonstračním HTML kódu se bude na většině podstránek opakovat celé záhlaví (navigační menu a fialový obdélník s logem), včetně sekce <head>. Čili ze souboru index.php můžeme do nově vytvořeného souboru header.php přesunout celou následující část zdrojového kódu:

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License
 
Name       : Perplex  
Description: A two-column, fixed-width design for 1024x768 screen resolutions.
Version    : 1.0
Released   : 20110110
 
-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><?php bloginfo('name'); ?> <?php wp_title(); ?></title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="<?php bloginfo('template_url'); ?>/style.css" rel="stylesheet" type="text/css" media="screen" />
<?php wp_head(); ?>
</head>
<body>
<div id="header">
	<div id="menu">
		<ul>
			<li><a href="#" class="first">Homepage</a></li>
			<li class="current_page_item"><a href="#">Personal Blog</a></li>
			<li><a href="#">About Us</a></li>
			<li><a href="#">Contact Us</a></li>
		</ul>
	</div>
	<!-- end #menu -->
</div>
<!-- end #header -->
<div id="logo">
	<h1><a href="#">Perplex </a></h1>
	<p><em> template design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a></em></p>
</div>
<hr />
<!-- end #logo -->

A do nově vytvořeného souboru footer.php zas následující část:

<div id="footer">
	<p>Copyright (c) 2011 Sitename.com. All rights reserved. Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>.</p>
</div>
<!-- end #footer -->
<?php wp_footer(); ?>
</body>
</html>

Na místo, kde v souboru index.php byly přesunuté části, umístíme php funkce get_header() pro volání souboru s hlavičkou a get_footer() pro volání souboru s patičkou. A jelikož tyto obě části byly na začátku, respektive na konci kódu, umístíme tato volání na začátek souboru, respektive konec souboru.

Čili soubor index.php bude vypadat, na našem demonstračním HTML, takto:

<?php get_header(); ?>
<div id="page">
	<div id="page-bgtop">
		<div id="page-bgbtm">
<div id="content">
<?php if (have_posts()) : /* existují příspěvky pro danou stránku */ ?>
 
		<?php while (have_posts()) : the_post(); /* zpracuj následujícím kódem každý jeden příspěvek */ ?>
 
			<div <?php post_class() /* přidá třídu */ ?> id="post-<?php the_ID(); ?>">
				<h2><a href="<?php the_permalink() /* trvalý odkaz na příspěvek */?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); /* titulek příspěvku */ ?></a></h2>
				<small><?php the_time('j. F. Y') /* datum publikace */ ?> <!-- by <?php the_author() ?> --></small>
 
				<div class="entry">
					<?php the_content('Celý článek &raquo;'); /* to nejdůležitější, zobrazí obsah příspěvku*/ ?>
				</div>
 
				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Categories: <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
			</div>
 
		<?php endwhile; /* konec zpracování každého jednoho příspěvku */ ?>
 
		<div class="navigation">
			<div class="alignleft"><?php next_posts_link('&laquo; Další články') ?></div>
			<div class="alignright"><?php previous_posts_link('Předchozí články &raquo;') ?></div>
		</div>
 
	<?php else : /* žádné příspěvky pro danou stránku neexistují */ ?>
 
		<h2 class="center">Not Found</h2>
		<p><?php _e('Sorry, no posts matched your criteria.'); /* chybová hláška */ ?></p>
		<?php get_search_form(); /* přidá vyhledávací formulář */ ?>
 
	<?php endif; ?>
</div>
<div id="sidebar">
				<ul>
					<li>
						<h2>Bibendum  ornare </h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
						</ul>
					</li>
					<li>
						<h2>Pellenteque ornare </h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
						</ul>
					</li>
					<li>
						<h2>Turpis nulla</h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
						</ul>
					</li>
				</ul>
			</div>
			<!-- end #sidebar -->
		</div>
	</div>
</div>
 
 
<?php get_footer; ?>

Rozdělení šablony pro jednotlivé druhy obsahu

Tak a když nyní máme oddělenou hlavičku a patičku webu, která tak zůstane vždy stejná na celém našem webu, můžeme přistoupit k samotné diferenciaci.

Přidělování jednotlivých souborů šablon probíhá dle následujícího vzorce graficky znázorněného na stránkách codexu: http://codex.wordpress.org/Template_Hierarchy#Visual_Overview

Z tohoto vzorce vyplývá, že pokud budeme chtít jiné zobrazení pro příspěvek, stačí nakopírovat soubor index.php a přejmenovat jej na single.php, provést požadované úpravy, třeba odstranění odkazu z nadpisu <h2> v rámci cyklu (the loop), a soubor uložit. Obdobně pro kategorii můžeme vytvořit soubor category.php a pro stránku page.php.

Toto lze navíc rozšířit o tzv. slugy, tedy speciální zobrazení pro konkrétní příspěvek, konkrétní stránku a konkrétní kategorii. Viz jeden z mých předchozích článků věnovaný této problematice.

Ze schématu dále vyplývá, že všechny neexsitující soubory mají fallback na index.php (to je důvod, proč nám u minimální šablony stačí právě tento soubor).

Widgetized sidebar

Další specialitkou WordPressu je widgetized sidebar, který umožňuje uživatelům vkládat jednoduše do postranního panelu nejrůznější informace a ovládací prvky.

Pro zpřístupnění tohoto mechanismu budeme potřebovat zavés vedle již existujících souborů WordPress šablony (header.php, footer.php, index.php, style.php a popřípadě single.php, page.php či category.php) další soubor a sice speciální soubor s názvem functions.php, který může obsahovat funkce rozšiřující funkcionalitu WordPressu.

Po vytvoření tohoto souboru v adresáři naší WordPress šabony do něj umístíme, pro zprovozněnní widgetized sidebaru následující kód:

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
if ( function_exists('register_sidebar') ) {
register_sidebar(array(
	'name' => 'Můj Sidebar', //název sidebaru zobrazující se v administraci
	'id' => 'sidebar-$i', //id sidebaru pro možnost stylování pomocí css
	'description'=> 'Můj sidebar', //popisek sidebaru
	'before_widget' => '<li>', //do jakého kódu obalit každý widget - otevírací kód
	'after_widget' => '</li>', //uzavírací kód každého widgetu
	'before_title' => '<h2>', //obal pro nadpis widgetu v sidebaru - uvozovací kód
	'after_title' => '</h2>' ));   //obal pro nadpis widgetu v sidebaru - ukončovací kód
}
?>

Tím si tedy v administraci zpřístupníme sidebar s názvem Sidebar a můžeme do něj přidávat widgety. Ale to ještě není všechno. Ještě potřebujeme sidebar nějak zobrazit. K tomu slouží následující kód, kde v uvozovkách u funkce dynamic_sidebar() je název definovaný ve functions.php :

<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Můj Sidebar') ) : ?>
<!--Zde lze vložit obsah, který se zobrazí v případě, že sidebar nebude naplněn widgety-->
<?php endif; ?>

Čili pakliže někam vložíte tento ḱód, budou se v něm zobrazovat widgety, které nastavíte skrze administraci.

V našem demonstračním ḱódu to bude vypadat takhle (vynechal jsem obsah nad elementem div s id=”sidebar”)

<?php get_header(); ?>
<div id="sidebar">
				<ul>
					<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('Můj Sidebar') ) : ?>
					<li>
						<h2>Bibendum  ornare </h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
						</ul>
					</li>
					<li>
						<h2>Pellenteque ornare </h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
						</ul>
					</li>
					<li>
						<h2>Turpis nulla</h2>
						<ul>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
							<li><a href="#">Velit semper nisi molestie</a></li>
							<li><a href="#">Eget tempor eget nonummy</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Nec metus sed donec</a></li>
							<li><a href="#">Magna lacus bibendum mauris</a></li>
						</ul>
					</li>
				<?php endif; ?>
				</ul>
			</div>
			<!-- end #sidebar --> 
<?php get_footer; ?>

No a to je pro zfunkčnění widgetized sidebaru vše. Snad jen ještě pro doplnění upřesním, že stejně jako jsme z hlavního souboru (index.php, single.php a podobně) vyjmuli hlavičku s patičkou, můžeme vyjmout i sidebar. A to jednoduše tak, že veškerý kód, který by se měl v šabloně opakovat a jenž tvoří sidebar, umístíme do souboru sidebar.php (v našem případě od div s id=”sidebar” až po komentář &lt– end #sidebar –>. A namísto vyjmuté části kódu umístíme volání WordPress funkce get_sidebar

<?php get_sidebar(); ?>

Uživatelské navigační menu

WordPress od verze 3.0 umožňje skrze administraci jednoduše vytvářet navigační menu. Ovšem šablona musí tuto funkcionalitu podporovat. Nyní si ukážeme, jak toto zprovoznit i v naší šabloně.

Při “porcování” šablony do jednotlivých souborů se nám navigační menu dostalo do souboru s hlavičkou (header.php). Tam tedy budem provádět úpravy. Ale až poté, co funkci navigačních menu zprovozníme v nám již známém souboru functions.php. Kód pro functions.php:

<?php if ( function_exists( 'register_nav_menu' ) ) {
	register_nav_menu( 'top-menu', 'Hlavní menu' );
} ?>

To co je důležité, jsou parametry WordPress funkce register_nav_menu. Prvním parametrem je umístění menu (bez mezer) a druhým je popis menu. Popis se používá při zobrazení v administraci, umístění je pro vnitřní potřeby šablony. Víc do functions.php přidávat nemusíme.

Dalším krokem je nahrazení doposud statického menu v hlaviče za dynamické. Nahradíme tedy celý kód menu jednou WordPress funkcí a sice funkcí wp_nav_menu, přičemž parametr theme_location se musí shodovat s prvním parametrem funkce register_nav_menu z functions.php. Parametr menu_id nastavuje atribut id našeho menu, depth ovlivňuje počet úrovní, které se mají vypsat a echo zajistí, že menu bude vypsáno. Více parametrů je v dokumentaci funkce wp_nav_menu:

<?php wp_nav_menu('theme_location=top-menu&menu_id=top-menu&depth=1&echo=1'); ?>

Více o problematice naleznete tradičně v codexu:
http://codex.wordpress.org/Navigation_Menus

Závěrem

Tento navazující článek (přečtěte si také první díl) snad již vyčerpal téma základy tvorby WordPress šablon. V současnosti mě nenapadá, co by případně melo být obsahem dalšího dílu, jelikož všechny další úpravy šablon jsou již velmi specifické. Ale pokud vás nějaká tematika zajímá, nestyďte se a přihlašte se o ní v diskusi pod článkem.

Jak získat post ID mimo loop

Získat ID aktuálního příspěvku mimo loop se může někdy hodit. Jak na to?

Tak záleží na tom jak s ID potřebujeme nakládat. Mimo loop můžeme na šabloně zobrazující pouze jeden příspěvek (typicky single.php nebo sidebar této šablony) přistupovat přímo k objektu $post

$postID = $post->ID;

Jde ale o globální proměnnou, proto, když k ní chceme přistupovat z nějaké funkce, musíme se k ní dle toho zachovat:

function moje_funkce(){
  global $post;
  $postID = $post->ID;
}

Jak jsem výše zmínil, takto lze bezprobémově přistupovat pouze k ID příspěvku při zobrazení na single.php. Pokud tedy chceme pracovat s ID aktuálního příspěvku například v sidebaru, který se ale zobrazuje i na výpise kategorie, neměli bychom zapomenou na ošetření našeho kódu:

if ( is_single() ) {
  $postID = $post->ID;
}

No a snad jen již pro úplnost, k objektu $post lze přistupovat i krkolomějším způsobem přes objekt $wp_query, který objekt post obsahuje:

global $wp_query;
$postID = $wp_query->post->ID;

Vytváření a úpravy menu s využitím „Walkeru“

Once you have created a menu at your wordpress backend at Appearance > Menus you can use a wordpress function called „wp_nav_menu()“:http://codex.wordpress.org/Function_Reference/wp_nav_menu within your template files to display those menus.

When you are at the Appearance > Menus Site you need to look at the top right and you will notice a “Screen Option” tab. Click it and you will get the option to display several other input fields for each menu item, among them a checkbox to show the description.

A special “Walker” class iterates over each data record and then displays this record accordingly. We can simply create our own custom walker extending that PHP class. That way we dont need to care about fetching the stuff from the database or preparing the data arrays. We only need to extend the part of the wordpress code that outputs the list to functions.php file and add the code

class description_walker extends Walker_Nav_Menu

After we have created a custom walker we only need to tell wordpress that it should use our walker instead of its own. This can be easily done by calling the „wp_nav_menu()“:http://codex.wordpress.org/Function_Reference/wp_nav_menu with the walker parameter set.

Zdroj: „Improve your WordPress Navigation Menu Output“:http://www.kriesi.at/archives/improve-your-wordpress-navigation-menu-output

Nastavení počtu revizí a smazání revizí příspěvků

**Delete-Revision**
„http://wordpress.org/extend/plugins/delete-revision/“:http://wordpress.org/extend/plugins/delete-revision/

V *Nastavení > Delete-Revision > Check Redundant Revision* pak lze vymazat zbytečné revize.

**Revision Control**
„http://wordpress.org/extend/plugins/revision-control“:http://wordpress.org/extend/plugins/revision-control

**Optimize Database after Deleting Revisions**
„http://wordpress.org/plugins/rvg-optimize-database/“:http://wordpress.org/plugins/rvg-optimize-database/

One Click WordPress Database Cleaner / Optimizer.

**Řešení bez použití pluginů:**

v souboru wp-config.php možno nastavit
/—code php
// vypne revize
define(‚WP_POST_REVISIONS‘, false );

// ukládá jen definovaný počet revizí
define(‚WP_POST_REVISIONS‘, 2);

// nastaví interval ukládání ve vteřinách
define(‚AUTOSAVE_INTERVAL‘, 60 );
\—

**PHP skript pro hromadné smazání všech revizí :**

/—code php

\—

**Ev. v Myadminu jen SQL příkazem :**

/—code php
DELETE FROM wp_posts WHERE post_type=’revision‘
\—

Integrace Google Analytics

Pro integraci kódu Google analytics existuje „celá řada pluginů“:http://wordpress.org/extend/plugins/tags/google-analytics, nicméně čím méně pluginů je nainstalováno, tím lépe (rychlost, zabezpečení). Dobré řešení je proto vložit kód GA přímo do souboru **functions.php** (Vzhled > Upravit soubory)

/—code php
// Google Analytics Tracking Code
function add_google_analytics() {
?>


Jak vytvořit vlastní (odvozenou) šablonu (child theme)

Snad každý, kdo si nainstaluje WordPress se dřív nebo později pokusí udělat do šablony nějaký zásah. Ovšem nikdy nezasahujte do defaultní šablony (u WordPressu 3.0 a vyšším jde o šablony Twenty Ten v adresáři twentyten). V případě problémů tak budete mít jistotu, že máte šablonu, na kterou můžete přepnou a mít aspoň základní funkční web.

Pro jednodušší úpravy si vytvořte odvozenou šablonu ( Child theme)

V adresáři /wp-content/themes se při defaultní instalaci bez dodatečných šablon nachází jen adresář twentyten s defaultní šablonou. Na této úrovni si vytvořte nový adresář (složku) s názvem vlatní šablony. Třeba “sablona” (vyvarujte se háčkům a čárkám, pro jistotu).

style.css je základ, víc nic nepotřebujete

K vytvoření vlastní odvozené šablony vám stačí jeden jediný soubor v této složce. A sice soubor s názvem “style.css” (malým písmem).

Do tohoto souboru vložíte následující kód:

/*
Theme Name: Šablona
Theme URI: http: //priklad.cz/
Description: Vlastní šablona odvozená od Twenty Ten
Author: Vaše jméno
Author URI: http: //vase-homepage.cz
Template: twentyten
Version:  0.1.0
*/

Theme name je název vaší šablony, ten si zvolte libovolný (pakliže ste si vytvářeli vlastní šablonu z dříve modifikované šablony, přjemenujte si ji tak, aby název byl odlišný od “Twenty Ten”)
Theme URI je adresa vašeho tématu, pokud byste jej třeba někde propagovali a udělali pro něj vlastní webovou stránku, tak zde by byla adresa této propagační stránky. Někdy se také uvádí stránka pro kterou je šablona dělána
Description je popis tématu. Čím bylo inspirováno a podobně
Author: vaše jméno, vašich 15 vteřin slávy ;)
Author URI: pakliže máte nějakou vlastní webovou stránku, šup sem s ní :)
Template: jediný povinný řádek, který nelze vynechat. Musí obsahovat adresář ve kterém je šablona od které je ta vaše odvozena. Pozor, tato položka je case-sensitive (čili je rozdíl mei malými a velkými písmeny)
Version: verze vaší šablony. Buď rovnout 1.0 nebo raději opatrně začněte s 0.1 :)

Opravdu si dejte pozor na položku Template. Ověřte, jestli máte správný název adresáže původní šablony a jestli tato šablona v daném adresáři skutečně je. Pakliže třeba s šablonou nějak manipulujete, může se stát, že šablonu nakopírujete o úroveň níže ( wp-content/themes/twentyten/twentyten ) a pak vám odvozená šablona nebude fungovat.

Dále do souboru style.css patří ještě jeden řádek. A sice tento:

@import url("../twentyten/style.css");

Kde namísto twentyten uvedete stejnou hodnotu, jako u parametru Template. Proč vkládáme tento řádek? Inu proto, že soubor style.css odvozené šablony úplně nahrazuje ten ze šablony původní.Čili, pakliže byste tento řádek nevložili, z původní šablony by se nenahrály vůbec žádné css styly. A to dost pravděpodobně nechcete.

Po tomto řádku již můžete vesele vkládat vlastní styly. Pro orientaci je ještě dobré připomenout, že css má tu vlastnost, že později definované styly přepisují ty dříve uvedené. Tedy, pokud změníte barvu nadpisů h2 v tomto souboru, nepoužije se hodnota nadefinovaná v css původní šablony, i když je celý jeho obsah, díky výše uvedenému řádku, namportován.

functions.php na rozšíření funkcionality

Vedle souboru style.css, který je základním kamenem každé šablony, má spefické vlastnosti ještě soubor functions.php. Jde o soubor, ve kterém uživatel může rozšiřovat funkcionalitu šablony o vlasní funkce. Může si vytvořit vlastní funkce prakticky na cokoli. Mnohé tipy na to co a jak udělat spoléhají právě na tento soubor.

To, co byste měli vědět je to, že tento soubor nepřepisuje soubor functions.php původní šablony, ale načítá se spolu s ním. Přesněji řečeno těsně před ním. Lze tedy nelze takto redeklarovat funkce uvedené v původní šabloně, ale je možné je ve vaší odvozené šabloně bez dalšího užít.

Další soubory odvozené šablony

Tyto dva soubory vám již bohatě stačí k proměně vzhledu a funkcionality šablony. Ovšem můžete chtít také změnit způsob výpisu zobrazení článku, nebo stránky, kategorie či rovnou úvodní stránky. I toto odvozená šablona zvládne. Pakliže adresář odvozené šablony obsahuje nějaký soubor (vyjma style.css a functions.css), který je také v původní šabloně, použije se namísto původního ten, který je obsažený v odvozené šabloně. A pakliže soubor, který by se normálně použil v odvozené šabloně naopak není, použije se ten, který je v šabloně původní. A to je přeci geniální, nemusíte myslet na všechny soubory a jen si měnit to, co přesně potřebujete.

Takže když budete chtít upravit výpis článku, jednoduše si do adresáře své odvozené šablony nakopírujete soubor single.php z původní šablony a začnete editovat. Nic víc, nic míň.

Ještě zde pro vás uvedu jeden velmi důležitý diagram. Ten ukazuje jak WordPress vybírá soubory pro zobrazení konkrétní stránky (příspěvku, rubriky, stránky, stránky s výsledkama hledání a podobně). Všimněte si, že vše má fallback na index.php. Čili, pokud vaše původní šablona některý ze souborů, který byste chtěli editovat nemá, vezměte druhý či třetí, a tak dále, v pořadí, pokud existuje, a pakliže ne, vždy můžete sáhnout po index.php a ten přejmenovat na vámi požadovaný soubor (single.php, page.php, category.php, search.php a tak dále a tak dále).

Zdroj: http://www.wp-tricks.co.il/

Co dělat, když už jste do defaultní šablony zasáhli? Jak z takové šablony udělat odvozenou?

To se stává často. Ale i toto má své řešení. Stáhněte si znovu vaší instalaci WordPressu (anglicky: http://wordpress.org/, nebo česky: http://cs.wordpress.org/), rozbalte archív a v adresáři wp-content/themes uvidítě původní šablonu. Adresář s šablonou přejmenujte na twentyten2 a nakopírujte jej do vaší instalace na serveru do složky wp-content/themes. V administraci aktivujte tuto staronovou šablonu. Bude mít stejný název, ale v šedivém obdélníčku následujícím za větou: “Všechny soubory této šablony jsou uloženy v” uvidíte “themes/twentyten2″.

Poté můžete již přejmenovat adresář vaší šablony (z twentyten) na vlastní název a změnit název šablony v souboru style.css (řádek Theme name). Nyní musíte v administraci opět aktivovat tuto vaší šablonu (již se bude zobrazovat  pod vaším jménem). Po její úspěšné aktivaci přejmenujte adresář “twentyten2″ na “twentyten”. Tím umožníte budoucí aktualizaci této šablony v novějších verzích WordPressu.

No a nyní již zpět k vaší odvozené šabloně. Do souboru style.css přidejte řádek “Template: twentyten”. Samozřejmě můžete veškerý další obsah souboru style.css smazat a nahradit jej importovacím řádkem. Dalším důležitým krokem je smazání všech funkcí v souboru functions.php (pakliže neobsahuje nějaké vámi definované, ty můžete zachovat). No a poté už můžete mazat všechny soubory, které jste doposud neupravili. Pakliže ste neupravovali soubor 404.php a víte, že jej upravovat ani nebudete, klidně jej smažte. Obdobně pro všechny soubory, které jste neupravovali, ani upravat chtít nebudete.

A kde je nějaká výhoda odvozených šablon?

Možná se ptáte, proč podstupovat toto martýrium a proč si rovnou nenakopírovat celý adresář twentyten do vlastního názvu a nepřepsat název šablony ve style.css a mít tak již kompletní šablonu a neupravovat ji komplet?

Odvozené šablony vám umožní bezpečný upgrade vaší původní šablony. Pakliže budoucí verze WordPressu upgraduje šablonu Twenty Ten, bude vaše odvozená šablona čerpat upgradovaný soubor functions.php, upgradovaný index.php (pakliže nemáte vlastní) a také upgradovaný style.css. Totéž platí o šabloně, kterou si někde koupíte a její autor vydá další, třeba opravnou, verzi. Můžete si poté upgradovat původní šablonu bez toho, anižbyste přišli o své úpravy. Jde tedy především o bezpečnou úpravu šablon.

Reference:

http://codex.wordpress.org/Child_Themes

http://codex.wordpress.org/Template_Hierarchy

Vlastní Walker pro vaše šablony

WordPress Funkce na procházení více položek, wp_nav_menu, wp_list_categories, wp_list_pages, wp_list_comments a další, mají mezi svými parametry také jeden, který je, a často i zůstává, pro uživatele tak trochu zahalen tajemstvím. Jde o parametr “walker”.

Jako modelovou, pro tento článek, jsem si vybral funkci wp_list_categories(), která prochází kategorie a ty posléze, dle v parametrech předaných pravidel, vypisuje, ale také třeba jen vrací (pomocí parametru echo). Skrce parametry této funkce můžeme změnit kde co. Můžeme nechat vypsat i prázdné kategorie, můžeme ovlivnit pořadí výpisu, to, jestli se kategorie vypíší jako seznam nebo ne, jestli zobrazíme počet příspěvků v kategorii a tak dále a tak dále.

Tvůrci WordPressu se nám snažili případnou editaci co možná nejvíc zpříjemnit. Ovšem někdy ani tato široká škála možností nestačí a tvůrce si s parametry nevystačí. V tom případě přichází na řadu vytváření vlastního Walkeru.

Jaké Walkery jsou ve WordPressu dostupné

Walker je třída, jenž zajišťuje procházení více položek a jejich výpis či vracení do proměnné. Všechny WordPress Walkery (Walker_Comment, Walker_CategoryDropdown, Walker_PageDropdown, Walker_Page, Walker_Category, Walker_nav_menu) jsou odvozené od původní třídy Walker, kterou rozšiřují (extends) o nové funkce.
Walkery Walker_Category, Walker_Page, Walker_PageDropdown a Walker_CategoryDropdown jsou umístěny v souboru wp-includes/classes.php. Walker_Comment je v souboru wp-includes/comment-template.php a Walker_nav_menu je v souboru wp-includes/nav-menu-template.php.

Poznámka: Pro potřeby administrace existují ještě další Walkery a jsou definované v souborech wp-admin/includes/template.php (Walker_Category_Checklist) a wp-admin/includes/nav-menu.php (Walker_Nav_Menu_Edit, Walker_Nav_Menu_Checklist). Z nich můžete čerpat inspiraci pro vaše úpravy walkerů.

Vytváříme vlastní Walker

Pakliže chceme takový Walker modifikovat, musíme si vytvořit nový, který bude rozšiřovat (extend) již nějaký existující. A to buď původní Walker, nebo již nějaký, který jej rozšiřuje (extends). Jak na to.

V souboru functions.php naší šablony (pakliže jej vaše šablona ještě nemá, klidně jej vytvořte) vytvoříme novou třídu (class), která bude rozšiřovat (extends) nějaký Walker. Jak jsem psal, budeme se zde modelově zabývat rošiřováním Walkeru funkce wp_list_categories(). Tento Walker je definován v souboru wp-includes/classes.php na řádku 1283

Tato třída definuje 4 funkce, a sice: start_lvl, end_lvl, start_el a end_el. Funkce start_lvl se volá, když některá kategorie má subkategorie a tyto se mají vypsat hierarchicky, end_lvl se zas vykoná když se dojde za poslední položku hierarchicky vypsané subkategorie, start_el se volá vždy, když se zpracovává nová položka, a end_el, když se ukončilo zpracování každé položky.

Když budeme chtít například upravit způsob výpisu jednotlivých položek bude nám stačit, když námi nově vytvořená třída bude definovat jen funkci start_el. Nic víc není třeba. Samozřejmě je možné, upravovat více, nebo dokonce všechny funkce.

Čili v souboru functions.php si nadefinujeme novou třídu rozšiřující Walker_Category.

class Vlastni_Walker extends Walker_Category {
...
}

A do této třídy si můžeme nakopírovat funkce, které chceme upravit.

class Vlastni_Walker extends Walker_Category {
function start_el(&amp;$output, $page, $depth, $args, $current_page) {
		if ( $depth )
			$indent = str_repeat("\t", $depth);
		else
			$indent = '';
 
		extract($args, EXTR_SKIP);
		$css_class = array('page_item', 'page-item-'.$page-&gt;ID);
		if ( !empty($current_page) ) {
			$_current_page = get_page( $current_page );
			if ( isset($_current_page-&gt;ancestors) &amp;&amp; in_array($page-&gt;ID, (array) $_current_page-&gt;ancestors) )
				$css_class[] = 'current_page_ancestor';
			if ( $page-&gt;ID == $current_page )
				$css_class[] = 'current_page_item';
			elseif ( $_current_page &amp;&amp; $page-&gt;ID == $_current_page-&gt;post_parent )
				$css_class[] = 'current_page_parent';
		} elseif ( $page-&gt;ID == get_option('page_for_posts') ) {
			$css_class[] = 'current_page_parent';
		}
 
		$css_class = implode(' ', apply_filters('page_css_class', $css_class, $page));
 
		$output .= $indent . '
 
	<li class="' . $css_class . '"><a title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page-&gt;post_title, $page-&gt;ID ) ) ) . '" href="' . get_page_link($page-&gt;ID) . '">' . $link_before . apply_filters( 'the_title', $page-&gt;post_title, $page-&gt;ID ) . $link_after . '</a>';
 
		if ( !empty($show_date) ) {
			if ( 'modified' == $show_date )
				$time = $page-&gt;post_modified;
			else
				$time = $page-&gt;post_date;
 
			$output .= " " . mysql2date($date_format, $time);
		}
	}
}</li>

A můžeme se pustit do upravování. Provádět si můžeme prakticky cokoli. Když budeme s úpravami hotovi a spokojeni, stačí již jen zavolat funkci wp_list_categories() s patřičným parametrem.

1
wp_list_categories( array( 'walker' => new Vlastni_Walker() ) );

Samozřejmě můžeme redefinovat také všechny funkce, která třída Walker_Category dědí od původní třídy Walker. Tato třída je definována opět v souboru wp-include/classes.php, tentokráte na řádku 742. Jde o funkce, kromě těch čtyrech již zmíněných, display_element(), walk(), paged_walk(), get_number_of_root_elements() a unset_children().

Jak upravit výstup funkce wp_head()

funkce wp_head() slouží ke spouštění akcí (actions), které musí být vykonány v hlavičce. Jde například o generování odkazů na styly pluginů. Bez této funkce by pluginy neměly šanci do hlavičky svůj kód procpat a nutily by, při instalaci, uživatele k úpravě hlavičky.

Samozřejmě je tato funkce také využívána wordpressem samotným ke generování kódu, který využívá. Někdy je tento kód užitečný a žádoucí, jindy ne. Když shledáte, že kód žádnoucí není, což je možné říci například o meta tagu “generator”, který komukoli bez skupulí oznámí verzi wodpressu. Toho pak může například využít potencionální útočník.

Pakliže chcete některé informace, které hlavička generuje odstranit, máte v zásadě dvě možnosti. Buď použít plugin, nebo přidat pár řádků kódu do functions.php.

Plugin Clean up wp_head

Řešením tohoto problému se zabývá plugin Clean up wp_head. Ke stažení zde: http://wordpress.org/extend/plugins/clean-up-wp-head/

Po nainstalování vám v sekci “Nastavení” přibude položka “Clean up wp_head”, kde si již jednoduchým zaškrtáváním navolíte co zobrazit a co ne.

Řešení skrze functions.php

Pakliže nejste fanouškem pluginů, máte omezené zdroje (php memory limit), chcete nastavení mít zakomponované přímo v šabloně pro snadný přenost na jiné servery a nebo k tomu máte jakýkoli jiný důvod, můžete využít úpravy souboru functions.php v adresáři vaší wordpress šablony. Pakliže vaše šablona tento soubor nemá, jednoduše jej vytvořte.

Příprava

K odstraňování zobrazených souborů využijeme funkci remove_action(). Seznam akcí, přiřazených funkci wp_head() je k nahlédnutí v souboru wp-includes/default-filters.php. Zde uvádím upravený výpis části tohoto souboru (odstranil jsem z posloupnosti řádky, které pro další výklad nejsou důležité):

add_action( 'wp_head',             'wp_enqueue_scripts',            1     );
add_action( 'wp_head',             'feed_links',                    2     );
add_action( 'wp_head',             'feed_links_extra',              3     );
add_action( 'wp_head',             'rsd_link'                             );
add_action( 'wp_head',             'wlwmanifest_link'                     );
add_action( 'wp_head',             'index_rel_link'                       );
add_action( 'wp_head',             'parent_post_rel_link',          10, 0 );
add_action( 'wp_head',             'start_post_rel_link',           10, 0 );
add_action( 'wp_head',             'adjacent_posts_rel_link_wp_head', 10, 0 );
add_action( 'wp_head',             'locale_stylesheet'                    );
add_action( 'wp_head',             'noindex',                       1     );
add_action( 'wp_head',             'wp_print_styles',               8     );
add_action( 'wp_head',             'wp_print_head_scripts',         9     );
add_action( 'wp_head',             'wp_generator'                         );
add_action( 'wp_head',             'rel_canonical'                        );
add_action( 'wp_head',             'wp_shortlink_wp_head',          10, 0 );

Snad jen pro úplnost dodám, že add_action má jako první parametr funkci, na kterou se má nová funkce pověsit (hook) (viz seznam takových funkcí ), poté název funkce, která se má pověsit (hook), poté prioritu nově přidávané funkce a počet parametrů funkce. To abyste se dokázali v kódu vyznat.

Samotné odstraňování

Když už víme, co všechno je na funkci wp_head pověšené (hooked), můžeme začít s odstraňováním toho, co nechceme zobrazovat.

K tomu nám, jak již bylo řečeno, slouží funkce remove_action(). Ta má stejné parametry jako funkce add_action(). A to je důležité. K odstranění již pověšené (hooked) funkce  musíme zadat identické parametry priority a počtu argumentů funkce, jako byly zadány při přidávání této funkce pomocí add_action().

Takže co a jak odstranit. Zde je ukázka typického výstupu funkce wp_head() ze stránek david.binda.cz :

<link rel=”alternate” type=”application/rss+xml” title=”david.binda &raquo; Feed” href=”http://david.binda.cz/feed” />
<link rel=”alternate” type=”application/rss+xml” title=”david.binda &raquo; Comments Feed” href=”http://david.binda.cz/comments/feed” />
<link rel=”alternate” type=”application/rss+xml” title=”david.binda &raquo; Úvod Comments Feed” href=”http://david.binda.cz/uvod/feed” />
<link rel=”EditURI” type=”application/rsd+xml” title=”RSD” href=”http://david.binda.cz/xmlrpc.php?rsd” />
<link rel=”wlwmanifest” type=”application/wlwmanifest+xml” href=”http://david.binda.cz/wp-includes/wlwmanifest.xml” />
<link rel=’index’ title=’david.binda’ href=’http://david.binda.cz’ />
<link rel=’prev’ title=’Nabídka’ href=’http://david.binda.cz/nabidka’ />
<meta name=”generator” content=”WordPress 3.0.1″ />

No a zde je seznam remove_action funkcí odstraňující jednotlivé řádky tohoto výpisu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//odstraní odkaz (link) s parametrem rel = alternate odkazujícím na feed nejnovějších článků a komentářů
remove_action( 'wp_head', 'feed_links', 2 );
//odstraní odkaz (link) s parametrem rel = alternte odkazujícím na speciální feeds (komentáře stránky v tomto případě, ale jde i o feed rubrik, štítků a podobně)
remove_action( 'wp_head', 'feed_links_extra', 3 );
//odstraní odkaz (link) s parametrem rel = EditURI
remove_action( 'wp_head', 'rsd_link' );
//odstraní odkaz (link) na wlwmanifest (Windows Live Writer)
remove_action( 'wp_head', 'wlwmanifest_link' );
//odstraní odkaz (link) s parametrem rel = index
remove_action( 'wp_head', 'index_rel_link' );
//odstraní odkaz (link) s parametrem rel = prev a rel = next (next není ve výpisu nahoře)
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
//odstraní poslední řádek, meta tag generator
remove_action( 'wp_head', 'wp_generator' );
//odstraní odkaz (link) s parametrem rel = up (není ve výše uvedeném výpise)
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
//odstraní odkaz (link) s parametrem rel = start (není ve výše uvedeném výpisu)
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );

Takže již víte, jak odstranit odkazy (link) generované funkcí wp_head(). Já osobně, kdybych měl něco odstraňovat, bych odstranil meta tag generator, odkaz na wlwmanifest a odkaz na Really simple discovery (EditURI). Zvláště pak, pokud pravidelně neaktualizujete a chcete si vaší instalaci WordPressu udržet v bezpečí.

Reference a další užitečné odkazy:

http://codex.wordpress.org/Function_Reference/remove_action

http://codex.wordpress.org/Function_Reference/add_action

http://codex.wordpress.org/Plugin_API/Action_Reference

http://core.trac.wordpress.org/browser/tags/3.0.3/wp-includes/default-filters.php

http://adambrown.info/p/wp_hooks – sezman všech wordpress hooks