Tworzenie szablonów-skryptów w Wordpressie

Dość często zachodzi potrzeba zaprezentowania na stronie treści w jakiejś nietypowej formie. Na przykład chcemy dodać sporą ilość przepisów i chcielibyśmy mieć automatycznie tworzoną ich listę, czy oddzielny szablon dla przepisu. W CMSach zazwyczaj tworzy się nowy moduł, w Wordpressie można użyć "Stron" oraz dodatkowych szablonów w skórce. W tym artykule zaprezentuję różne formy tworzenia własnych szablonów-skryptów skórek Wordpressa. Znajomość PHP jest wymagana.

Możliwości stron w Wordpressie

Strony w Wordpressie posiadają szereg dodatkowych funkcjonalności. Dla każdej strony możemy wybrać własny szablon:
Wybór szablonu przy dodawaniu strony

Szablon to plik PHP z odpowiednim kodem znajdujący się w katalogu skórki. Określa on co i jak jest wyświetlane (i jak wygląda). Za pomocą kodu PHP można tworzyć praktycznie dowolną zawartość i funkcjonalność takiej strony (np. generować spis wpisów, podstron itd.).

Strony można przypisywać do już istniejącej podając "Rodzica". Przydaje się to gdy chcemy np. stworzyć jedną stronę jako kategorię i wiele jako jej zawartość (np. przepisy w danej kategorii). Jak wykorzystamy w szablonach ten układ zależy od nas. Przykład zaraz zaprezentuję.

Skórki i szablony

Skórki Wordpressa znajdują się w katalogu wp-content/themes/. Przykładowo w domyślnej skórce "twentyeleven" znajdziemy szablon "showcase.php" zawierający sporo przykładowego kodu. Najprostszy szkielet szablonu strony wyglądałby tak:

<?php
/**
 * Template Name: Testowy
 */
get_header(); ?>

		<div id="primary" class="showcase">
			<div id="content" role="main">

			  // tutaj nasza zawartość

			</div><!-- #content -->
		</div><!-- #primary -->

<?php get_footer(); ?>
W zależności od skórki kod HTML może się nieco różnić, ale początkowy komentarz PHP musi zawsze mieć taką formę by szablon był rozpoznawany przez Wordpressa. W tym szablonie możemy używać funkcji Wordpressa opisanych na wiki.

Przykładowe szablony-skrypty

Oto przykładowy szablon wyświetlający listę z ze stronami przypisanymi do danej strony:
<?php
/*
Template Name: Katalog stron podrzędnych
*/
?>
<?php get_header(); ?>
<div id="post-content"><div class="post-entry clearfix">
	<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
	  <h1 class="page-title"><?php the_title(); ?></h1>
	  <?php the_content(); ?>
<?php 

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page', 'nopaging' => True, 'orderby' => 'title', 'order' => 'ASC'));
$x = get_page_children( $page_id, $all_wp_pages );

print '<ul>';
foreach($x as $k)
  {
  print '<li><a href="/?page_id='.$k->ID.'">'.$k->post_title.'</a></li>';
  }
print '</ul>';
 ?>
		<?php endwhile; ?>
		<?php endif; ?>	
		</div>
            </div>
            <!-- END post-content -->
            
<?php get_sidebar(); ?>      
<div class="clear"></div>
<?php get_footer(); ?>
Na początek wywołujemy treść wpisu:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

Po tym wywołaniu możemy wyświetlić poszczególne elementy strony jak np. jej tytuł i treść: the_title i the_content. Funkcje te są opisane na wiki wordpressa. Klasa WP_Query służy do wykonywania zapytań, pobierania treści. Funkcja get_page_children zwróci listę stron dzieci względem obecnej strony (o danym ID - $page_id).

W stronach mamy też zakładkę "Własne pola", gdzie możemy podawać dodatkową treść. Np. możemy podać link do kanału RSS pod nazwą "rss", czy np. jakieś specyficzne elementy treści, które następnie wykorzystamy w szablonie. By dostać się do wartości taga strony wystarczy użyć:

<?php
$value = get_post_meta(get_the_id(), 'NAZWA_POLA', true);

Gdzie "get_the_id" to ID obecnej strony (pobieramy element meta dla wskazanej przez ID strony). Jeżeli byłby to link do kanału RSS to możemy następnie użyć SimpleXML, a jeżeli coś prostszego jak treść - to wyświetlić ją w wybranym miejscu szablonu.

Można także wykorzystać tagi jakie mogą być przypisane do wpisów. Możemy wyświetlić wpisy, które są oznaczone tagiem o identycznej nazwie co nazwa strony:
<?php
/*
Template Name: Powiązane newsy
*/
?>
<?php get_header(); ?>
        	<div id="post-content"> <div class="post-entry clearfix">
			<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        		<h1 class="page-title"><?php the_title(); ?></h1>			
			<?php the_content(); ?>
<?php 
$args = array();
$args['name__like'] = get_the_title();
$tag =  get_tags($args);

if ($tag and count($tag) > 0)
  {
  $posts = new WP_Query();
  $x = $posts->query("tag={$tag[0]->slug}&showposts=10");

  print '<h3>Ostatnie powiązane wpisy</h3><ul>';
  foreach($x as $n)
    {
    print '<li><a href="./?p='.$n->ID.'">'.$n->post_title.'</a></li>';
    }
  print '</ul>';
  print '<a href="./?tag='.$tag[0]->slug.'"><b>Zobacz wszystkie</b></a>';
  }
?>
	<?php endwhile; ?>
	<?php endif; ?>	
	</div>
	<?php comments_template(); ?>  
                
</div>
<!-- END post-content -->
<?php get_sidebar(); ?>
<div class="clear"></div>
<?php get_footer(); ?>
Dla programisty PHP możliwości tworzenia takich niestandardowych szablonów są praktycznie nieograniczone. Warto dokładnie przejrzeć udostępniane przez Wordpressa funkcje - tak by ułatwić sobie pisanie kodu.
RkBlog
Comment article
Comment article RkBlog main page Search RSS Contact