<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>bueltge.de [by:ltge.de] &#187; Template</title>
	<atom:link href="http://bueltge.de/tag/template/feed/" rel="self" type="application/rss+xml" />
	<link>http://bueltge.de</link>
	<description>Frank Bültge schreibt auf bueltge.de zu den Themen Webentwicklung &#38; design, WordPress, Literatur und andere Themen bezüglich Internet und Development</description>
	<lastBuildDate>Tue, 22 May 2012 20:02:25 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Blätterfunktion für WordPress</title>
		<link>http://bueltge.de/blatterfunktion-fur-wordpress/1236/</link>
		<comments>http://bueltge.de/blatterfunktion-fur-wordpress/1236/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 01:11:10 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1236</guid>
		<description><![CDATA[Die Blätterfunkion/ Pagination auf Webseiten hat sich schon immer bewährt und wer mit WordPress arbeitet kennt das eine oder andere Plugin für diese Lösung. Oft kommen dabei viele Funktionen für das Einstellen mit und die brauche ich eher selten. Ich nutze daher eine eigene Lösung und die möchte hier vorstellen.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://wpengineer.com/wp-content/uploads/wp-pagination2.png" alt="" title="wp-pagination2" width="138" height="41" class="size-full wp-image-2080" /><br />
Die Blätterfunkion/ Pagination auf Webseiten hat sich schon immer bewährt und wer mit WordPress arbeitet kennt das eine oder andere Plugin für diese Lösung. Oft kommen dabei viele Funktionen für das Einstellen mit und die brauche ich eher selten. Ich nutze daher eine eigene Lösung und die möchte hier vorstellen, da sie nun auch mit Parametern umgehen kann und so sollte sie in vielen Bereichen einsetzbar sein. Sie kann natürlich beliebig angepasst und für die eigenen Zwecke verändert werden.<br />
Eine schöne schlanke Alternative gibt ebenfalls bei <a href="http://playground.ebiene.de/2554/wordpress-pagebar-pluginlos/">Sergej</a> zu finden und ein Blick lohnt sicher. Er stellt auch ein Beispiel für die Formatierung bereit.<br />
<span id="more-1236"></span></p>
<h4>Beispiel Screenshots</h4>
<p><img src="http://wpengineer.com/wp-content/uploads/wp-pagination.png" alt="" title="wp-pagination" width="145" height="74" class="size-full wp-image-2079" /></p>
<h4>Die Funktion</h4>
<p>Die folgende Funktion stellt den Kern da und kann als Plugin oder im Theme, in der <code>functions.php</code> abgelegt werden. Der Code-Abschnitt im Anschluss stellt die Möglichkeit der Anpassung via Hook da, so dass man auf die Parameter zugreifen kann.</p>
<pre><code class="php">
function fb_paging_bar( $args = array() ) {
	
	$defaults = array(
		'range'           =&gt; 4,
		'custom_query'    =&gt; FALSE,
		'previous_string' =&gt; __( '&amp;laquo;&amp;laquo;&amp;laquo;', FB_GREYFOTO_TEXTDOMAIN ),
		'next_string'     =&gt; __( '&amp;raquo;&amp;raquo;&amp;raquo;', FB_GREYFOTO_TEXTDOMAIN ),
		'view_fp'         =&gt; TRUE,
		'view_lp'         =&gt; TRUE,
		'before_output'   =&gt; '&lt;div class=&quot;postlink&quot;&gt;',
		'after_output'    =&gt; '&lt;/div&gt;'
	);
	
	$args = wp_parse_args( 
		$args, 
		apply_filters( 'fb_paging_bar_defaults', $defaults )
	);
	
	$args['range'] = (int) $args['range'] - 1;
	if ( !$args['custom_query'] )
		$args['custom_query'] = @$GLOBALS['wp_query'];
	$count = (int) $args['custom_query']-&gt;max_num_pages;
	$page  = intval( get_query_var( 'paged' ) );
	$ceil  = ceil( $args['range'] / 2 );
	
	if ( $count &lt;= 1 )
		return FALSE;
	
	if ( !$page )
		$page = 1;
	
	if ( $count &gt; $args['range'] ) {
		if ( $page &lt;= $args['range'] ) {
			$min = 1;
			$max = $args['range'] + 1;
		} elseif ( $page &gt;= ($count - $ceil) ) {
			$min = $count - $args['range'];
			$max = $count;
		} elseif ( $page &gt;= $args['range'] &amp;&amp; $page &lt; ($count - $ceil) ) {
			$min = $page - $ceil;
			$max = $page + $ceil;
		}
	} else {
		$min = 1;
		$max = $count;
	}
	
	$echo = '';
	$previous = intval($page) - 1;
	$previous = esc_attr( get_pagenum_link($previous) );
	if ( $previous &amp;&amp; (1 != $page) )
		$echo .= '&lt;a href=&quot;' . $previous . '&quot; title=&quot;' . __( 'previous', FB_GREYFOTO_TEXTDOMAIN) . '&quot;&gt;' . $args['previous_string'] . '&lt;/a&gt;';
	$firstpage = esc_attr( get_pagenum_link(1) );
	
	if ( $args['view_fp'] &amp;&amp; $firstpage &amp;&amp; (1 != $page) )
		$echo .= '&lt;a href=&quot;' . $firstpage . '&quot;&gt;' . __( 'First', FB_GREYFOTO_TEXTDOMAIN ) . '&lt;/a&gt;';
	
	if ( !empty($min) &amp;&amp; !empty($max) ) {
		for( $i = $min; $i &lt;= $max; $i++ ) {
			if ($page == $i) {
				$echo .= '&lt;span class=&quot;active&quot;&gt;' . str_pad( (int)$i, 2, '0', STR_PAD_LEFT ) . '&lt;/span&gt;';
			} else {
				$echo .= sprintf( '&lt;a href=&quot;%s&quot;&gt;%002d&lt;/a&gt;', esc_attr( get_pagenum_link($i) ), $i );
			}
		}
	}
	
	if ($args['view_lp']) {
		$lastpage = esc_attr( get_pagenum_link($count) );
		if ( $lastpage &amp;&amp; ($count != $page) ) {
			$count = str_pad( (int)$count, 2, '0', STR_PAD_LEFT );
			$echo .= '&lt;a href=&quot;' . $lastpage . '&quot;&gt;' . __( 'Last', FB_GREYFOTO_TEXTDOMAIN ) . '(' . $count . ')' . '&lt;/a&gt;';
		}
	}
	
	$next = intval($page) + 1;
	$next = esc_attr( get_pagenum_link($next) );
	if ($next &amp;&amp; ($count != $page) )
		$echo .= '&lt;a href=&quot;' . $next . '&quot; title=&quot;' . __( 'next', FB_GREYFOTO_TEXTDOMAIN) . '&quot;&gt;' . $args['next_string'] . '&lt;/a&gt;';
	
	if ( isset($echo) )
		echo $args['before_output'] . $echo . $args['after_output'];
}
</code></pre>
<p>Im Template, wo die Pagination genutzt werden soll, wird einfach die Funktion aufgerufen:</p>
<pre><code>
&lt;?php if ( function_exists('fb_paging_bar') ) fb_paging_bar(); ?&gt;
</code></pre>
<h4>Beispiel für Anpassungen</h4>
<p>Für eigene Argumente steht ein Hook bereit und mittels diesem Hook kann jeder Parameter des Arrays $args angepasst werden.</p>
<pre><code class="php">
function change_fb_paging_bar_defaults($args) {
	
	$args['previous_string'] = ''; // empty string
	$args['next_string'] = '';
	
	return $args;
}
add_filter('fb_paging_bar_defaults', 'change_fb_paging_bar_defaults');
</code></pre>
<p>Viel Freude damit und für Hinweise, Ideen und Verbesserungen bin ich wie immer dankbar.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/blatterfunktion-fur-wordpress/1236/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/blatterfunktion-fur-wordpress/1236/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/wp-pagination2.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/wp-pagination2.png" medium="image">
			<media:title type="html">wp-pagination2</media:title>
		</media:content>
		<media:content url="http://wpengineer.com/wp-content/uploads/wp-pagination.png" medium="image">
			<media:title type="html">wp-pagination</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Artikelbild via CSS als Hintergrundbild nutzen</title>
		<link>http://bueltge.de/wordpress-artikelbild-css-hintergrundbild/1234/</link>
		<comments>http://bueltge.de/wordpress-artikelbild-css-hintergrundbild/1234/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 05:10:28 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1234</guid>
		<description><![CDATA[Das Artikelbild von WordPress via CSS als Hintergrundbild nutzen, einfach für die Autoren zu bedienen und flexibel im Theme einzusetzen; eine kleine Lösung gibt hier im Artikel]]></description>
			<content:encoded><![CDATA[<p>Ab und an braucht man pro Beitrag oder Seite ein Bild als Hingucker oder um den Inhalt zu verschönern. Für Redakteure ist die Post Thumbnail Funktion recht komfortable um ein Bild zum Beitrag oder der Seite fest zu legen. Darum lohnt es, auch dieses Bild als Hintergrundbild zum Beitrag zu nutzen. Allerdings ist es wesentlich schöner, wenn das Bild via CSS in Hintergrund definiert ist und im Markup nicht auftaucht. Daher eine kleine Funktion, die ein Standard-Bild definiert und wenn es ein definiertes Post Thumbnail gibt, dann wird dieses gezogen.<br />
<span id="more-1234"></span><br />
Die Funktion stellt nur eine kleine Lösung dar, muss also nach belieben angepasst und erweitert werden. Viel Spaß damit. Eine ähnliche Lösung gibt es außerdem bei <a href="http://playground.ebiene.de/2640/wordpress-facebook-miniatur/">Sergej, der damit Facebook befüttert</a>.</p>
<pre><code>
/**
 * return post thumbnail inside style in head
 */
if ( !function_exists('fb_background_image') ) {
	
	function fb_background_image() {
		// only frontend
		if ( is_feed() || is_trackback() ) {
			return;
		}
		
		// default image, when no set an post thumbnail
		if ( !has_post_thumbnail($GLOBALS['post']-&gt;ID) ) {
			$style = '&lt;style type=&quot;text/css&quot;&gt;.banner {background-image:url(\'' . get_bloginfo('stylesheet_directory') . '/images/banner.jpg\');} &lt;/style&gt;' . &quot;\n\n&quot;;
		} else {
			// get post thumbnail
			$image = wp_get_attachment_image_src(
				get_post_thumbnail_id($GLOBALS['post']-&gt;ID),
				'banner' // size for image; defined via add_image_size
			);
			
			$style = sprintf(
				'&lt;style type=&quot;text/css&quot;&gt;.banner {background-image:url(\'%s\');}&lt;/style&gt;',
				esc_attr($image[0]),
				&quot;\n\n&quot;
			);
		}
		if ($style)
			echo $style;
	}
	
	// add functions
	add_action( 'wp_head', 'fb_background_image' );
	add_theme_support( 'post-thumbnails' );
	add_image_size( 'banner', 980, 350, true );
	
}
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-artikelbild-css-hintergrundbild/1234/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-artikelbild-css-hintergrundbild/1234/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Anzahl der Links in WordPress ausgeben</title>
		<link>http://bueltge.de/anzahl-der-links-in-wordpress-ausgeben/1219/</link>
		<comments>http://bueltge.de/anzahl-der-links-in-wordpress-ausgeben/1219/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 20:25:07 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[counter]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1219</guid>
		<description><![CDATA[WordPress lässt die Verwaltung von Links zu, warum die Anzahl der Links in verschiedener Form also nicht ausgeben.]]></description>
			<content:encoded><![CDATA[<p>Nicht selten werden dem Leser statistische Werte auf der Website dargestellt, so werden die <a href="http://bueltge.de/summe-beitraege-seiten-kategorien-tags-kommentare-wordpress-theme/744/">Gesamtanzahl der Kommentare, der Beiträge und ähnliches</a> gern genutzt. Gleiches kann es natürlich auch für die Links geben, wenn man diese im Backend von WordPress verwaltet. Dies ist nicht immer nur im Sinne einer Blogroll gedacht - beim Einsatz von WordPress als Linkverwaltung beispielsweise kann so ein Wert interessant sein.<br />
Anbei zwei kleine Code-Schnippsel, die euch auf die Sprünge helfen oder gar ausreichend sind um die Links entsprechend auszugeben.<br />
<span id="more-1219"></span><br />
Die Gesamtanzahl der Links gibt man mit folgendem kleinen Schnippsel aus.</p>
<pre><code class="php">
$categories = get_terms( 'link_category' );
if ( $categories )
    echo $categories[0]-&gt;count;
</code></pre>
<p>Die Gesamtanzahl ein Linkkategorie geht ebenfalls, dazu steht der folgende Code als Beispiel. Hier muss die ID der Linkkategorie mitgegeben werden, im Beispiel ist dies die <em>2</em>.</p>
<pre><code>
$term = get_term( 2, 'link_category' ); // ID of link category
if ( $term ) {
	echo __( 'Link category', 'textdoamin' ) . ' ' . $term-&gt;name . __( ', number of links', 'textdomain' ) . ' '. $term-&gt;count;
}
</code></pre>
<p>Die Snippets verwendet ihr im Template eures Themes oder erstellt eine Funktion, die euch die Ausgabe steuert.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/anzahl-der-links-in-wordpress-ausgeben/1219/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/anzahl-der-links-in-wordpress-ausgeben/1219/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Ein Gästebuch im WordPress TwentyTen Theme</title>
		<link>http://bueltge.de/ein-gaestebuch-im-wordpress-twentyten-theme/1216/</link>
		<comments>http://bueltge.de/ein-gaestebuch-im-wordpress-twentyten-theme/1216/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 11:35:53 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Gästebuch]]></category>
		<category><![CDATA[Kommentar]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP3.0]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1216</guid>
		<description><![CDATA[WordPress besitzt die Kommentarfunktion, nichts anderes ist ein Gästebuch und ich möchte kurz am Beispiel des Standard-Theme TwentyTen zeigen, wie leicht und ohne Plugins ein Gästebuch eingerichtet ist. ]]></description>
			<content:encoded><![CDATA[<p>WordPress besitzt die Kommentarfunktion, nichts anderes ist ein Gästebuch und ich möchte kurz am Beispiel des Standard-Theme TwentyTen zeigen, wie leicht und ohne Plugins ein Gästebuch eingerichtet ist. Ich erhoffe mir, dass damit die vielen Mails zu dem Thema weg bleiben und jeder eine einfache, funktionierende und saubere Lösung erstellen kann.<br />
<span id="more-1216"></span><br />
Das folgende Tutorial ist erst mit WordPress 3.0 und höher nutzbar, da seit dem die Funktionen für die Kommentare neu im Core sind. Im Grunde kann man das auf jedes Theme anwenden, man muss den Aufruf der Kommentarfunktion anschauen - wird dieser mit der neuen Funktion <code>comment_form()</code> realisiert.</p>
<h4>Der grobe Ablauf</h4>
<ul>
<li>Kopie der <code>page.php</code> in <code>guestbook-page.php</code> erstellen</li>
<li>Inhaltlich einige Veränderungen vornehmen</li>
<li>Kopie der <code>comments.php</code> in <code>guestbook.php</code> erstellen</li>
<li>Inhaltlich den Aufbau ändern</li>
<li>Templates in den Theme-Ordner kopieren oder Child-Theme erstellen</li>
<li>Seite im Backend von WordPress erstellen und Template wählen</li>
</ul>
<p><img class="centered" src="http://bueltge.de/wp-content/images/gaestebuch/guestbook-twentyten.png" alt="Gästebuch mit TwentyTen Theme in WordPress" /></p>
<h4>Die <code>guestbook-page.php</code></h4>
<p>Im neuen Template sind nur wenige Veränderungen vorzunehmen. Im ersten Schritt braucht das Template einen Namen, damit es im backend von WordPress für statische Seiten erkannt wird. Dies geschieht in den Kommentaren am Anfang der Datei.</p>
<pre><code>
&lt;?php
/**
 * Template Name: Guestbook
 *
 * A custom page for guestbook function.
 *
 * The &quot;Template Name:&quot; bit above allows this to be selectable
 * from a dropdown menu on the edit page screen.
 *
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */

</code></pre>
<p>Im Anschluss wird im Aufruf der Kommentarfunktion noch der Name der Datei mitgegeben, der sich um die Darstellung der Gästebucheinträge kümmert und das Formular zum Eintragen enthält. Im Grunde könnte man dies auch weglassen, aber dann ist inhaltlich alles auf Kommentare abgeglichen und das Formular für Neueinträge befindet sich am Ende, also nach den Einträgen. Da es bei Gästebüchern aber meist anders ist, legen wir das Formular vor die Liste der Einträge und ändern die Texte.<br />
Daher muss also die Datei an die Funktion übergeben werden. </p>
<pre><code>
&lt;?php comments_template( '/guestbook.php' ); ?&gt;
</code></pre>
<p>Das Beispieltemplate mit den Änderungen in der kompletten Sicht:</p>
<pre><code>
&lt;?php
/**
 * Template Name: Guestbook
 *
 * A custom page for guestbook function.
 *
 * The &quot;Template Name:&quot; bit above allows this to be selectable
 * from a dropdown menu on the edit page screen.
 *
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */

get_header(); ?&gt;


		&lt;div id=&quot;container&quot;&gt;
			&lt;div id=&quot;content&quot; role=&quot;main&quot;&gt;

&lt;?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?&gt;

				&lt;div id=&quot;post-&lt;?php the_ID(); ?&gt;&quot; &lt;?php post_class(); ?&gt;&gt;
					&lt;?php if ( is_front_page() ) { ?&gt;
						&lt;h2 class=&quot;entry-title&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;
					&lt;?php } else { ?&gt;
						&lt;h1 class=&quot;entry-title&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
					&lt;?php } ?&gt;

					&lt;div class=&quot;entry-content&quot;&gt;
						&lt;?php the_content(); ?&gt;
						&lt;?php wp_link_pages( array( 'before' =&gt; '&lt;div class=&quot;page-link&quot;&gt;' . __( 'Pages:', 'twentyten' ), 'after' =&gt; '&lt;/div&gt;' ) ); ?&gt;
						&lt;?php edit_post_link( __( 'Edit', 'twentyten' ), '&lt;span class=&quot;edit-link&quot;&gt;', '&lt;/span&gt;' ); ?&gt;
					&lt;/div&gt;&lt;!-- .entry-content --&gt;
				&lt;/div&gt;&lt;!-- #post-## --&gt;

				&lt;?php comments_template( '/guestbook.php' ); ?&gt;

&lt;?php endwhile; ?&gt;

			&lt;/div&gt;&lt;!-- #content --&gt;
		&lt;/div&gt;&lt;!-- #container --&gt;

&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;
</code></pre>
<h4>Die <code>guestbook-page.php</code></h4>
<p>Auch hier gibt es wenig Verändeurngen. Im ersten Schritt holen wir das Formular vor die Ausgabe der Gästbuch-Einträge. Der folgende Code ist das Original und ruft das Formualr seit WordPress 3.0 auf.</p>
<pre><code>
&lt;?php comment_form(); ?&gt;
</code></pre>
<p>Diesen Code setzen wir nun vor die Ausgabe der Einträge, also vor</p>
<pre><code>
&lt;?php
	// You can start editing here -- including this comment!
?&gt;

&lt;?php if ( have_comments() ) : ?&gt;
</code></pre>
<p>Um nun aber die Felder richtig anzupassen und entsprechende Texte mitzugeben, müssen einige Paramter der Funktion übergeben werden. Die Funktion <code>comment_form()</code> lässt sehr viele Möglichkeiten zu und alle Parameter werden in einem Array übergeben. Im <a href="http://codex.wordpress.org/Function_Reference/comment_form">Codex</a> findet man die einzelnen Felder erläutert.<br />
In meinem Fall sieht der Abschnitt dann wie folgt aus.</p>
<pre><code>
&lt;?php
// You can start editing here -- including this comment!

// the form
$attr = array(
					'comment_field'        =&gt; '&lt;p class=&quot;comment-form-comment&quot;&gt;&lt;label for=&quot;comment&quot;&gt;' . _x( 'Guestbook entry', 'noun', 'twentyten' ) . '&lt;/label&gt;&lt;textarea id=&quot;comment&quot; name=&quot;comment&quot; cols=&quot;45&quot; rows=&quot;8&quot; aria-required=&quot;true&quot;&gt;&lt;/textarea&gt;&lt;/p&gt;',
					'label_submit'         =&gt; __( 'Post Entry', 'twentyten' ),
					'title_reply'          =&gt; __( 'Leave a Entry', 'twentyten' ),
					'title_reply_to'       =&gt; __( 'Leave a Entry to %s', 'twentyten' ),
					'cancel_reply_link'    =&gt; __( 'Cancel reply', 'twentyten' ),
				);
comment_form( $attr );

// list of guestbook entries
if ( have_comments() ) : ?&gt;
</code></pre>
<p>Das Beispieltemplate mit den Änderungen in der kompletten Sicht:</p>
<pre><code>
&lt;?php
/**
 * The template for displaying Comments.
 *
 * The area of the page that contains both current comments
 * and the comment form.  The actual display of comments is
 * handled by a callback to twentyten_comment which is
 * located in the functions.php file.
 *
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */
?&gt;

			&lt;div id=&quot;comments&quot;&gt;
&lt;?php if ( post_password_required() ) : ?&gt;
				&lt;p class=&quot;nopassword&quot;&gt;&lt;?php _e( 'This post is password protected. Enter the password to view any comments.', 'twentyten' ); ?&gt;&lt;/p&gt;
			&lt;/div&gt;&lt;!-- #comments --&gt;
&lt;?php
		/* Stop the rest of comments.php from being processed,
		 * but don't kill the script entirely -- we still have
		 * to fully load the template.
		 */
		return;
	endif;
?&gt;

&lt;?php
// You can start editing here -- including this comment!

// the form
$attr = array(
					'comment_field'        =&gt; '&lt;p class=&quot;comment-form-comment&quot;&gt;&lt;label for=&quot;comment&quot;&gt;' . _x( 'Guestbook entry', 'noun', 'twentyten' ) . '&lt;/label&gt;&lt;textarea id=&quot;comment&quot; name=&quot;comment&quot; cols=&quot;45&quot; rows=&quot;8&quot; aria-required=&quot;true&quot;&gt;&lt;/textarea&gt;&lt;/p&gt;',
					'label_submit'         =&gt; __( 'Post Entry', 'twentyten' ),
					'title_reply'          =&gt; __( 'Leave a Entry', 'twentyten' ),
					'title_reply_to'       =&gt; __( 'Leave a Entry to %s', 'twentyten' ),
					'cancel_reply_link'    =&gt; __( 'Cancel reply', 'twentyten' ),
				);
comment_form( $attr );

// list of guestbook entries
if ( have_comments() ) : ?&gt;
			&lt;h3 id=&quot;comments-title&quot;&gt;&lt;?php
			printf( _n( 'One Entry in %2$s', '%1$s Entries in %2$s', get_comments_number(), 'twentyten' ),
			number_format_i18n( get_comments_number() ), '&lt;em&gt;' . get_the_title() . '&lt;/em&gt;' );
			?&gt;&lt;/h3&gt;

&lt;?php if ( get_comment_pages_count() &gt; 1 &amp;&amp; get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?&gt;
			&lt;div class=&quot;navigation&quot;&gt;
				&lt;div class=&quot;nav-previous&quot;&gt;&lt;?php previous_comments_link( __( '&lt;span class=&quot;meta-nav&quot;&gt;&amp;larr;&lt;/span&gt; Older Entries', 'twentyten' ) ); ?&gt;&lt;/div&gt;
				&lt;div class=&quot;nav-next&quot;&gt;&lt;?php next_comments_link( __( 'Newer Entries &lt;span class=&quot;meta-nav&quot;&gt;&amp;rarr;&lt;/span&gt;', 'twentyten' ) ); ?&gt;&lt;/div&gt;
			&lt;/div&gt; &lt;!-- .navigation --&gt;
&lt;?php endif; // check for comment navigation ?&gt;

			&lt;ol class=&quot;commentlist&quot;&gt;
				&lt;?php
					/* Loop through and list the comments. Tell wp_list_comments()
					 * to use twentyten_comment() to format the comments.
					 * If you want to overload this in a child theme then you can
					 * define twentyten_comment() and that will be used instead.
					 * See twentyten_comment() in twentyten/functions.php for more.
                     * use param reverse_top_level to reverse the order of the guestbook-entries
					 */
					wp_list_comments( array( 'reverse_top_level' => TRUE, 'callback' =&gt; 'twentyten_comment' ) );
				?&gt;
			&lt;/ol&gt;

&lt;?php if ( get_comment_pages_count() &gt; 1 &amp;&amp; get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?&gt;
			&lt;div class=&quot;navigation&quot;&gt;
				&lt;div class=&quot;nav-previous&quot;&gt;&lt;?php previous_comments_link( __( '&lt;span class=&quot;meta-nav&quot;&gt;&amp;larr;&lt;/span&gt; Older Entries', 'twentyten' ) ); ?&gt;&lt;/div&gt;
				&lt;div class=&quot;nav-next&quot;&gt;&lt;?php next_comments_link( __( 'Newer Entries &lt;span class=&quot;meta-nav&quot;&gt;&amp;rarr;&lt;/span&gt;', 'twentyten' ) ); ?&gt;&lt;/div&gt;
			&lt;/div&gt;&lt;!-- .navigation --&gt;
&lt;?php endif; // check for comment navigation ?&gt;

&lt;?php else : // or, if we don't have comments:

	/* If there are no comments and comments are closed,
	 * let's leave a little note, shall we?
	 */
	if ( ! comments_open() ) :
?&gt;
	&lt;p class=&quot;nocomments&quot;&gt;&lt;?php _e( 'Guestbook are closed.', 'twentyten' ); ?&gt;&lt;/p&gt;
&lt;?php endif; // end ! comments_open() ?&gt;

&lt;?php endif; // end have_comments() ?&gt;

&lt;/div&gt;&lt;!-- #comments --&gt;
</code></pre>
<h4>Die Sprache</h4>
<p>Nun müssen die Felder übersetzt werden. Dazu sollte ein Werkzeug genutzt werden - meine Empfehlung das Plugin für WordPress <a href="http://www.code-styling.de/deutsch/entwicklungen/wordpress-plugin-codestyling-localization">Localization</a>. Damit wird nun die Sprachdatei des TwentyTen Theme neu erstellt und die neuen Sprachschlüssel erkannt, welche dann übersetzt werden können.</p>
<p><strong>Hinweis:</strong> Damit wird ein Teil dem Update entnommen - die Sprachdatei. Daher ist es sauberer, wenn man ein Child-Theme anlegt, dort die beiden Templates ablegt und die Sprachdatei dort erzeugt. Hinweise, wie man ein Child-Theme erzeugt, findet ihr im Artikel <a href="http://bueltge.de/wordpress-child-themes-verstehen/1192/">WordPress Child Themes verstehen</a>. Trotzdem habe ich mal als Beispiel als Child Theme erzeugt. Es enthält die Sprachdateien und die Templates für das Gästebuch, sowie die notwendigen Dateien und Strings um ein Child Theme für diese Funktion zu erzeugen. Damit sollte es einfach möglich sein ein Child Theme mit der Möglichkeit der Erweiterung und einem Gästebuch zu erstellen. Der Download ist in den folgenden Zeilen zu finden.</p>
<h4>Abschluss</h4>
<p>Nun gilt es die beiden php-Templates und die Sprachdatei in das Theme zu kopieren und eine neue Seite über das Backend zu erstellen. Vergebt einen Namen für das Gästebuch, hinterlasst eventuell einen einführenden Text für die Gäste und wählt das neue Template &#8222;<em>Guestbook</em>&#8220; in der Meta-Box dieser Seite.<br />
Wenn alles ok ist, dann steht nun euer Gästebuch und kann genutzt werden. Keine Plugins, keine unnötigen Ressourcen oder Tabellen in der Datenbank. Aber, abhängig von Theme, was auch richtig ist, denn es handelt sich im Themen zum Design - der Inhalt steht in der Datenbank.</p>
<p>Für alle, die sich das Kopieren des Code ersparen wollen, lege ich die beiden Dateien als zip ab, so dass man sie downloaden und nutzen kann.</p>
<h3>Download:</h3>
<form class="spenden" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"><br />
<input type="hidden" name="hosted_button_id" value="DT9BG8NJTXQN4"><br />
<input type="image" src="http://bueltge.de/wp-content/images/donate.png" border="0" name="submit" alt="Jetzt einfach, schnell und sicher online bezahlen – mit PayPal."><br />
<img class="ob" alt="Spendenbutton" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" width="1" height="1"><br />
</form>
<p><strong>Ist die Arbeit nicht 1 Euro wert?</strong><br />
Jede Spende wird dankbar angenommen und erm&ouml;glicht das weitere Arbeiten an freier Software.<br />
M&ouml;chtest du mehr oder anders spenden, so besuche meine <a href="http://bueltge.de/wunschliste/">Wunschliste</a>.</p>
<ul>
<li><strong>Template-Dateien</strong> im Download als zip-Datei: <a href="http://bueltge.de/wp-content/download/wp/guestbookthemes/guestbook-twentyten.zip">guestbook-twentyten.zip</a> - 2 kByte</li>
<li><strong>Child Theme inkl. Sprachdateien Deutsch</strong> etc. im Download als zip-Datei: <a href="http://bueltge.de/wp-content/download/wp/guestbookthemes/guestbook-tutorial.zip">guestbook-tutorial.zip</a> - 28 kByte</li>
</ul>
<p>Viel Freude damit und viel Erfolg beim Verstehen des Code und meiner kurzen Anleitung. Für Hinweise, Verbesserungen und Fehler steht die Kommentarfunktion zur Verfügung - vielen Dank.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/ein-gaestebuch-im-wordpress-twentyten-theme/1216/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/ein-gaestebuch-im-wordpress-twentyten-theme/1216/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/gaestebuch/guestbook-twentyten.png" />
		<media:content url="http://bueltge.de/wp-content/images/gaestebuch/guestbook-twentyten.png" medium="image">
			<media:title type="html">Gästebuch mit TwentyTen Theme in WordPress</media:title>
		</media:content>
		<media:content url="http://bueltge.de//www.paypal.com/de_DE/i/scr/pixel.gif" medium="image">
			<media:title type="html">Spendenbutton</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Child-Themes verstehen</title>
		<link>http://bueltge.de/wordpress-child-themes-verstehen/1192/</link>
		<comments>http://bueltge.de/wordpress-child-themes-verstehen/1192/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 16:10:57 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP3.0]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1192</guid>
		<description><![CDATA[Mit der Version 3.0 von WordPress wurde die viel erwartete Funktion der <a href="http://codex.wordpress.org/Child_Themes">Child Themes</a> integriert - viel erwartet? Ja, leider nicht in Deutschland. Ich vermute, dass es einfach daran liegt, dass der Markt der kostenpflichtigen Themes hier wesentlich kleiner ist und die meisten Entwickler komplett neue Themes erstellen und nicht auf eine Basis setzen. Aber egal, nun gibt es eine Lösung dafür und ich möchte am Beispiel den neuen Standard-Theme <a href="http://wordpress.org/extend/themes/twentyten">TwentyTen</a> zeigen, wie man es nutzt.

Die Funktion der Child Themes kann im Grunde bei jedem Theme angewandt werden und die neuen Funktionen erleichtern den Zugriff und das Erstellen einen Child Themes. Im Vorfeld gab es auch Möglichkeiten ein Theme zu verändern ohne die eigentlichen Dateien des Themes stark zu verändern. Mit Hilfe der Unterstützung von Child Themes ist dies nun aber komplett unabhängig und so kann man ein Theme nutzen, kann ohne Problem updaten, und trotzdem eigene Ideen realisieren.

In einigen Beiträgen des Netzes wurde die Child Themes schon angesprochen und ich habe bisher nur Artikel gefunden, die die Aktivierung und Änderung des Stylesheets ansprechen. Daher möchte ich dazu nur kurz eingehen, dass ist im Grunde auch recht einfach und dann die verschiedenen Möglichkeiten im Bezug der Template-Dateien aufzeigen.]]></description>
			<content:encoded><![CDATA[<p>Mit der Version 3.0 von WordPress wurde die viel erwartete Funktion der <a href="http://codex.wordpress.org/Child_Themes">Child Themes</a> integriert - viel erwartet? Ja, leider nicht in Deutschland. Ich vermute, dass es einfach daran liegt, dass der Markt der kostenpflichtigen Themes hier wesentlich kleiner ist und die meisten Entwickler komplett neue Themes erstellen und nicht auf eine Basis setzen. Aber egal, nun gibt es eine Lösung dafür und ich möchte am Beispiel den neuen Standard-Theme <a href="http://wordpress.org/extend/themes/twentyten">TwentyTen</a> zeigen, wie man es nutzt. Ein weiteres Beispiel findet ihr im übrigen in meinem <a href="http://wpbasis.de">WP Basis-Theme</a> (<a href="http://code.google.com/p/wp-basis-theme/source/browse/#svn/trunk/basis-child-example%3Fstate%3Dclosed">SVN</a>); aktuell nicht die html5-Version.</p>
<p>Die Funktion der Child Themes kann im Grunde bei jedem Theme angewandt werden und die neuen Funktionen erleichtern den Zugriff und das Erstellen einen Child Themes. Im Vorfeld gab es auch Möglichkeiten ein Theme zu verändern ohne die eigentlichen Dateien des Themes stark zu verändern. Mit Hilfe der Unterstützung von Child Themes ist dies nun aber komplett unabhängig und so kann man ein Theme nutzen, kann ohne Problem updaten, und trotzdem eigene Ideen realisieren.</p>
<p>In einigen Beiträgen des Netzes wurde die Child Themes schon angesprochen und ich habe bisher nur Artikel gefunden, die die Aktivierung und Änderung des Stylesheets ansprechen. Daher möchte ich dazu nur kurz eingehen, dass ist im Grunde auch recht einfach und dann die verschiedenen Möglichkeiten im Bezug der Template-Dateien aufzeigen.<br />
<span id="more-1192"></span></p>
<h4>Vorteile der Idee Child Theme</h4>
<p>Mehr oder weniger versucht jeder Administrator einer WordPress Installation etwas Individualismus zu leben. Dabei gehen nicht alle den Weg eines eigens erstellen Themes. Nicht selten wird ein freies oder kommerzielles Theme genutzt und dann an die eigenen Bedürfnisse angepasst. Dabei haben diverse Themes unterschiedliche Optionen, die aber trotzdem nur selten für das Anpassen ausreichen. Will man die einzelnen Darstellungen anpassen, beispielsweise die Sicht einer Kategorie, führt dies schnell zu sehr starken Veränderungen des Themes. Egal wie umfangreich, ein Update eines Themes ist nicht mehr ohne Probleme realisierbar. Hier kommen die Child Themes ins Spiel.</p>
<p>Mit einem Child Theme kann ein Theme angepasst werden oder man kann ein Theme als "Framework" nutzen und dabei komplett eigene Ideen umsetzen. Egal wie umfangreich, das eigentliche Theme bleibt unangetastet und kann ein Update erfahren.</p>
<h4>Nachteile der Verwendung Child Theme</h4>
<p>Wie so oft, wo Vorteile sind, sind auch Nachteile. Nicht selten sind die "Framework" Themes sehr umfangreich und bringen sehr viele Funktionen mit, die man als Laie nicht mehr überschauen kann und das Anpassen kann viel Mühe und Zeit kosten. Hier können auch die Child Themes nicht helfen.<br />
Einen großen Nachteile sehe ich  in der Performance, muss WordPress doch einnen Schritt weiter gehen und sich in zwei Bereichen nach den Templates umsehen und entsprechend ziehen.<br />
Im weiteren werden in der Regel die Stylesheets, wenn man auf sie aufbaut, via @-Regel eingebunden, die <a href="http://www.stevesouders.com/blog/2009/04/09/dont-use-import/">Nachteile in der Performance</a> hat.</p>
<p>In allen negativen Punkten kommt es auf Können und Wissen des Entwicklers an, also wie man das Theme bzw. Child Theme erstellt. Damit kann man die Punkte entkräften. Wichtig: die neue Funktion ist kein Freibrief, sie sollte genauso überlegt eingesetzt werden. Aber sie sorgt dafür, dass man sein erstandenes Theme nicht anfassen muss und trotzdem sehr überschaubar Anpassungen vornehmen kann.</p>
<h3>Child Theme anlegen</h3>
<p>Genug der Vorrede, die man sicher erweitern und diskutieren kann. Am Beispiel Theme TwentyTen soll nun eine angepasstes Theme entstehen - ich nenne es <em>TwentyTenJump</em> <img src='http://bueltge.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Im ersten Schritt wird ein neuer Ordner angelegt, in dem wir alle Template-Dateien, Bilder, Scripte und Stylesheets ablegen - was man im Grunde für das Child Theme benötigt. In diesem Beispiel ist das der Ordner <em>twentytenjump</em>. Um ein Child Theme zu erzeugen und WordPress dieses erkennbar zu machen bedarf es lediglich der <code>style.css</code> innerhalb der neuen Ordners mit diversen Strings in einem Kommentar.</p>
<p>Innerhalb der <code>style.css</code> sieht es wie folgt aus.</p>
<pre><code class="css">
@charset "UTF-8";

/**
 * Theme Name:     TwentyTenJump
 * Theme URI:      http://bueltge.de/?p=1192
 * Description:    Child theme for the Twenty Ten theme. Realized for a small tutorial to child themes in WordPress.
 * Author:         Frank Bültge
 * Author URI:     http://bueltge.de/
 * Template:       twentyten
 * Version:        0.1.0
 */

@import url('../twentyten/style.css');

</code></pre>
<p>Entscheidend sind die Schlüssel <em>Theme Name</em> und <em>Template</em>. Der Schlüssel <code>Template</code> verweist auf den <strong>Ordner-Namen</strong> des Theme, welches als Basis gezogen wird - in diesem Beispiel das Theme Twentyten.</p>
<p>Folgenden Aufbau habe ich nun innerhalb der Installation von WordPress.</p>
<ul>
<li><code>wp-content</code>
<ul>
<li><code>themes</code>
<ul>
<li><code>twentyten</code></li>
<p> (das Basis-Theme, inkl. aller Template-Dateien)</p>
<ul>
<li><code>style.css</code></li>
<li><code>index.php</code></li>
<li>...</li>
</ul>
<li><code>twentytenjump</code>
<ul>
<li><code>style.css</code> (muss diese Namenskonvetion erfüllen: <i>style.css</i>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Damit sind die ersten Voraussetzungen geschaffen und man kann das neue Theme im Backend von WordPress aktivieren.<br />
<strong>Achtung:</strong> der Verweis auf das Basis-Theme ist nicht sonderlich auffällig, so dass man die Abhängigkeit übersehen könnte. Darum also immer kontrolliert ein Theme löschen. Am verwendeten Theme gibt es keinerlei Hinweis, dass ein anderes Theme als Child-Theme auf dieses Theme zugreift.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/child-theme.jpg" alt="Child Themes in WordPress" /></p>
<h4>Am Stylesheet drehen</h4>
<p>Ab nun kann man jede beliebe Änderung in dem eigenen Stylesheet ablegen. Ebenfalls kann natürlich der Aufruf des Stylesheets <code>@import url('../twentyten/style.css');</code> aus dem Basis-Theme entfallen und man kann sich komplett eigene Stylesheet-Strukturen aufbauen.</p>
<p>Man nutzt quasi die Template-Dateien, den Aufbau und das PHP-KnowHow vom Basis Theme, in dem Fall Twenty Ten. Man kümmert sich ausschließlich um das Design und das im beliebigen Umfang. Beispielsweise könnte das im einfachsten Fall eine Farbänderung des Hintergrund sein und alternativ kann ein komplett eigenes Design kreiert werden.</p>
<h4>Templates ersetzen</h4>
<p>Die Funktionalität des Child Theme lässt aber mehr zu als das Änderung des Aussehen. So kann man bestehende Template-Dateien des Basis-Themes ersetzen. WordPress sucht quasi im ersten Schritt im übergeordneten Child Theme und dann im Basis-Theme nach dem möglichen Template. Durchläuft dabei die <a href="http://codex.wordpress.org/File:Template_Hierarchy.png">Hierarchie der Template-Dateien</a>.</p>
<p>An vielen Punkten vom Theme kann man via Hook eingreifen, was aber nicht jedem Nutzer liegt und kompliziert erscheint. So wird nicht selten die Ausgabe des Titel im <code>head</code> einer Website mit eigenen Funktionen oder von Plugins ersetzt. Man kann entweder via Hook den Titel bearbeiten oder die Ausgabe über eine Funktion steuern. Für das Beispiel soll nun der Titel mit einer Funktion aus einem Plugin ausgegeben werden. In dem Fall muss die <code>header.php</code> bearbeitet werden und darum muss man wie folgt vorgehen, so dass das Basis-Theme unangetastet bleibt.</p>
<p>Es ist lediglich die <code>header.php</code>, die den <code>head</code>-Abschnitt für das Theme enthält in das eigene Child Theme zu kopieren und hier kann sie beliebig bearbeitet werden. Ab nun zieht WordPress diese <code>header.php</code> und nicht mehr die Original-Datei aus dem Basis Theme Twenty Ten.</p>
<p>Damit kann nun auch die angesprochene Funktion in den Title integriert werden, ein Beispiel:</p>
<pre><code class="php">
&lt;title&gt;&lt;?php
	/*
	 * Print the &lt;title&gt; tag based on what is being viewed.
	 * We filter the output of wp_title() a bit -- see
	 * twentyten_filter_wp_title() in functions.php.
	 */
	if ( function_exists('seo_title_tag') )
		seo_title_tag();
	else
		wp_title( '|', true, 'right' );

	?&gt;&lt;/title&gt;
</code></pre>
<p>Das Basis-Theme bleibt unangetastet, kann weiterhin via Updates auf dem neusten Stand gehalten werden und ab nun zieht WordPress die <code>header.php</code> immer aus dem Child Theme.</p>
<p>Wie in diesem kleinen Beispiel kann man jedes Template ersetzen und so an die eigenen Anforderungen angepasst werden. Trotzdem sollte man bedenken, dass man das Template komplett ersetzt - in dem Beispiel-Fall würde man also ein Update der <code>header.php</code> nicht mitbekommen. Insofern kann es nützlich sein, wenn man auf diverse Bereiche besser via Hook zugreift und diese in eigenen Funktionen abbildet, dazu gleich mehr.</p>
<p><strong>Wichtig:</strong> eine Ausnahme ist die <code>functions.php</code>, dazu im Anschluss mehr.</p>
<h4>Templates erweitern</h4>
<p>Um eigene Anforderungen zu erfüllen, kann es sein, dass man neue Templates benötigt, Template-Dateien die es im Ist-Zustand nicht im Basis-Theme nicht gibt. Im Sinne der Hirarchie kann man immer erweitern. Beispielsweise besitzt Twenty Ten keine <code>home.php</code> - sollte man die aber definieren wollen, also dann wenn die definierte Home-Seite des Backend im Frontend geladen wird, dann kann man diese Datei einfach in das Child-Theme ablegen und WordPress zieht diese Datei, wenn der Zustand <code>is_home()</code> wahr ist.</p>
<p>Mit WordPress Version 3.0 gibt es aber eine weitere Möglichkeit außerhalb der Template-Hirarchie um eigene Templates einzubringen - <a href="http://bueltge.de/template-part-im-wordpress-template-laden/1157/" title="mehr Information in einem weiteren Beitrag"><code>get_template_part()</code></a>.<br />
Diese Funktion wird konsequent innerhalb von Twenty Ten verwendet - damit muss man in diversen Fällen keine eigenen Templates für den kompletten Aufruf anlegen, sondern lediglich den Abschnitt des Loop.<br />
Beispielsweise nutzt Twenty Ten für die Darstellung der Kategorie-Archive den Aufruf <code>get_template_part( 'loop', 'category' );</code>. Damit ist es möglich, dass in unserem Child Theme ein Template abgelegt wird, was diesen Loop bedient. Es ist also lediglich eine Datei <code>loop-category.php</code> anzulegen und dort alle notwendigen Infos abzulegen.<br />
Im folgenden Beispiel passe ich den Loop an, wenn man sich einem der vier Kategorien befindet. Weitere Änderungen sind möglich, so dass man volle Kontrolle und Flexibilität erhält.</p>
<pre><code class="php">
// Anpassungen des Loop
if ( in_category( array(47, 37, 27, 45) ) ) {
	query_posts( 'cat='.$cat.'&amp;posts_per_page=-1&amp;orderby=title&amp;order=ASC' );
}	else {
	query_posts( 'cat='.$cat.'&amp;posts_per_page=20&amp;paged='.$paged );
}
while ( have_posts() ) : the_post(); ?&gt;
</code></pre>
<p>Ähnlich könnte man so den Loop für die <code>index.php</code> anpassen - Template Datei <code>loop-index.php</code> wäre dann im Spiel</p>
<h4>Funktionen einbringen</h4>
<p>Natürlich kann man auch innerhalb des Child-Theme eigene Funktionen einbringen. Wenn man eine eigene <code>functions.php</code> im Child Theme ablegt, dann ersetzt diese Datei nicht die <code>functions.php</code> des Basis-Theme!<br />
Es werden immer die Funktionen des Basis-Theme genutzt; man muss sie via Hook deaktivieren. Die Möglichkeit wird auch in einer Doku in der Datei functions.php erklärt.</p>
<pre><code class="php">
add_action( 'after_setup_theme', 'my_child_theme_setup' );
function my_child_theme_setup() {
		// We are providing our own filter for excerpt_length (or using the unfiltered value)
		remove_filter( 'excerpt_length', 'twentyten_excerpt_length' );
		...
}
</code></pre>
<p>Innerhalb der Funktion <code>my_child_theme_setup()</code> kann man nun Funktione des Basis-Theme deaktivieren und eigene Funktionen einbringen.</p>
<p>Weitere Funktionen gehören in die <code>functions.php</code> des Child Themes - das Basis-Theme bleibt immer unangetastet. Im folgenden Code dazu ein Beispiel.<br />
Dabei deaktiviere ich die Funktion des Basis Theme Twenty Ten zur Länge des Excerpt und lade dazu eine eigene Funktion <code>twentytenjump_excerpt_length()</code> und es wird ein Widget eingebracht.</p>
<pre><code class="php">
&lt;?php
function twentytenjump_setup() {
	
	remove_filter( 'excerpt_length', 'twentyten_excerpt_length' );
	add_filter( 'excerpt_length', 'twentytenjump_excerpt_length' );
	
	add_action( 'widgets_init', 'register_limited_catagories_widget' );
}
add_action( 'after_setup_theme', 'twentytenjump_setup' );

function twentytenjump_excerpt_length( $length ) {
	return 10;
}

class limited_catagories_list_widget extends WP_Widget {
	
	function limited_catagories_list_widget(){
		$widget_ops = array( 'classname' =&gt; __('Selective categories'), 'description' =&gt; __('Show a list of Categories, with the ability to exclude categories') );
		
		$control_ops = array( 'id_base' =&gt; 'some-cats-widget' );
		$this-&gt;WP_Widget( 'some-cats-widget', __('Selective Catagories'), $widget_ops, $control_ops );
	}
 
	function form ( $instance){
		$defaults = array( 'title' =&gt; __('Catagories'), 'cats' =&gt; '', 'count' =&gt; 0 );
		$instance = wp_parse_args( (array) $instance, $defaults );
		$count = isset($instance['count']) ? (bool) $instance['count'] :false;
		?&gt;
		&lt;p&gt;
			&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;&quot;&gt;&lt;?php _e( 'Title:' ); ?&gt;&lt;/label&gt;
			&lt;input id=&quot;&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name( 'title' ); ?&gt;&quot; value=&quot;&lt;?php echo $instance['title']; ?&gt;&quot; class=&quot;widefat&quot; /&gt;
		&lt;/p&gt;
		&lt;p&gt;
			&lt;input type=&quot;checkbox&quot; class=&quot;checkbox&quot; id=&quot;&lt;?php echo $this-&gt;get_field_id('count'); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name('count'); ?&gt;&quot;&lt;?php checked( $count ); ?&gt; /&gt;
			&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id('count'); ?&gt;&quot;&gt;&lt;?php _e( 'Show post counts' ); ?&gt;&lt;/label&gt;&lt;br /&gt;
		&lt;/p&gt;
		&lt;p&gt;
			&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id( 'cats' ); ?&gt;&quot;&gt;&lt;?php _e( 'Categories to exclude (comma separated list of Category-IDs): ' ); ?&gt;&lt;/label&gt;
			&lt;input id=&quot;&lt;?php echo $this-&gt;get_field_id( 'cats' ); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name( 'cats' ); ?&gt;&quot; value=&quot;&lt;?php echo $instance['cats']; ?&gt;&quot; class=&quot;widefat&quot; /&gt;
		&lt;/p&gt;
		&lt;?php
	}
 
	function update($new_instance, $old_instance) {
			$instance = $old_instance;
			$instance['title'] = strip_tags( $new_instance['title'] );
			$instance['count'] = !empty($new_instance['count']) ? 1 : 0;
			$instance['cats']  = strip_tags( $new_instance['cats'] );
			return $instance;
	}
 
	function widget($args, $instance){
		extract( $args );
		$title = apply_filters('widget_title', $instance['title'] );
		$c     = $instance['count'] ? '1' : '0';
		$cats  = $instance['cats'];
		echo $before_widget;
		if ( $title )
			echo $before_title . $title . $after_title;
		echo '&lt;ul&gt;';
		wp_list_categories(&quot;exclude=$cats&amp;title_li=&amp;show_count=$c&quot;);
		echo '&lt;/ul&gt;';
		echo $after_widget;
	}

}

function register_limited_catagories_widget(){
	register_widget('limited_catagories_list_widget');
}
?&gt;
</code></pre>
<h3>Fazit</h3>
<p>Ich meine aktuell, dass durch die Einführung des neuen Standard-Theme Twenty Ten sicher einige neue schöne Funktionen hinzugekommen sind. Ich denke aber ebenso, dass Twenty Ten sehr ungeeignet ist um die Arbeit von WordPress im Bereich des Themes zu verstehen. Gerade Einsteiger und PHP-Neulinge werden sich schwer tun. Trotzdem entstehen so neue Möglichkeiten und will man Child Themes sauber nutzen, dann kommt man um das Verständnis der Hooks in der WordPress API nicht herum. WordPress führt die Idee der Hooks konsequent fort, schon immer in Plugins beliebt, machen sie sich nun auch in Themes breit. Alles hat Vor- und Nachteile.<br />
Nutzt man aber ein gut gepflegtes Theme oder Framework, dann wird man die neuen Möglichkeiten schätzen und kann so immer ohne Probleme Updaten. Entscheidend wird das eigene Wissen um WordPress sein - je nach Interesse, Wissensstand und Arbeitsweise kann man eigene Themes erstellen. Man sollte sich im Vorfeld Gedanken machen und nicht blind loslegen und wie so oft, am Theme schrauben.</p>
<h3>Download:</h3>
<p>Zum Abschluss noch das Theme mit den entsprechenden Template-Dateien als Downlaod, so dass man einen kleinen Start zum Spielen hat.</p>
<form class="spenden" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"><br />
<input type="hidden" name="hosted_button_id" value="DT9BG8NJTXQN4"><br />
<input type="image" src="http://bueltge.de/wp-content/images/donate.png" border="0" name="submit" alt="Jetzt einfach, schnell und sicher online bezahlen – mit PayPal."><br />
<img class="ob" alt="Spendenbutton" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" width="1" height="1"><br />
</form>
<p><strong>Ist die Arbeit nicht 1 Euro wert?</strong><br />
Jede Spende wird dankbar angenommen und erm&ouml;glicht das weitere Arbeiten an freier Software.<br />
M&ouml;chtest du mehr oder anders spenden, so besuche meine <a href="http://bueltge.de/wunschliste/">Wunschliste</a>.<br />
Download als zip-Datei: <a href="http://bueltge.de/wp-content/download/wp/themes/twentytenjump.zip">twentytenjump.zip</a> - 5 kByte<br />
Einen Stand online einsehbar und erweiterbar, eventuell gepflegt findest du auf Github: <a href="https://github.com/bueltge/TwentyTenJump" title="bueltge / TwentyTenJump">github.com/bueltge/TwentyTenJump</a><br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-child-themes-verstehen/1192/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-child-themes-verstehen/1192/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/child-theme.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/child-theme.jpg" medium="image">
			<media:title type="html">Child Themes in WordPress</media:title>
		</media:content>
		<media:content url="http://bueltge.de//www.paypal.com/de_DE/i/scr/pixel.gif" medium="image">
			<media:title type="html">Spendenbutton</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Codeschnippsel zu WordPress Kategorien</title>
		<link>http://bueltge.de/codeschnippsel-zu-wordpress-kategorien/1163/</link>
		<comments>http://bueltge.de/codeschnippsel-zu-wordpress-kategorien/1163/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 03:23:51 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1163</guid>
		<description><![CDATA[Die Kategorien von WordPress können ein mächtiges Werkzeug sein, man kann aber auch daran verzweifeln, dazu ein anderes mal vielleicht mehr, aber es gibt auch nicht für jede Anwendung einen entsprechenden Template-Tag von WordPress und so muss man sich etwas bauen. Zwei kleine Sachen, die ich in letzter Zeit gebraucht habe und die ich nicht verstauben lasse will stehen nun in diesem Beitrag.]]></description>
			<content:encoded><![CDATA[<p>Die Kategorien von WordPress können ein mächtiges Werkzeug sein, man kann aber auch daran verzweifeln, dazu ein anderes mal vielleicht mehr, aber es gibt auch nicht für jede Anwendung einen entsprechenden Template-Tag von WordPress und so muss man sich etwas bauen. Zwei kleine Sachen, die ich in letzter Zeit gebraucht habe und die ich nicht verstauben lasse will stehen nun in diesem Beitrag.<br />
<span id="more-1163"></span></p>
<h4>Liste aller Unterkategorien</h4>
<p>Manchmal braucht man einfach nur eine Liste alle untergeordneten Kategorien, fragt nicht warum. Die Anforderungen von Projekten kann sehr vielfältig sein, ebenso der Lösungsweg und in meinem Fall ist ein kleiner Code-Schnippsel entstanden, die sich um die Ausgabe der Subcategories kümmert; zum mitnehmen, spielen, verbessern und erweitern.</p>
<pre><code class="php">
$echo = '&lt;ul&gt;' . "\n";
$childcats = get_categories('child_of=' . $cat . '&#038;hide_empty=1');
foreach ($childcats as $childcat) {
	if (1 == $childcat-&gt;category_parent) {
		$echo .= "\t" . '&lt;li&gt;&lt;a href="' . get_category_link($childcat-&gt;cat_ID).'" title="' . $childcat-&gt;category_description . '"&gt;';
		$echo .= $childcat-&gt;cat_name . '&lt;/a&gt;';
		$echo .= '&lt;/li&gt;' . "\n";
	}
}
$echo .= '&lt;/ul&gt;' . "\n";
echo $echo;
</code></pre>
<h4>Abfrage, ob in Kategorie oder Subkategorie</h4>
<p>Die zweite Sache brauchte ich nicht erstellen, die habe ich bei <a href="http://valendesigns.com/wordpress/is-category-or-subcategory-wp-function/">valen</a> gefunden - klein aber fein. Sie gibt zurück, ob man sich in einer untergeordneten- oder der Haupt-Kategorie befindet. Brauchen kann man so was, wenn man komplexe Strukturen aufbaut und steuern will. Als Übergabe muss die ID der Kategorie mitgegeben werden, kein Slug!</p>
<pre><code class="php">
function is_category_or_subcategory($catID = 0) {
	foreach (get_the_category() as $cat) {
		if ( $catID == $cat-&gt;cat_ID || cat_is_ancestor_of($catID, $cat) )
			return true;
	}
	return false;
}
</code></pre>
<p>In dem Zusammenhang im übrigen der Hinweis auf die Funktion <a href="http://codex.wordpress.org/Function_Reference/cat_is_ancestor_of"><code>cat_is_ancestor_of()</code></a> - sehr mächtig und nützlich.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/codeschnippsel-zu-wordpress-kategorien/1163/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/codeschnippsel-zu-wordpress-kategorien/1163/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress IDs, Classes &amp; Tag Referenz</title>
		<link>http://bueltge.de/wordpress-ids-classes-tag-referenz/1102/</link>
		<comments>http://bueltge.de/wordpress-ids-classes-tag-referenz/1102/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 09:45:50 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Linktipp]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1102</guid>
		<description><![CDATA[Wer mit Stylesheets im Bezug auf WordPress Themes arbeitet, der braucht immer diverse Klassen und IDs, um das Design an die jeweiligen Anforderungen anzupassen. Aktuell gibt es eine Referenz als PDF-Dokument  zum freien Download im Blog von Banhawi. Wer also ebenso etwas schnelles zum Nachschlagen benötigt und nicht erst Firebug und co. benutzen will, der sollte mal dort  vorbei schauen.]]></description>
			<content:encoded><![CDATA[<p>Wer mit Stylesheets im Bezug auf WordPress Themes arbeitet, der braucht immer diverse Klassen und IDs, um das Design an die jeweiligen Anforderungen anzupassen.<br />
Aktuell gibt es eine Referenz als <a href="http://banhawi.com/2010/02/banhawis-wordpress-ids-classes-tags-referenece/">PDF-Dokument</a> zum freien Download im <a href="http://banhawi.com/2010/02/banhawis-wordpress-ids-classes-tags-referenece/">Blog von Banhawi</a>. Wer also ebenso etwas schnelles zum Nachschlagen benötigt und nicht erst Firebug und co. benutzen will, der sollte mal <a href="http://banhawi.com/2010/02/banhawis-wordpress-ids-classes-tags-referenece/">dort</a> vorbei schauen.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-ids-classes-tag-referenz/1102/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-ids-classes-tag-referenz/1102/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Plugin für mehr Flexibilität beim Schreiben</title>
		<link>http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/</link>
		<comments>http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 04:20:27 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1086</guid>
		<description><![CDATA[Heute ist er nun da, der letzte Tag im Kalender und der letzte Tag, der mich zwingt, jeden Tag einen Beitrag zu veröffentlichen. Nicht selten habe ich über Nacht noch einen kleinen Beitrag geschrieben um die Leser am kommenden Morgen mit einem neuen Türchen zu beglücken. Nicht nur Kinder mögen die Überraschung am Morgen beim Öffnen eines neuen Türchens. Für mich ist nun erst mal Pause, andere Themen sind wichtiger und nur wenige werden vermutlich diesen Beitrag hier lesen; ist doch heute Weihnachten. Mir bleibt nur noch zu sagen:
Alles liebe und Gute, die herzlichsten Wünsche, ein friedliches Weihnachtsfest und einen guten Rutsch in das neue Jahr wünsche ich allen Lesern, allen Kunden, allen netten Kontakten und jedem, der irgendwie Mensch ist und mit mir zu tun hatte. Ich freue mich auf ein neues Jahr mit euch und hadere der Dinge, die uns im neuen Jahr erreichen werden. Als kleines Präsent zum heiligen Abend heute habe ich euch ein Plugin erstellt, was euch zum einen zusätzliche Felder in den Bereich Schreiben von WordPress bringt, was euch zeigt, wie einfach man den Bereich erweitern kann und was nach belieben von euch genutzt werden darf.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-24.jpg" alt="WP Adventskalender 24" /><br />
Heute ist er nun da, der letzte Tag im Kalender und der letzte Tag, der mich zwingt, jeden Tag einen Beitrag zu veröffentlichen. Nicht selten habe ich über Nacht noch einen kleinen Beitrag geschrieben um die Leser am kommenden Morgen mit einem neuen Türchen zu beglücken. Nicht nur Kinder mögen die Überraschung am Morgen beim Öffnen eines neuen Türchens. Für mich ist nun erst mal Pause, andere Themen sind wichtiger und nur wenige werden vermutlich diesen Beitrag hier lesen; ist doch heute Weihnachten. Mir bleibt nur noch zu sagen:<br />
<strong>Alles liebe und Gute, die herzlichsten Wünsche, ein friedliches Weihnachtsfest und einen guten Rutsch in das neue Jahr wünsche ich allen Lesern, allen Kunden, allen netten Kontakten und jedem, der irgendwie Mensch ist und mit mir zu tun hatte. Ich freue mich auf ein neues Jahr mit euch und harre der Dinge, die uns im neuen Jahr erreichen werden.</strong></p>
<p><img class="centeredob" src="http://bueltge.de/wp-content/images/weihnacht.png" alt="Es weihnachtet" /></p>
<p>Als kleines Präsent zum heiligen Abend heute habe ich euch ein Plugin erstellt, was euch zum einen zusätzliche Felder in den Bereich Schreiben von WordPress bringt, was euch zeigt, wie einfach man den Bereich erweitern kann und was nach belieben von euch genutzt werden darf.<br />
<span id="more-1086"></span><br />
Das Plugin bringt 3 neue Felder in einer Metabox mit:</p>
<ul>
<li><strong>Untertitel</strong> - wie der Name schon sagt, eine Zeile ohne Formatierung in der Ausgabe</li>
<li><strong>Zusatzinformationen</strong> - ein vollwertiger Editor, ebenso kann man jede Art von Attachments hinzufügen, also fast gleich dem Content-Editor.</li>
<li><strong>Listdaten</strong> - Hier wird ermöglicht, dass man pro Zeile einen Inhalt pflegt und jede Zeile als List-Element ausgeben wird, ungeordnete Liste <code>ul</code></li>
</ul>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/different-type/screenshot-1.png" alt="Screenshot im Edit-Bereich von WordPress" /></p>
<p>Jedes dieser Felder kann gezielt im Template des Themes eingesetzt werden, hat also einen Template Tag, der die Ausgabe steuert. Nur wenn es in diesem Feld Daten gibt, dann werden sie auch ausgegeben. Im folgenden ein Beispiel, der die drei neuen Felder ausgibt.</p>
<pre><code>
&lt;div &lt;?php post_class() ?&gt; id=&quot;post-&lt;?php the_ID(); ?&gt;&quot;&gt;

	&lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;

	&lt;h3&gt;&lt;?php if ( function_exists('the_DifferentTypeFacts') ) the_DifferentTypeFacts($post-&gt;ID, 'heading'); ?&gt;&lt;/h3&gt;

	&lt;div class=&quot;entry&quot;&gt;

		&lt;?php the_content('&lt;p class=&quot;serif&quot;&gt;Read the rest of this entry &amp;raquo;&lt;/p&gt;'); ?&gt;

		&lt;?php if ( function_exists('the_DifferentTypeFacts') ) the_DifferentTypeFacts($post-&gt;ID, 'additional-info'); ?&gt;

		&lt;?php if ( function_exists('the_DifferentTypeFacts') ) the_DifferentTypeFacts($post-&gt;ID, 'listdata'); ?&gt;
</code></pre>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/different-type/screenshot-2.png" alt="Screenshot im Frontend von WordPress" /></p>
<p>Das Plugin soll als Vorlage dienen, wer also mag, der passt es an und schafft eine Oberfläche, in der sich die Autoren wohl fühlen, keine Pflege der benutzerdefinierten Felder.</p>
<p>Das Plugin sorgt dafür, dass die Metaboxen "Benutzerdefinierte Felder" und "Trackbacks" nicht mehr da sind (<code>remove_meta_box()</code>); auch das als Beispiel für die Nutzung. Zu jedem der genutzten Code-Schnipsel im Plugin gibt es hier im Blog einen Beitrag und so sollte man damit klar kommen. Im folgenden der Code ohne Zusatzfiles und im Anschluss das Plugin als Download, inkl. readme, Sprachfiles für deutsche User und die nötigen Scripte.</p>
<pre><code>
&lt;?php
/**
 * @package Different Type
 * @author Frank B&amp;uuml;ltge
 * @version 0.1
 */
 
/*
	Plugin Name: Different Type
	Plugin URI: http://bueltge.de/
	Description: Add different types to posts
	Author: Frank B&amp;uuml;ltge
	Version: 0.1
	License: GPL
	Author URI: http://bueltge.de/
	Last change: 24.12.2009 00:00:00
*/

/**
 * Example for use outside the loop:
 * &lt;?php the_DifferentTypeFacts($post-&gt;ID); ?&gt;
 * @param $id Integer - Post-ID
 * @param $type String - heading, additional-info, listdata (default is ''-empty)
 *
 * Example: &lt;?php the_DifferentTypeFacts($post-&gt;ID, 'heading'); ?&gt;
 */

//avoid direct calls to this file, because now WP core and framework has been used
if ( !function_exists('add_action') ) {
	header('Status: 403 Forbidden');
	header('HTTP/1.1 403 Forbidden');
	exit();
}

if ( function_exists('add_action') ) {
	//WordPress definitions
	if ( !defined('WP_CONTENT_URL') )
		define('WP_CONTENT_URL', get_option('siteurl') . '/wp-content');
	if ( !defined('WP_CONTENT_DIR') )
		define('WP_CONTENT_DIR', ABSPATH . 'wp-content');
	if ( !defined('WP_PLUGIN_URL') )
		define('WP_PLUGIN_URL', WP_CONTENT_URL.'/plugins');
	if ( !defined('WP_PLUGIN_DIR') )
		define('WP_PLUGIN_DIR', WP_CONTENT_DIR.'/plugins');
	if ( !defined('PLUGINDIR') )
		define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH.  For back compat.
	if ( !defined('WP_LANG_DIR') )
		define('WP_LANG_DIR', WP_CONTENT_DIR . '/languages');
	
	// plugin definitions
	define( 'FB_DT_BASENAME', plugin_basename(__FILE__) );
	define( 'FB_DT_BASEDIR', dirname( plugin_basename(__FILE__) ) );
	define( 'FB_DT_TEXTDOMAIN', 'different-types' );
}

if ( !class_exists( 'DifferentType' ) ) {
	class DifferentType {
		
		// constructor
		function DifferentType() {
			
			if (is_admin() ) {
				add_action( 'admin_init', array(&amp;$this, 'on_admin_init') );
				add_action( 'wp_insert_post', array(&amp;$this, 'on_wp_insert_post'), 10, 2 );
				add_action( 'init', array(&amp;$this, 'textdomain') );
				register_uninstall_hook( __FILE__, array(&amp;$this, 'uninstall') );
				add_action( &quot;admin_print_scripts-post.php&quot;, array($this, 'enqueue_script') );
				add_action( &quot;admin_print_scripts-post-new.php&quot;, array($this, 'enqueue_script') );
				add_action( &quot;admin_print_scripts-page.php&quot;, array($this, 'enqueue_script') );
				add_action( &quot;admin_print_scripts-page-new.php&quot;, array($this, 'enqueue_script') );
			}
		}
		
		// active for multilanguage
		function textdomain() {
			
			if ( function_exists('load_plugin_textdomain') )
				load_plugin_textdomain( FB_DT_TEXTDOMAIN, false, dirname( FB_DT_BASENAME ) . '/languages' );
		}
		
		// unsintall all postmetadata
		function uninstall() {
			
			$all_posts = get_posts('numberposts=0&amp;post_type=post&amp;post_status=');

			

			foreach( $all_posts as $postinfo) {

				delete_post_meta($postinfo-&gt;ID, '_different-types');

			}
		}
		
		// add script
		function enqueue_script() {
			wp_enqueue_script( 'tinymce4dt', WP_PLUGIN_URL . '/' . FB_DT_BASEDIR . '/js/script.js', array('jquery') );
		}
		
		// admin init
		function on_admin_init() {
			
			if ( !current_user_can( 'publish_posts' ) )
				return;
			
			add_meta_box( 'different_types',
									__( 'Different Types', FB_DT_TEXTDOMAIN ),
									array( &amp;$this, 'meta_box' ),
									'post', 'normal', 'high'
									);
									
			// remove meta box for trackbacks
			remove_meta_box('trackbacksdiv', 'post', 'normal');
			// remove meta box for custom fields
			remove_meta_box('postcustom', 'post', 'normal');
		}
		
		// check for preview
		function is_page_preview() {
			$id = (int)$_GET['preview_id'];
			if ($id == 0) $id = (int)$_GET['post_id'];
			$preview = $_GET['preview'];
			if ($id &gt; 0 &amp;&amp; $preview == 'true') {
				global $wpdb;
				$type = $wpdb-&gt;get_results(&quot;SELECT post_type FROM $wpdb-&gt;posts WHERE ID=$id&quot;);
				if ( count($type) &amp;&amp; ($type[0]-&gt;post_type == 'page') &amp;&amp; current_user_can('edit_page') )
					return true;
			}
			return false;
		}
		
		// after save post, save meta data for plugin
		function on_wp_insert_post($id) {
			global $id;
			
			if ( !isset($id) )
				$id = (int)$_REQUEST['post_ID'];
			if ( $this-&gt;is_page_preview() &amp;&amp; !isset($id) )
				$id = (int)$_GET['preview_id'];
			
			if ( !current_user_can('edit_post') )
				return;
			
			if ( isset($_POST['dt-heading']) &amp;&amp; $_POST['dt-heading'] != '' )
				$this-&gt;data['heading'] = esc_attr( $_POST['dt-heading'] );
			if ( isset($_POST['dt-additional-info']) &amp;&amp; $_POST['dt-additional-info'] != '' )
				$this-&gt;data['additional-info'] = $_POST['dt-additional-info'];
			if ( isset($_POST['dt-listdata']) &amp;&amp; $_POST['dt-listdata'] != '' )
				$this-&gt;data['listdata'] = esc_attr( $_POST['dt-listdata'] );
			
			if ( isset($this-&gt;data) &amp;&amp; $this-&gt;data != '' )
				update_post_meta($id, '_different-types', $this-&gt;data);
		}

		// load post_meta_data
		function load_post_meta($id) {
			
			return get_post_meta($id, '_different-types', true);
		}

		// meta box on post/page
		function meta_box($data) {
			
			$value = $this-&gt;load_post_meta($data-&gt;ID);
			?&gt;
			&lt;table id=&quot;dt-page-definition&quot; width=&quot;100%&quot; cellspacing=&quot;5px&quot;&gt;
				&lt;tr valign=&quot;top&quot;&gt;
					&lt;td style=&quot;width:20%;&quot;&gt;&lt;label for=&quot;dt-heading&quot;&gt;&lt;?php _e( 'Subtitle:', FB_DT_TEXTDOMAIN ); ?&gt;&lt;/label&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;dt-heading&quot; name=&quot;dt-heading&quot; class=&quot;heading form-input-tip&quot; size=&quot;16&quot; autocomplete=&quot;off&quot; value=&quot;&lt;?php echo $value['heading']; ?&gt;&quot; tabindex=&quot;6&quot; style=&quot;width:99.5%&quot;/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr valign=&quot;top&quot;&gt;
					&lt;td&gt;&lt;label for=&quot;dt-additional-info&quot;&gt;&lt;?php _e( 'Additional information:', FB_DT_TEXTDOMAIN ); ?&gt;&lt;/label&gt;&lt;/td&gt;
					&lt;td&gt;&lt;textarea cols=&quot;16&quot; rows=&quot;5&quot; id=&quot;dt-additional-info&quot; name=&quot;dt-additional-info&quot; class=&quot;additional-info form-input-tip code&quot; size=&quot;20&quot; autocomplete=&quot;off&quot; tabindex=&quot;6&quot; style=&quot;width:90%&quot;/&gt;&lt;?php echo wpautop( $value['additional-info'] ); ?&gt;&lt;/textarea&gt;
						&lt;table id=&quot;post-status-info&quot; cellspacing=&quot;0&quot; style=&quot;line-height: 24px;&quot;&gt;
							&lt;tbody&gt;
								&lt;tr&gt;
									&lt;td&gt;&amp;nbsp;&lt;/td&gt;
									&lt;td&gt;&amp;nbsp;&lt;/td&gt;
								&lt;/tr&gt;
							&lt;/tbody&gt;
						&lt;/table&gt;
					&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr valign=&quot;top&quot;&gt;
					&lt;td&gt;&lt;label for=&quot;dt-listdata&quot;&gt;&lt;?php _e( 'Listdata:', FB_DT_TEXTDOMAIN ); ?&gt;&lt;/label&gt;&lt;/td&gt;
					&lt;td&gt;&lt;textarea cols=&quot;16&quot; rows=&quot;10&quot; id=&quot;dt-listdata&quot; name=&quot;dt-listdata&quot; class=&quot;listdata form-input-tip&quot; size=&quot;20&quot; autocomplete=&quot;off&quot; tabindex=&quot;6&quot; style=&quot;width:99.5%&quot;/&gt;&lt;?php echo $value['listdata']; ?&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;small&gt;&lt;?php _e( 'One list per line', FB_DT_TEXTDOMAIN ) ?&gt;&lt;/small&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;
			&lt;?php
		}

		// return facts incl. markup
		function get_DifferentTypeFacts($id, $type, $value) {
			
			if (!$value)
				return false;
			if ( $type == '' )
				return false;
			
			if ( 'heading' == $type &amp;&amp; '' != $value['heading'] )
				return $value['heading'];
			if ( 'additional-info' == $type &amp;&amp; '' != $value['additional-info'] )
				return wpautop( wptexturize($value['additional-info']) );
			if ( 'listdata' == $type &amp;&amp; '' != $value['listdata'] ) {
				$return = '';
				$listdatas = preg_split(&quot;/\r\n/&quot;, $value['listdata'] );

				foreach ( (array) $listdatas as $key =&gt; $listdata ) {

					$return .= '&lt;li&gt;' . trim($listdata) . '&lt;/li&gt;';

				}
				return '&lt;ul&gt;' . $return . '&lt;/ul&gt;'. &quot;\n&quot;;
			}
		}
		
		// echo facts, if exists
		function DifferentTypeFacts($id, $type, $string) {
		
			if ( $id ) {
				$value = $this-&gt;load_post_meta($id);
				
				echo $this-&gt;get_DifferentTypeFacts($id, $type, $value);
			}
		}

	} // End class
	
	// instance class
	$DifferentType = new DifferentType();
	
	
	// use in template
	function the_DifferentTypeFacts($id, $type = '', $string = '') {
		global $DifferentType;
		
		$DifferentType-&gt;DifferentTypeFacts($id, $type, $string);
	}
	
} // End if class exists statement
?&gt;
</code></pre>
<p>Download als zip-Datei: <a href="https://github.com/bueltge/different-type/zipball/master">github.com/bueltge/different-type/zipball/master</a> - 40 kByte<br />
Das Plugin liegt in einer gepflegten Version bei <a href="https://github.com/bueltge/different-type">github.com</a> und kann dort besichtigt, geforkt und gezogen werden.</p>
<p>Ich wünsche viel Spass damit und vielleicht wird das einen oder andere Projekt mit WordPress damit in diesem Bereich ein wenig klarer und logischer für die Autoren.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-24.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-24.jpg" medium="image">
			<media:title type="html">WP Adventskalender 24</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/weihnacht.png" medium="image">
			<media:title type="html">Es weihnachtet</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/different-type/screenshot-1.png" medium="image">
			<media:title type="html">Screenshot im Edit-Bereich von WordPress</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/different-type/screenshot-2.png" medium="image">
			<media:title type="html">Screenshot im Frontend von WordPress</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Contactable - Kontaktformular in WordPress</title>
		<link>http://bueltge.de/kontaktformular-wordpress-contactable/1072/</link>
		<comments>http://bueltge.de/kontaktformular-wordpress-contactable/1072/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 07:41:43 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1072</guid>
		<description><![CDATA[Die Integration eines Kontaktformulars mit WordPress beginnt meist bei einer Pluginsuche und endet oft mit einem viel zu großem Aufwand. Da werden Scripte geladen, Filter von WordPress über alle Seiten und Beiträge gejagt - nur um auf einer Seite ein Formular zu integrieren. Das Blog ist immer so gut wie sein Techniker und ich möchte heute mal einen ganz einfachen Weg zeigen, wie man sich ohne große Kenntnisse trotzdem ein Kontakt-Formular in das eigene Blog integriert.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-22.jpg" alt="WP Adventskalender 22" /><br />
Die Integration eines Kontaktformulars mit WordPress beginnt meist bei einer Pluginsuche und endet oft mit einem viel zu großem Aufwand. Da werden Scripte geladen, Filter von WordPress über alle Seiten und Beiträge gejagt - nur um auf einer Seite ein Formular zu integrieren. Das Blog ist immer so gut wie sein Techniker und ich möchte heute mal einen ganz einfachen Weg zeigen, wie man sich ohne große Kenntnisse trotzdem ein Kontakt-Formular in das eigene Blog integriert.<br />
<span id="more-1072"></span><br />
Die Lösung ist nicht der Weisheit letzter Schuss, aber sie zeigt, wie einfach es ist und wie ressourcenschonend für WordPress die Integration sein kann.<br />
Damit wir uns voll und ganz der Integration widmen können, und uns nicht mit PHP und JavaScript im Sinne des Formulars beschäftigen müssen, nutze ich hier im Beispiel das tolle Formular-Plugin<br />
<a href="http://theodin.co.uk/blog/ajax/contactable-jquery-plugin.html"><strong>Contactable</strong></a> für jQuery von Philip Beel. Das Plugin bringt alle erforderlichen Dateien mit und muss lediglich integriert werden - sehr einfach zu nutzen und wenn man mag an die eigenen Bedürfnisse anzupassen. Hinweise dazu gibt es auf der <a href="http://theodin.co.uk/blog/ajax/contactable-jquery-plugin.html">Site zum jQuery-Plugin</a>. Die Integration des Formulars zeige ich anhand des Standard-Themes Kubrick von WordPress, ist aber in jedem anderen Theme eben so zu nutzen. <strong>Aber Achtung</strong>, Spamer könnten das Plugin missbrauchen, daher gut überlegen oder erweitern - mehr dazu gibt es hier in den <a href="http://http://bueltge.de/kontaktformular-wordpress-contactable/1072/#comment-350200">Kommentaren</a> zu lesen. Danke in diesem Hinblick an Robert für die Hinweise und die damit verbundene Mühe.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/contactable.png" alt="Contactable im Kubrick" /></p>
<p>WordPress bringt im Standard die jQuery Bibliothek mit und so müssen wir uns um die nicht kümmern, sondern nutzen sie lediglich. Dabei findet der Aufruf aller nötigen Dateien und Scripte innerhalb des Templates statt, welches sich im Anschluss um die Ausgabe des Kontaktformulars kümmert. Dieses Aufruf erledigen wir mit den Funktionen von WordPress - so gehen wir sicher, dass die Dateien wirklich nur einmal geladen werden. WordPress kümmert sich um die richtige Reihenfolge und um die Abhängigkeiten. Zu diesem Thema habe ich bereits einiges an <a href="http://bueltge.de/javascript-bibliotheken-in-und-aus-wordpress-nutzen/808/">Infos hinterlegt und verweise auf diesen Beitrag</a>.</p>
<p>Als erstes erstellen wir ein Template, ich nenne es <code>contact-page.php</code> und es muss im Ordner eures Themes abgelegt werden. Dies enthält den Aufruf der nötigen Scripte und der dazugehörigen Stylesheets. Im Grunde benötigt ihr nur diese vier Aufrufe in der <code>page.php</code> eures Theme abzulegen, einen neuen Namen für die Datei zu vergeben und den Kommentar zum Erkennen durch WordPress im Page-Bereich des Backend abzulegen (ganz am Anfang der Datei). Im folgenden die Syntax am Beispiel der <code>page.php</code> aus dem Standard-Theme Kubrick.</p>
<pre><code>
&lt;?php
/**
 * Template Name: Contact Page
 *
 * @package WordPress
 * @subpackage Default_Theme
 */

wp_enqueue_script( 'jquery.contactable', get_bloginfo('template_directory') . '/contactable/jquery.contactable.js', array('jquery') , 3.1, true );
wp_enqueue_script( 'jquery.validate', get_bloginfo('template_directory') . '/contactable/jquery.validate.pack.js', array('jquery') , 3.1, true );
wp_enqueue_script( 'my_contactable', get_bloginfo('template_directory') . '/contactable/my_contactable.js', array('jquery') , 3.1, true );
wp_enqueue_style( 'contactable', get_bloginfo('template_directory') . '/contactable/contactable.css' );

get_header(); ?&gt;

	&lt;div id=&quot;content&quot; class=&quot;narrowcolumn&quot; role=&quot;main&quot;&gt;

		&lt;div class=&quot;post&quot; id=&quot;post-&lt;?php the_ID(); ?&gt;&quot;&gt;
		&lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;

			&lt;div class=&quot;entry&quot;&gt;
				&lt;?php the_content('&lt;p class=&quot;serif&quot;&gt;Read the rest of this page &amp;raquo;&lt;/p&gt;'); ?&gt;
				
				&lt;div id=&quot;mycontactform&quot;&gt; &lt;/div&gt;
				
			&lt;/div&gt;
		&lt;/div&gt;
	
	&lt;/div&gt;

&lt;?php get_sidebar(); ?&gt;

&lt;?php get_footer(); ?&gt;
</code></pre>
<p>Wie in der Syntax zu erkennen, habe ich alle Dateien des jQuery-Formular-Plugnis im Ordner <code>contactable</code> im Ordner des Themes abgelegt. Eventuell müssen daher eure Pfade angepasst werden. Aktuell sieht es in meinem Theme wie folgt aus:</p>
<ul>
<li>
default</p>
<ul>
<li>contactable
<ul>
<li>jquery.contactable.js</li>
<li>jquery.validate.pack.jss</li>
<li>my.contactable.js</li>
<li>contactable.css</li>
</ul>
</li>
<li>style.css</li>
<li>contact-page.php</li>
<li>...</li>
</ul>
</li>
</ul>
<p>Einzig die Datei <code>my.contactable.js</code> habe ich hinzugefügt; diese kümmert sich um den Aufruf des Formulars und kann mit Parametern gefüllt werden. Inhaltlich sieht sie wie folgt aus:</p>
<pre><code>
jQuery(document).ready( function($){
	$('#mycontactform').contactable({
		name: 'Name',
		email: 'E-Mail',
		message : 'Nachricht',
		recipient: 'example@domain.com',
		subject: 'Kontaktformular',
		recievedMsg : 'Vielen Dank f&amp;uuml;r Ihre Nachricht.'
	});
});
</code></pre>
<p>Sind alle Dateien gespeichert und an eure Bedürfnisse angepasst, dann muss lediglich im Admin-Bereich von WordPress eine Seite angelegt werden. Dieser Seite gebt ihr einen Namen, eventuell Inhalt und ihr müsst das Template auswählen - in unserem Fall die <strong>Contact Page</strong>. Nachdem Speichern sollte die Seite im Frontend des Blog aufzurufen sein und mit einem Klick auf das kleine Label fährt das Formular in die Sicht und kann ausgefüllt werden.</p>
<p>Durch die Aufrufe mit Hilfe von WordPress Funktionen und den richtigen Parametern, sind nun die Scripte im Footer der Site integriert. Die Bibliothek jQuery muss nicht aufgerufen werden, sie wird von WordPress hinzugefügt, wenn sie noch nicht da ist, durch die Abhängigkeit der Parameter zum Schlüssel <code>jquery</code>. Durch die Nutzung eines Templates mit allen Aufrufen werden sämtliche Scripte und StyleSheets nur eingebunden, wenn diese Seite von WordPress aufgerufen wird. Wer das Formular-Schnippsel auf allen Seiten möchte, der macht den Aufruf bspw. in der <code>header.php</code> oder <code>functions.php</code>.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/contactable-ocss.png" alt="Contactable im Kubrick" /></p>
<p>Möchte man diese Funktion nicht nutzen, so kann entweder dass CSS nicht genutzt werden, bzw. ein eigenes Design hinzugefügt werden oder man passt das JS an seine eigenen Bedürfnisse an. Gleiches gilt für zusätzliche Felder im Formular, dazu muss der Inhalt der Dateien angepasst werden.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/kontaktformular-wordpress-contactable/1072/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/kontaktformular-wordpress-contactable/1072/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-22.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-22.jpg" medium="image">
			<media:title type="html">WP Adventskalender 22</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/contactable.png" medium="image">
			<media:title type="html">Contactable im Kubrick</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/contactable-ocss.png" medium="image">
			<media:title type="html">Contactable im Kubrick</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Beitragsausgabe in Abhängigkeit der Kommentare</title>
		<link>http://bueltge.de/beitragsausgabe-abhaengigkeit-kommentare/1081/</link>
		<comments>http://bueltge.de/beitragsausgabe-abhaengigkeit-kommentare/1081/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 07:28:06 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Queries]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1081</guid>
		<description><![CDATA[Den Loop zu verstehen ist das eine, den Query auf seine Bedürnisse anzupassen etwas anderes. In diesem Zusammenhang gibt es sehr viele Möglichkeiten und man muss keinen SQL-Befehl absetzen. Mit WordPress Version 2.9 gibt es ein weiteres kleines Highlight, die Ausgabe der Inhalte in Abhängigkeit der Kommentare - orderby=comment_count.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-19.jpg" alt="WP Adventskalender 19" /><br />
Den Loop zu verstehen ist das eine, den Query auf seine Bedürnisse anzupassen etwas anderes. In diesem Zusammenhang gibt es sehr viele Möglichkeiten und man muss keinen SQL-Befehl absetzen.<br />
Mit WordPress Version 2.9 gibt es ein weiteres kleines Highlight, die Ausgabe der Inhalte in Abhängigkeit der Kommentare - <code>orderby=comment_count</code>.<br />
<span id="more-1081"></span><br />
Damit wird die Ausgabe für Themes, die beispielsweise die Sortierung <strong>aufgrund der Kommentarbeteiligung</strong> vornehmen, zum Kinderspiel. Ebenso kann man damit die meist kommentierten Beiträge als Mehrwert für den Leser recht einfach umsetzen.</p>
<pre><code class="php">
query_posts('posts_per_page=5&amp;offset=1&amp;orderby=comment_count');
if ( have_posts() ) :
	while ( have_posts() ) : the_post(); ?&gt;
</code></pre>
<p>Alternativ kann man beispielsweise auch <strong>via Zufall sortieren</strong> lassen; nützlich bei kleinen Gimmicks in der Sidebar; auch dazu ein Beispiel mit anderer Syntax.</p>
<pre><code>
&lt;?php
$i = new WP_Query( array('category_name' =&gt; 'referenzen', 'showposts' =&gt; 10, 'nopaging' =&gt; 0, 'post_status' =&gt; 'publish', 'caller_get_posts' =&gt; 1, 'orderby' =&gt; 'rand') );
if ( $i-&gt;have_posts() ) : ?&gt;
</code></pre>
<p>Ebenso kann man seit Version 2.8 von WordPress die Sortierung deaktivieren - <code>orderby=none</code>.</p>
<p>Viele weitere Tipps gibt es in einem <a href="http://bueltge.de/wordpress-query-quick-tipps/717/">Quick Tipp</a> von mir und natürlich im <a href="http://codex.wordpress.org/Template_Tags/query_posts">Codex</a> von WordPress.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/beitragsausgabe-abhaengigkeit-kommentare/1081/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/beitragsausgabe-abhaengigkeit-kommentare/1081/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-19.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-19.jpg" medium="image">
			<media:title type="html">WP Adventskalender 19</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Post Thumbnail und die Abwärtskompatibilität</title>
		<link>http://bueltge.de/wordpress-post-thumbnail-abwaertskompatibel/1079/</link>
		<comments>http://bueltge.de/wordpress-post-thumbnail-abwaertskompatibel/1079/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 08:09:51 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1079</guid>
		<description><![CDATA[WordPress bringt mit Version 2.9 die wohl am meisten diskutierte Funktion des Post Thumbnails in das System. Für windige Theme-Autoren war das auch im Vorfeld kein Thema und trotzdem wird sie geliebt. Wichtig bei dieser Funktion, sie geht nur, wenn man sie explizit im Theme aktiviert. Dies macht der folgenden kleine Schnipsel in der functions.php des Themes: add_theme_support('post-thumbnails');.

Aber auch bei dieser Funktion sollte man auf das Vorhandensein der Funktion prüfen und eine Alternative anbieten. Nur so kann man dem Nutzer die Freiheit der WordPress Version überlassen. Die Funktionen von Erweiterungen, Plugins und Themes gehröen einer Prüfung unterzogen; so ist die Funktion des Themes abgesichert, auch wenn eine Funktion nicht zur Verfügung steht. Ähnlich sehe ich es mit dieser Funktion für die Thumbnails zum Beitrag, auch wenn sie Funktionen aus dem Core nutzen.

Zwei Anregungen für Alternativen möchte ich im folgenden kurz aufzeigen und ich verweise auf den ausführlichen Artikel zum Thema Bilder in Themes mit Benutzerdef. Feldern oder der Mediathek von WordPress nutzen.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-18.jpg" alt="WP Adventskalender 18" /><br />
WordPress bringt mit <a href="http://codex.wordpress.org/Version_2.9">Version 2.9</a> die wohl am meisten diskutierte Funktion des Post Thumbnails in das System. Für windige Theme-Autoren war das auch im Vorfeld kein Thema und trotzdem wird sie geliebt. Wichtig bei dieser Funktion, sie geht nur, wenn man sie explizit im Theme aktiviert. Dies macht der folgenden kleine Schnipsel in der functions.php des Themes: <code>add_theme_support('post-thumbnails');</code>.</p>
<p>Aber auch bei dieser Funktion sollte man auf das Vorhandensein der Funktion prüfen und eine Alternative anbieten. Nur so kann man dem Nutzer die Freiheit der WordPress Version überlassen. Die Funktionen von Erweiterungen, Plugins und Themes gehröen einer Prüfung unterzogen; so ist die Funktion des Themes abgesichert, auch wenn eine Funktion nicht zur Verfügung steht. Ähnlich sehe ich es mit dieser Funktion für die Thumbnails zum Beitrag, auch wenn sie Funktionen aus dem Core nutzen.</p>
<p>Zwei Anregungen für Alternativen möchte ich im folgenden kurz aufzeigen und ich verweise auf den ausführlichen <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/">Artikel zum Thema Bilder in Themes mit Benutzerdef. Feldern oder der Mediathek von WordPress nutzen</a>.<br />
<span id="more-1079"></span></p>
<p>Nach Hinzufügen der folgenden Syntax in der <code>functions.php</code> des Themes steht die MetaBox im Bereich Schreiben eines Beitrags bzw. Seite bereit und kann einfach via Aufruf der Mediathek aus dieser MetaBox genutzt werden.</p>
<pre><code class="php">
if ( function_exists('add_theme_support') )
	add_theme_support('post-thumbnails');
</code></pre>
<p>Alternativ kann man zwischen Beiträgen und Seiten trennen:</p>
<pre><code>
add_theme_support( 'post-thumbnails', array( 'post' ) ); //Beiträge
add_theme_support( 'post-thumbnails', array( 'page' ) ); //Seiten
</code></pre>
<p>Man kann im übrigen auch Größen definieren, zum einen direkt für Thumbnails ...</p>
<pre><code>
set_post_thumbnail_size( 150, 150, true ); // Breite, Höhe, true für kein crop mode; beschneiden
</code></pre>
<p>... und ebenso andere Größen, in dem man zusätzlich einen Namen vergibt. Im obigen Code ist der Standard-Name <code>post-thumbnail</code> übergeben.</p>
<pre><code>
add_image_size('my-single-picture', 150, 150, false);
</code></pre>
<p>Die Ausgabe des Bildes wird dann im Theme an der Stelle, wo es erscheinen soll, einfach mit Hilfe des Template Tag erzeugt: <code>the_post_thumbnail()</code>.</p>
<pre><code class="php">
if ( current_theme_supports( 'post-thumbnails' ) )
	the_post_thumbnail( array(300,200) );
</code></pre>
<p>Alternativ kann man dann auch wieder die eigenen Typen abfragen:</p>
<pre><code>
the_post_thumbnail( 'my-single-picture' );
</code></pre>
<p>Wichtig, arbeitet man mit zusätzlichem Markup, dann gehört die Abfrage dazu, ob es denn ein Thumbnail zum Beitrag gibt. Ansonsten wird unnötig Markup ausgegeben, welches keinen Inhalt hat.</p>
<pre><code class="php">
&lt;?php
if ( has_post_thumbnail() ) { ?&gt;
	&lt;span class="my_image"&gt;
		&lt;?php the_post_thumbnail(array(600, 400)); ?&gt;
	&lt;/span&gt;
} ?&gt;
</code></pre>
<p>Um nun aber eine Alternative für Installationen kleiner WP 2.9 zu haben, kann man verschiedene Ansätze gehen. Die zwei folgenden Beispiele sind daher als Ideengeber zu verstehen: entweder mit Hilfe der benutzerdefinierten Felder, Feldname ist <code>post-image</code> ...</p>
<pre><code class="php">
if ( function_exists('has_post_thumbnail') &amp;&amp; has_post_thumbnail() ) {
	the_post_thumbnail(); // @parameter: array(height, width)
} else {
	$myimage = get_post_meta($post-&gt;ID, 'post-image', true); // via custom field
	if ($myimage) {
		echo '&lt;img class="wp-post-image" src="'.$postimage.'" alt="Post Iage" /&gt;';
	}
}
</code></pre>
<p>... oder im nachfolgenden Beispiel das erste Bild aus der Mediathek. Mehr dazu gibt es in <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/">einem separaten Beitrag</a>.</p>
<pre><code class="php">
if ( function_exists('has_post_thumbnail') &amp;&amp; has_post_thumbnail() ) {
	the_post_thumbnail(); // @paramter: array(height, width)
} else {
	// via mediathek
	$attachments = get_children( array(
									'post_parent'    =&gt; get_the_ID(),
									'post_type'      =&gt; 'attachment',
									'numberposts'    =&gt; 1, // show all -1
									'post_status'    =&gt; 'inherit',
									'post_mime_type' =&gt; 'image',
									'order'          =&gt; 'ASC',
									'orderby'        =&gt; 'menu_order ASC'
									) );
	foreach ( $attachments as $attachment_id =&gt; $attachment ) {
		echo wp_get_attachment_image( $attachment_id );
	}
}
</code></pre>
<p><strong>Prüfen</strong> ob das Theme die Funktion unterstützt ist ebenso möglich:</p>
<pre><code class="php">
if ( current_theme_supports( 'post-thumbnails' ) ) {
	...
</code></pre>
<p>Zusätzlich kann man prüfen, ob das Theme die Funktion  unterstützt und explizit für Beiträge (post) oder Seiten (page) nutzen. Sehr interessant, wenn man zusätzliche Funktionen in den Schreiben-Bereich des Backend bringen möchte, welcher abhängig von diesem Feature innerhalb des Theme ist.:</p>
<pre><code class="php">
if ( current_theme_supports( 'post-thumbnails', array( 'page' ) ) ) {
	add_meta_box( ...
</code></pre>
<p>In diesem Zusammenhang kann man auch extern Dateien mit neuen Funktionen einbinden.</p>
<pre><code class="php">
require_if_theme_supports( 'post-thumbnails', ABSPATH . WPINC . '/my-post-thumbnail-funktion.php' );
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-post-thumbnail-abwaertskompatibel/1079/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-post-thumbnail-abwaertskompatibel/1079/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-18.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-18.jpg" medium="image">
			<media:title type="html">WP Adventskalender 18</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Aktive Widget-Bereiche abfragen</title>
		<link>http://bueltge.de/aktive-widget-bereiche-abfragen/1050/</link>
		<comments>http://bueltge.de/aktive-widget-bereiche-abfragen/1050/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 07:55:23 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Webdeveloper]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1050</guid>
		<description><![CDATA[Wer im Theme Widgets nutzt und dazu noch diverse Hirarchien unterbringt, der wird schnell merken, dass es eigentlich nur dann Sinn macht, das HTML zu dem jeweiligen Bereich auszugeben, wenn der Widget-Bereich auch vom User genutzt wird, wenn also Widgets im Bereich abgelegt sind.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-07.jpg" alt="WP Adventskalender 07" /><br />
Wer im Theme Widgets nutzt und dazu noch diverse Hierarchien unterbringt, der wird schnell merken, dass es eigentlich nur dann Sinn macht, das HTML zu dem jeweiligen Bereich auszugeben, wenn der Widget-Bereich auch vom User genutzt wird, wenn also Widgets im Bereich abgelegt sind.<br />
<span id="more-1050"></span><br />
Diesem Thema haben sie die Entwickler des Theme-Framework <a href="http://code.google.com/p/thematic/">Thematic</a> schon seit langer Zeit angenommen und die Lösung ist ebenso interessant für Autoren, die ihr Theme ohne dieses Framework erstellen.<br />
Dazu genügt eine Funktion, die den bekannten <a href="http://codex.wordpress.org/Conditional_Tags">Conditional Tags</a> von WordPress gleich kommt. Diese Funktion wird in der <code>functions.php</code> des Themes abgelegt.</p>
<pre><code class="php">
function is_sidebar_active($index) {
	global $wp_registered_sidebars;

	$widgetcolums = wp_get_sidebars_widgets();

	if ($widgetcolums[$index])
		return true;

	return false;
}
</code></pre>
<p>Damit wird die Ausgabe des Widget-Bereiches nur genutzt, wenn es auch Inhalte gibt.<br />
Im Template könnte die Abfrage beispielsweise wie folgt aussehen.</p>
<pre><code class="php">
&lt;?php if ( function_exists('is_sidebar_active') &amp;&amp; is_sidebar_active('sidebar') ) { ?&gt;
	&lt;div id=&quot;sidebar&quot;&gt;
		&lt;ul&gt;
			&lt;?php dynamic_sidebar('sidebar'); ?&gt;
		&lt;/ul&gt;
	&lt;/div&gt;
&lt;?php } ?&gt;
</code></pre>
<p>Das obige Beispiel lädt den Inhalt nur, wenn der Widget-Bereich mit der ID <code>sidebar</code> Inhalte hat, also wenn Widgets in diesem Bereich genutzt werden.</p>
<p>Seit WordPress <strong>Version 2.8</strong> gibt es dazu auch eine Funktion im Core und man muss die obige Funktion nicht eigens hinzu bringen <code>is_active_sidebar()</code>. Damit geht die Prüfung ebenso einfach und sicher.</p>
<pre><code class="php">
&lt;?php if ( function_exists('is_active_sidebar') &amp;&amp; is_active_sidebar('sidebar') ) { ?&gt;
	&lt;div id=&quot;sidebar&quot;&gt;
		&lt;ul&gt;
			&lt;?php dynamic_sidebar('sidebar'); ?&gt;
		&lt;/ul&gt;
	&lt;/div&gt;
&lt;?php } ?&gt;
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/aktive-widget-bereiche-abfragen/1050/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/aktive-widget-bereiche-abfragen/1050/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-07.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-07.jpg" medium="image">
			<media:title type="html">WP Adventskalender 07</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Beschreibungen für WordPress Widget-Bereiche</title>
		<link>http://bueltge.de/beschreibungen-fuer-wordpress-widget-bereiche/1049/</link>
		<comments>http://bueltge.de/beschreibungen-fuer-wordpress-widget-bereiche/1049/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 07:37:21 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP2.9]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1049</guid>
		<description><![CDATA[Mit WordPress Version 2.9 gibt es nun die Möglichkeit, dass man nähere Beschreibungen der Widget-Bereiche übergeben kann. Dies ist besonders dann interessant, wenn man unterschiedliche Widget-Areas definiert, sei es in Abhängigkeit der Kategorien in der Sidebar oder weil man als Theme-Autor diverse Widget-Bereiche definiert, die Anpassungen in mehr Bereichen, als nur im Sidebar, zulassen. Ich tue dies beispielsweise im Theme Greyfoto, wo auch der Footer-Bereich via Widgets bestückt werden kann.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-05.jpg" alt="WP Adventskalender 05" /><br />
Mit WordPress Version 2.9 gibt es nun die Möglichkeit, dass man nähere Beschreibungen der Widget-Bereiche übergeben kann. Dies ist besonders dann interessant, wenn man unterschiedliche Widget-Areas definiert, sei es in Abhängigkeit der Kategorien in der Sidebar oder weil man als Theme-Autor diverse Widget-Bereiche definiert, die Anpassungen in mehr Bereichen, als nur im Sidebar, zulassen. Ich tue dies beispielsweise im Theme Greyfoto, wo auch der Footer-Bereich via Widgets bestückt werden kann.<br />
<span id="more-1049"></span><br />
Im folgenden Beispiel-Code wird ein Widget-Bereich definiert, genannt <em>My Lorem Ipsum Sidebar</em>, der eine &#8222;nähere&#8220; Beschreibung enthält und so eindeutiger sein kann; der Code gehört in die <code>functions.php</code> des Themes.</p>
<pre><code class="php">
if ( function_exists('register_sidebar') ) {
	register_sidebar(array(
		'name' =&gt; 'My Lorem Ipsum Sidebar',
		'description' =&gt; __('Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.', 'your_textdomain'),
		'before_widget' =&gt; '&lt;li id=&quot;%1$s&quot; class=&quot;widget %2$s&quot;&gt;',
		'after_widget' =&gt; '&lt;/li&gt;',
		'before_title' =&gt; '&lt;h2 class=&quot;widgettitle&quot;&gt;',
		'after_title' =&gt; '&lt;/h2&gt;',
	));
}
</code></pre>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-widgets.png" alt="WordPress Widget Bereich" /></p>
<p>Ein etwas umfassendes Beispiel mit zwei Widgetbereichen, ein Bereich für den Sidebar und ein Bereich für den Footer; in der Regle also in die <code>footer.php</code>.</p>
<pre><code class="php">
if ( function_exists('register_sidebar') ) {
	register_sidebar(array(
		'id' =&gt; 'mysidebar',
		'name' =&gt; 'My Lorem Ipsum Sidebar',
		'description' =&gt; __('Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.', 'your_textdomain'),
		'before_widget' =&gt; '&lt;li id=&quot;%1$s&quot; class=&quot;widget %2$s&quot;&gt;',
		'after_widget' =&gt; '&lt;/li&gt;',
		'before_title' =&gt; '&lt;h2 class=&quot;widgettitle&quot;&gt;',
		'after_title' =&gt; '&lt;/h2&gt;',
	));

	register_sidebar(array(
		'id' =&gt; 'myfooter',
		'name' =&gt; 'My Lorem Ipsum Footer',
		'description' =&gt; __('Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.', 'your_textdomain'),
		'before_widget' =&gt; '&lt;li id=&quot;%1$s&quot; class=&quot;widget %2$s&quot;&gt;',
		'after_widget' =&gt; '&lt;/li&gt;',
		'before_title' =&gt; '&lt;h2 class=&quot;widgettitle&quot;&gt;',
		'after_title' =&gt; '&lt;/h2&gt;',
	));
}
</code></pre>
<p>Diesen kann man im einfachsten Fall dann wie folgt in den Templates nutzen; im folgendem mal die Nutzung in der <code>footer.php</code> des Widget-Bereiches <em>My Lorem Ipsum Footer</em>.</p>
<pre><code class="php">
&lt;div id=&quot;myfooter&quot;&gt;
	&lt;ul&gt;
		&lt;?php dynamic_sidebar('myfooter'); ?&gt;
	&lt;/ul&gt;
&lt;/div&gt;
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/beschreibungen-fuer-wordpress-widget-bereiche/1049/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/beschreibungen-fuer-wordpress-widget-bereiche/1049/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-05.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-05.jpg" medium="image">
			<media:title type="html">WP Adventskalender 05</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-widgets.png" medium="image">
			<media:title type="html">WordPress Widget Bereich</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Neue Templates für Kategorien</title>
		<link>http://bueltge.de/neue-templates-fuer-kategorien/1048/</link>
		<comments>http://bueltge.de/neue-templates-fuer-kategorien/1048/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 08:00:18 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[StyleSheet]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP2.9]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1048</guid>
		<description><![CDATA[Um das Design oder die Inhalte im Bezug auf eine bestimmte Kategorie anzupassen, musste man bisher eine Abfrage im Theme oder in einem Plugin nutzen. Mit Version 2.9 wird WordPress in der Template-Hirarchie erweitert und man kann nun auf Grund des Slug eigene Templates erstellen.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-02.jpg" alt="WP Adventskalender 02" /><br />
Um das Design oder die Inhalte im Bezug auf eine bestimmte Kategorie anzupassen, musste man bisher eine Abfrage im Theme oder in einem Plugin nutzen. Mit Version 2.9 wird WordPress in der Template-Hirarchie erweitert und man kann nun auf Grund des Slug eigene Templates erstellen.<br />
<span id="more-1048"></span><br />
Ein Beispiel soll es verdeutlichen; diverse Beiträge werden als Kurznews ausgegeben, ein Microblog also. Daher lege ich eine Kategorie mit diesem Namen an und nutze den generierten Slug.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/cat-slug.png" alt="WordPress Kategorie pflegen" /></p>
<p>Die Darstellung dieser Beiträge in der Kategorie-Übersicht soll eine andere sein. Bisher musste man dazu folgenden Abfrage integrieren:</p>
<pre><code class="php">
if ( is_category('microblog') ) {
	// hier die Ausgabe oder Integration des Stylesheet für Kategorie <em>Microblog</em>
}
</code></pre>
<p>Mit WordPress 2.9 reicht das entsprechende Template <code>category-microblog.php</code> und dieses Template wird gezogen, wenn man in der Kategorie des Slug <code>microblog</code> ist. Alternativ geht es auch weiterhin mit der ID, die sich aber ändern kann. Über den Namen des Slug ist die Identifizierung eindeutig und einfach.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/neue-templates-fuer-kategorien/1048/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/neue-templates-fuer-kategorien/1048/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-02.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-02.jpg" medium="image">
			<media:title type="html">WP Adventskalender 02</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/cat-slug.png" medium="image">
			<media:title type="html">WordPress Kategorie pflegen</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Login Formular</title>
		<link>http://bueltge.de/wordpress-login-formular/976/</link>
		<comments>http://bueltge.de/wordpress-login-formular/976/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 15:52:12 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Formular]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=976</guid>
		<description><![CDATA[Vor geraumer Zeit habe ich mal einen kurzen Artikel veröffentlicht, in dem ich gezeigt habe, wie man die Links zum Ein- und Ausloggen in WordPress nutzt. In diesem Artikel möchte ich nun ein wenig weiter gehen und zeigen, wie man beispielsweise das Login-Formular in das Theme holt. Damit sind Anpassungen an das Design und die Integration an die eigenen Bedürfnisse sehr einfach umzusetzen.]]></description>
			<content:encoded><![CDATA[<p>Vor geraumer Zeit habe ich mal einen kurzen Artikel veröffentlicht, in dem ich gezeigt habe, wie man die Links zum <a href="http://bueltge.de/schoener-einloggen-mit-wordpress/371/">Ein- und Ausloggen in WordPress</a> nutzt. In diesem Artikel möchte ich nun ein wenig weiter gehen und zeigen, wie man beispielsweise das Login-Formular in das Theme holt. Damit sind Anpassungen an das Design und die Integration an die eigenen Bedürfnisse sehr einfach umzusetzen.<br />
<span id="more-976"></span><br />
Im ersten Fall möchte ich euch das klassische Login Formular zeigen, so dass es nicht gleich zu viel Code wird. Die folgende Syntax stellt dabei ein einfaches Login Formular im Theme dar. Ich habe keine weiteren Anpassungen vorgenommen und habe mich am Standard von WordPress orientiert.</p>
<pre><code>
&lt;form action="&lt;?php echo wp_login_url( get_permalink() ); ?&gt;" method="post"&gt;
	&lt;label for="log"&gt;
		&lt;input type="text" name="log" id="log" value="&lt;?php echo wp_specialchars(stripslashes($user_login), 1) ?&gt;" size="22" /&gt; User
	&lt;/label&gt;&lt;br /&gt;
	&lt;label for="pwd"&gt;
		&lt;input type="password" name="pwd" id="pwd" size="22" /&gt; Password
	&lt;/label&gt;&lt;br /&gt;
	&lt;input type="submit" name="submit" value="Send" class="button" /&gt;
	&lt;label for="rememberme"&gt;&lt;input name="rememberme" id="rememberme" type="checkbox" checked="checked" value="forever" /&gt; Remember me&lt;/label&gt;
&lt;/form&gt;
</code></pre>
<p><img class="alignright" src="http://bueltge.de/wp-content/images/wp/loginform.png" alt="WP Loginform" /><br />
Nun ist das nicht immer ausreichend und abhängig von den Usern, die geloggt sind, und ob man sich überhaupt im Theme registrieren kann, habe ich ein kleines Beispiel geschrieben, welches diverse Aspekte beachtet.<br />
Mit der folgenden Syntax ist dabei die Ansicht für geloggte User (<code>if ( $user_ID )</code>) eine völlig andere und neue User bekommen das Formular nur dann, wenn sie sich registrieren dürfen (<code>get_option('users_can_register')</code>); abhängig von den Einstellungen im Backend von WordPress.<br />
Ebenso bekommen User, die ein <a href="http://bueltge.de/userlevel-bezogene-ausgabe-im-theme-von-wordpress/292/">User_Level</a> größer 1 (<code>if ( $user_level &gt;= 1 )</code>) haben, einen Link mehr, direkt zum Schreiben eines Artikels. Alternativ kann hier auch mit der Funktion <code>current_user_can()</code> gearbeitet werden und daher explizit das Objekt der Rolle abgefragt werden.</p>
<pre><code class="php">
&lt;?php
global $user_ID, $user_identity, $user_level;
if ( $user_ID ) { ?&gt;

	&lt;h3&gt;&lt;?php _e( 'Control panel', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/h3&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;?php _e( 'Identified as', FB_BASIS_TEXTDOMAIN ); ?&gt; &lt;strong&gt;&lt;?php echo $user_identity ?&gt;&lt;/strong&gt;.
			&lt;ul&gt;
				&lt;li&gt;&lt;a href="&lt;?php bloginfo('url') ?&gt;/wp-admin/"&gt;&lt;?php _e( 'Dashboard', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;&lt;/li&gt;

				&lt;?php if ( $user_level &gt;= 1 ) { ?&gt;
					&lt;li&gt;&lt;a href="&lt;?php bloginfo('url') ?&gt;/wp-admin/post-new.php"&gt;&lt;?php _e( 'Write an article', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;&lt;/li&gt;
				&lt;?php } ?&gt;

				&lt;li&gt;&lt;a href="&lt;?php bloginfo('url') ?&gt;/wp-admin/profile.php"&gt;&lt;?php _e( 'Profile', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href="&lt;?php wp_logout_url( urlencode($_SERVER['REQUEST_URI']) ); ?&gt;"&gt;&lt;?php _e( 'Exit', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;

&lt;?php } elseif ( get_option('users_can_register') ) { ?&gt;

		&lt;h3&gt;&lt;?php _e( 'Identification', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/h3&gt;
		&lt;ul&gt;
			&lt;li&gt;
				&lt;form action="&lt;?php echo wp_login_url(get_permalink()); ?&gt;" method="post"&gt;
					&lt;p&gt;
						&lt;label for="log"&gt;
							&lt;?php _e( 'User', FB_BASIS_TEXTDOMAIN ); ?&gt;
							&lt;input type="text" name="log" id="log" value="&lt;?php echo wp_specialchars(stripslashes($user_login), 1) ?&gt;" size="22" /&gt;
						&lt;/label&gt;&lt;br /&gt;
						&lt;label for="pwd"&gt;
							&lt;?php _e( 'Password', FB_BASIS_TEXTDOMAIN ); ?&gt;
							&lt;input type="password" name="pwd" id="pwd" size="22" /&gt;
						&lt;/label&gt;&lt;br /&gt;
						&lt;input type="submit" name="submit" value="&lt;?php _e( 'Send', FB_BASIS_TEXTDOMAIN ); ?&gt;" class="button" /&gt;
						&lt;label for="rememberme"&gt;
							&lt;input name="rememberme" id="rememberme" type="checkbox" checked="checked" value="forever" /&gt;&lt;?php _e( 'Remember me', FB_BASIS_TEXTDOMAIN ); ?&gt;
						&lt;/label&gt;&lt;br /&gt;
						&lt;input type="hidden" name="redirect_to" value="&lt;?php echo $_SERVER['REQUEST_URI']; ?&gt;"/&gt;
					&lt;/p&gt;
				&lt;/form&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;a href="&lt;?php echo site_url('wp-login.php?action=register', 'login'); ?&gt;"&gt;&lt;?php _e( 'Register', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;a href="&lt;?php echo site_url('wp-login.php?action=lostpassword', 'login');	 ?&gt;"&gt;&lt;?php _e( 'Recover password', FB_BASIS_TEXTDOMAIN ); ?&gt;&lt;/a&gt;
			&lt;/li&gt;
		&lt;/ul&gt;

&lt;?php } ?&gt;
</code></pre>
<p>Wem die User-Level nicht ausreichen, der kann WordPress auch erweitern, entweder via Code,<a href="http://bueltge.de/wp-plugin-tipp-userlevel-abfragen/213/"> hier erklärt</a>, oder mit Hilfe eines Plugins.<br />
Mit Hilfe von einigen Zeilen PHP kann schnell ein Berechtigungsobjekt einer Rolle zugewiesen werden, beispielsweise in beim Aktivieren des Theme wie folgt.</p>
<pre><code>
function my_new_object() {
	global $wp_roles;

	$wp_roles-&gt;add_cap('administrator', 'MyObject');
}

// start an activation theme
if ( is_admin() &amp;&amp; isset($_GET['activated'] ) &amp;&amp; $pagenow == 'themes.php' )
	my_new_object();
</code></pre>
<p>Das Objekt kann dann einfach via Standard angefragt werden.<br />
<code>if ( current_user_can('MyObject') )</code></p>
<p>Alternativ kann man natürlich auch neue Rollen anlegen: <code>add_role('Neue_Rolle', 'Neuer Name der Rolle');</code>. Die Funktion erlaubt auch das gleichzeitige übernehmen von Rechten, dazu steht der dritte optionale Parameter bereit, der mehrere Werte in einem Array erwartet. Ansonsten die Objekte via <code>add_cap()</code> hinzufügen.</p>
<p>Das ist nur ein kleiner Ansatz, viele Möglichkeiten ergeben sich - viel Erfolg beim Nutzen der Möglichkeiten.</p>
<h3>Ab WordPress 3.0</h3>
<p>Ab der Version 3.0 geht das alles ein wenig einfacher und es gibt eine Funktion für das Formular um den User das Einloggen zu ermöglichen. Folgende Parameter sind möglich.</p>
<pre><code class="php">
wp_login_form(array(
    'echo' =&gt; true,
    'redirect' =&gt; site_url($_SERVER['REQUEST_URI']), 
    'form_id' =&gt; 'loginform',
    'label_username' =&gt; __('Username'),
    'label_password' =&gt; __('Password'),
    'label_remember' =&gt; __('Remember Me'),
    'label_log_in' =&gt; __('Log In'),
    'id_username' =&gt; 'user_login',
    'id_password' =&gt; 'user_pass',
    'id_remember' =&gt; 'rememberme',
    'id_submit' =&gt; 'wp-submit',
    'remember' =&gt; true,
    'value_username' =&gt; ,
    'value_remember' =&gt; false
));
</code></pre>
<p>Damit könnte ein Login wie folgt aussehen:</p>
<pre><code class="php">
global $user_login;

if (is_user_logged_in()) {
    echo __( 'Hello', FB_BASIS_TEXTDOMAIN ) . $user_login . '&lt;a href=&quot;' . wp_logout_url() . '&quot; title=&quot;' . __( 'Logout', FB_BASIS_TEXTDOMAIN ) . '&quot;&gt;' . __( 'Logout', FB_BASIS_TEXTDOMAIN ) . '&lt;/a&gt;';
} else {
    wp_login_form();
}
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-login-formular/976/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-login-formular/976/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/loginform.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/loginform.png" medium="image">
			<media:title type="html">WP Loginform</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Attachments, Bilder und Metadaten nutzen</title>
		<link>http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/</link>
		<comments>http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 11:31:51 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=625</guid>
		<description><![CDATA[WordPress erlaubt es recht einfach Bilder zu Beiträgen und Seiten hoch zuladen. Dabei werden diverse Daten gespeichert, die man nutzen kann.
Immer wieder kann man im Netz Tutorials lesen, wie man Bilder zu Beiträgen holt; in der Regel ist das eine Lösung via Benutzerdefinierten Felder, so zum Beispiel auch in einem älteren Beitrag von mir <a href="http://bueltge.de/wordpress-benutzerdefinerte-felder-custom-fields/525/">WordPress benutzerdefinerte Felder (Custom Fields)</a>. Es geht aber auch anders und einfacher, wie ich finde. Die Pflege der benutzerdefinierten Felder ist nicht immer notwendig.
Daher möchte ich ein wenig auf das Thema eingehen und Lösungen aufzeigen, die aus meiner Sicht viel besser sind und vielfältig ausgebaut werden können.]]></description>
			<content:encoded><![CDATA[<p>WordPress erlaubt es recht einfach Bilder zu Beiträgen und Seiten hoch zu laden. Dabei werden diverse Daten gespeichert, die man nutzen kann.<br />
Immer wieder kann man im Netz Tutorials lesen, wie man Bilder zu Beiträgen holt; in der Regel ist das eine Lösung via Benutzerdefinierten Felder, so zum Beispiel auch in einem älteren Beitrag von mir <a href="http://bueltge.de/wordpress-benutzerdefinerte-felder-custom-fields/525/">WordPress benutzerdefinierte Felder (Custom Fields)</a>. Es geht aber auch anders und einfacher, wie ich finde. Die Pflege der benutzerdefinierten Felder ist nicht immer notwendig.<br />
Daher möchte ich ein wenig auf das Thema eingehen und Lösungen aufzeigen, die aus meiner Sicht viel besser sind und vielfältig ausgebaut werden können.<br />
<span id="more-625"></span></p>
<h3>Mit Hilfe der benutzerdefinierten Felder</h3>
<p>Im ersten Fall soll die Lösung mit Hilfe eines benutzerdefinierten Feldes dargestellt werden, dabei müssen die Daten in diesem Feld zu einem Schlüssel gepflegt werden.</p>
<p>In Version 1 wird zum Schlüssel <code>authorlink</code> der Wert des Autors gespeichert, so ist, so hoffe ich, die Nutzung der Felder leicht zu verstehen. Weitere Infos dazu findet man im <a href="http://codex.wordpress.org/Using_Custom_Fields">Codex</a>.</p>
<h4>Version 1</h4>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-cf.png" alt="Custom Fields" /><br />
Die Ausgabe zum Schlüssel wird mir Hilfe des Template Tag <code>get_post_meta()</code> übergeben. Die Funktion erwartet die Id des Beitrags und den Schlüssel als Pflichtwert, alternativ kann übergeben werden, ob ein Wert oder auch Arrays als Rückgabe erlaubt sind. Setze auf <code>true</code> und es kommt nur ein String zurück.</p>
<pre><code>
/**
 * @param int $post_id Post ID.
 * @param string $key The meta key to retrieve.
 * @param bool $single Whether to return a single value.
 * @return mixed Will be an array if $single is false. Will be value of meta data field if $single
 *  is true.
 */
function get_post_meta($post_id, $key, $single = false)
</code></pre>
<pre><code>
&lt;?php $key = 'authorlink'; ?&gt;
&lt;p&gt;Foto von &lt;a href=&quot;&lt;?php echo get_post_meta($post-&gt;ID, $key, true); ?&gt;&quot;&gt;&lt;/a&gt;.&lt;/p&gt;
</code></pre>
<p>Im nächsten Schritt ist das im Grunde nichts anderes, nur dass wir nun als Wert zu einem anderen Schlüssel die Adresse ablegen, wo das Bild liegt. Dazu muss der Autor die Adresse wissen und die URL speichern.<br />
<img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-cf2.png" alt="Custom Fields" /></p>
<p>In Version 2 gehen wir aber einen Schritt weiter und legen eine Funktion in der <code>functions.php</code> ab, die sich später darum kümmert und die wir mit Daten füttern können. Auch dies ist nur ein Beispiel und braucht in der Version den Schlüssel des benutzerdefinierten Feldes, die Breite und Höhe des Bildes. Diese drei Beispielwerte schreiben wir dann in den Tag zur Ausgabe des Bildes.</p>
<h4>Version 2</h4>
<pre><code>
/*Custom Field Images*/
function image_attachment($key, $width, $height) {
	global $post;

	$custom_field = get_post_meta($post-&gt;ID, $key, true);
	if ($custom_field) {
		echo '&lt;img src=&quot;' . $custom_field . '&quot; alt=&quot;Post Image&quot; width=&quot;' . $width . '&quot; height=&quot;' . $height . '&quot; /&gt;';
	} else {
		return;
	}
}
</code></pre>
<p>Die Ausgabe im Template ist durch die obige Funktion dann wie folgt.</p>
<pre><code>
&lt;?php
$image_key = 'image';
$myimage = get_post_meta($post-&gt;ID, $image_key, true);
if ($myimage) { ?&gt;
	&lt;div class="post-image"&gt;
		&lt;?php image_attachment($image_key, 512, 200); ?&gt;
	&lt;/div&gt;
&lt;?php } ?&gt;
</code></pre>
<p>Damit kann man einige schöne Sachen machen und je nach Kenntnis umsetzen. Viele Theme-Autoren möchten aber einfach ein Bild zum Beitrag haben, was direkt an diversen Stellen gezogen wird und eventuell keine Verwendung im Inhalt des Beitrags hat. Oft wird dies über die obige Lösung realisiert. Dies sorgt aber dafür, dass die Autoren der Beiträge die Felder kennen und pflegen müssen, also Schlüssel des Feldes und URL zum Bild.</p>
<p>Nicht sehr komfortabel und daher möchte ich eine Lösung zeigen, wie man an das Bild kommt, welches zum Beitrag hoch geladen wurde, welches man quasi in der Gallery zum Beitrag wieder findet.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-images.png" alt="Gallery-Editor" /></p>
<h3>WordPress eigene Funktionen für Bilder</h3>
<p>Eine der vielen Möglichkeiten ist die Funktion <code>wp_get_attachment_image()</code>, welche aus meiner Sicht die einfachste Lösung darstellt. Dazu ein Beispiel, was es näher erklärt.</p>
<p>Zu erst holen wir einfach mal alle Bilder, nicht alle Attachments zum Beitrag, die man direkt zum Beitrag hoch geladen hat. Diese Bilder lassen wir direkt ausgeben. Die Syntax muss immer im Loop sein.</p>
<pre><code>
&lt;?php
$attachments = get_children( array('post_parent' =&gt; get_the_ID(), 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image($attachment_id);
} ?&gt;
</code></pre>
<p>Zur Erklärung ist zu sagen, dass in dem obigen Beispiel über die Schleife alle Bilder geladen werden und direkt ausgegeben werden. Dabei kümmern wir uns aktuell nicht um die Größe des Bildes, es wird im Standard das Thumbnail ausgegeben. Durch die Festlegung <code>post_mime_type</code> = <code>image</code>, werden auch wirklich nur Bilder geholt und nicht noch andere Anhänge zum Beitrag.<br />
Die Funktion von WordPress, welches uns dann das Bild mit dem HTML ausgibt, benötigt zwingend die ID des Attachment, daher muss im Vorfeld diese ID zum Beitrag geholt werden, erledigen wir mit <code>get_children()</code>.</p>
<p>Einige Worte nun zur Funktion <code>wp_get_attachment_image()</code> von WP zum Ausgaben des Bildes. Wie schon angesprochen, es gibt mehrere Funktionen, alle haben einen ähnlichen Aufbau und geben entweder anderes Markup zurück oder lassen andere Parameter zu. Zur einfache Ausgabe eignet sich diese Funktion am besten. Sie ist auch im <a href="http://codex.wordpress.org/Function_Reference/wp_get_attachment_image">Codex</a> beschrieben.</p>
<p>Die Funktion lässt 3 Parameter zu:</p>
<pre><code>
/**
 * Get an HTML img element representing an image attachment
 *
 * @param int $attachment_id Image attachment ID.
 * @param string $size Optional, default is 'thumbnail'.
 * @param bool $icon Optional, default is false. Whether it is an icon.
 * @return string HTML img element or empty string on failure.
 */
function wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = false)
</code></pre>
<p>Zurück bekommt man das Markup zum img-Tag, wie das folgende Beispiel.</p>
<pre><code>
&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://example.com/wp-content/uploads/2009/08/DSC00261-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Image Example&quot; title=&quot;Example Image&quot; /&gt;
</code></pre>
<p>Der letzte der drei Parameter ist im Zusammenhang mit Bildern eigentlich wenig interessant, da er ein Icon ausgibt. Aber der zweite Parameter ist da schon spannender, denn dieser lässt die Übergabe der Größe des Bildes zu. Dabei kann man entweder einer der vorkonfigurierten Größen mitgeben, quasi die Größen, die WP in den Einstellungen konfigurieren lässt und die beim Upload über die Mediathek angelegt werden. Folgende Möglichkeiten stehen zur Verfügung.</p>
<ul>
<li>Standard-Werte: <code>thumbnail</code>, <code>medium</code>, <code>large</code> oder <code>full</code></li>
<li>Eigene Größen via Array: array( Breite, Höhe ) Bsp.: <code>array(100, 100)</code></li>
</ul>
<p>Wenn man eigene Werte übergibt, dann zieht WordPress in Abhängigkeit dieser Werte das jeweils passende Bild. Also wenn man bspw. 100x100 übergibt und die Thumbnails sind 150px150px, dann werden diese Bilder dafür gezogen und bei einem eigenen Array von 200x200 wird dann das Medium-Bild gezogen, da das Thumbnail zu klein wäre.</p>
<pre><code>
&lt;?php
$attachments = get_children( array('post_parent' =&gt; get_the_ID(), 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id, array(200, 250) );
} ?&gt;
</code></pre>
<h4>Bilder mit Links</h4>
<p>Nun will aber nicht immer nur die Bilder zum Beitrag, sondern eventuell das Bild mit einem Link zum Bild in Originalgröße haben. Auch dazu gibt es eine Funktion <code>wp_get_attachment_link()</code> und man muss das Markup nicht zusammen stellen. Beispielsweise könnte die Nutzung der Funktion analog der obigen Beschreibung aussehen.</p>
<pre><code>
&lt;?php
$attachments = get_children( array('post_parent' =&gt; get_the_ID(), 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_link( $attachment_id, 'medium' );
} ?&gt;
</code></pre>
<p>Das HTML sieht dann wie folgt aus.</p>
<pre><code>
&lt;a href=&quot;http://example.com/wp-content/uploads/2009/08/DSC00261.JPG&quot; title=&quot;Example Image&quot;&gt;&lt;img src=&quot;http://example.com/wp-content/uploads/2009/08/DSC00261-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Image Example&quot; title=&quot;Example Image&quot; height=&quot;150&quot; width=&quot;150&quot;&gt;&lt;/a&gt;
</code></pre>
<p>Damit wird das Bild in der angeforderten Größe ausgegeben und der Link zum Bild in Originalgröße gesetzt.</p>
<h3>Größe der Bilder bestimmen</h3>
<p>mitunter will man im Vorfeld wissen, wie groß das Bild ist, abhängig von der Übergabe des Typ der Größe. Dazu gibt es eine Funktion, die die Werte als Array zurück gibt. Auch dazu ein Beispiel mit der Ausgabe.</p>
<pre><code>
&lt;?php
$attachments = get_children( array('post_parent' =&gt; get_the_ID(), 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	$src = wp_get_attachment_image_src( $attachment_id, 'full' );
	var_dump($src);
} ?&gt;
</code></pre>
<p>Diese einfache Schleife zur Ausgabe der Werte gibt ein Array zurück.</p>
<pre><code>
array
  0 => string 'http://example.com/wp-content/uploads/2009/08/DSC00261.JPG' (length=63)
  1 => int 1632
  2 => int 1224
  3 => boolean false
</code></pre>
<p>Die Reihenfolge im Array wird wie folgt zugeordnet.</p>
<ul>
<li>$src[0] => url</li>
<li>$src[1] => width</li>
<li>$src[2] => height</li>
<li>$src[3] => icon</li>
</ul>
<p>Somit kann auf die Größe reagiert werden, je nach Anforderung. Alternativ kann mit der Funktion <code>image_get_intermediate_size($post_id, $size='thumbnail')</code> gearbeitet werden, die noch einige Werte mehr zurück gibt. Ein Ausgabebeispiel bei der Übergabe 'medium' dazu:</p>
<pre><code>
array
  'file' => string 'DSC00261-300x225.jpg' (length=20)
  'width' => string '300' (length=3)
  'height' => string '225' (length=3)
  'path' => string '2009/08/example-300x225.jpg' (length=28)
  'url' => string 'http://example.com/wp-content/uploads/2009/08/DSC00261-300x225.jpg' (length=71)
</code></pre>
<h3>Weitere Funktionen und Möglichkeiten</h3>
<p>In diesem Zusammenhang gibt es noch einige weitere Funktion, die die Arbeit mit Anhängen bzw. Bildern zu Beiträgen ermöglichen. Ich möchte nicht jede einzelne erklären und stelle nachfolgend eine kleine Schleife zum Testen zur Verfügung. Damit sind recht viele Möglichkeiten abgedeckt und erklären sich in einem Test sicher selbst.</p>
<pre><code>
&lt;?php
$attachments = get_children( array('post_parent' =&gt; get_the_ID(), 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo '&lt;p&gt;';
	echo 'wp_get_attachment_image: ' . wp_get_attachment_image( $attachment_id, array(200,250) ) . '&lt;br /&gt;';
	echo 'wp_get_attachment_link: ' . wp_get_attachment_link( $attachment_id ) . '&lt;br /&gt;';
	echo 'wp_get_attachment_url: ' . wp_get_attachment_url( $attachment_id ) . '&lt;br /&gt;';
	echo 'wp_get_attachment_thumb_url: ' . wp_get_attachment_thumb_url( $attachment_id ) . '&lt;br /&gt;';
	echo 'get_attachment_link: ' . get_attachment_link( $attachment_id ) . '&lt;br /&gt;';
	$src = image_get_intermediate_size( $attachment_id, 'medium'	 );
	echo 'image_get_intermediate_size. '; var_dump($src); echo '&lt;br /&gt;';
	$src = wp_get_attachment_image_src( $attachment_id, 'full', true );
	echo 'wp_get_attachment_image_src. '; var_dump($src); echo '&lt;br /&gt;';
	echo 'Title des Attachment: ' . apply_filters( 'the_title', $attachment-&gt;post_title ) . '&lt;br /&gt;';
	echo 'Link zum Beitrag: ' . get_permalink($image-&gt;post_parent) . '&lt;br /&gt;';
	echo '&lt;hr style=&quot;clear:both;&quot; /&gt;&lt;/p&gt;';
} ?&gt;
</code></pre>
<p>Bitte daran denken, die Syntax muss im Loop von WordPress sein.</p>
<h4>Nur ein Bild zum Beitrag</h4>
<p>Nun habe ich schon einige Punkte zum Holen der Bilder erklärt und in der Regel wird man wohl nicht alle Bilder zum Beitrag benötigen, sondern man möchte ein Bild. Dies findet zum Beispiel Anwendung in Magazin-Themes, wo ein kleines Bild Lust auf den Beitrag machen soll. Durch diese Funktionen kann ich damit dem Autor der jeweiligen Beiträge die Kontrolle über dieses Bild in die Hand geben. In der Regel mache ich das so, das explizit das erste Bild aus der Galerie zum Beitrag gezogen wird. Damit kann der Autor in der Galerie das Bild per Drag&#038;Drop an die richtige Stelle bewegen.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-gallery-reihenfolge.png" alt="Drag&#038;Drop in der Galerie" /></p>
<p>Dies ist keine eigene Funktion, dazu muss die Funktion <code>get_children()</code> entsprechend gefüttert werden. Die Ausgabe des Bildes und andere Werte zum Bild ist dann wieder wie oben beschrieben.</p>
<p>Im ersten Wurf holen wir <strong>nur das erste Bild</strong> aus der Galerie.</p>
<pre><code>
&lt;?php
$attachments = get_children( array(
				'post_parent'    =&gt; get_the_ID(),
				'post_type'      =&gt; 'attachment',
				'numberposts'    =&gt; 1, // show all -1
				'post_status'    =&gt; 'inherit',
				'post_mime_type' =&gt; 'image',
				'order'          =&gt; 'ASC',
				'orderby'        =&gt; 'menu_order ASC'
				) );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id );
} ?&gt;
</code></pre>
<p>Nun kann der Autor des Beitrages immer das erste Bild festlegen, was er nutzen möchte.</p>
<p>Alternativ drehen wir den Spieß um und holen das <strong>letzte Bild aus der Galerie</strong>.</p>
<pre><code>
&lt;?php
$attachments = get_children( array(
				'post_parent'    =&gt; get_the_ID(),
				'post_type'      =&gt; 'attachment',
				'numberposts'    =&gt; 1, // show all -1
				'post_status'    =&gt; 'inherit',
				'post_mime_type' =&gt; 'image',
				'order'          =&gt; 'DESC',
				'orderby'        =&gt; 'menu_order ASC'
				) );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id );
} ?&gt;
</code></pre>
<p>Mit Hilfe von numberposts legen wir fest, wie viele Bilder geholt werden sollen. So holen wir im folgenden Beispiel die <strong>ersten 2 Bilder</strong> und im Anschluss die letzten 2 Bilder.</p>
<pre><code>
&lt;?php
$attachments = get_children( array(
				'post_parent'    =&gt; get_the_ID(),
				'post_type'      =&gt; 'attachment',
				'numberposts'    =&gt; 2, // show all -1
				'post_status'    =&gt; 'inherit',
				'post_mime_type' =&gt; 'image',
				'order'          =&gt; 'ASC',
				'orderby'        =&gt; 'menu_order ASC'
				) );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id );
} ?&gt;
</code></pre>
<p>Nun also die <strong>letzten beiden Bilder</strong>, beginnend mit dem letzten Bild.</p>
<pre><code>
&lt;?php
$attachments = get_children( array(
				'post_parent'    =&gt; get_the_ID(),
				'post_type'      =&gt; 'attachment',
				'numberposts'    =&gt; 2, // show all -1
				'post_status'    =&gt; 'inherit',
				'post_mime_type' =&gt; 'image',
				'order'          =&gt; 'DESC',
				'orderby'        =&gt; 'menu_order ASC'
				) );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id );
} ?&gt;
</code></pre>
<h3>Meta-Daten zu Bildern</h3>
<p>Nun werden durch WordPress zu den Bildern diverse Meta-Daten gespeichert. Ab und an sind diese sehr nützlich und warum nicht einfach darauf zugreifen und nutzen.</p>
<p>Auch dazu erstmal ein Beispiel um an die Daten zu kommen. Dies machen wir mit der Funktion <code>wp_get_attachment_metadata()</code>. Diese Funktion gibt recht viele Daten zurück und so kann man mit dieser auf die Größe der Bilder, auf deren Pfad und ebenso die Meta-Daten zugreifen.</p>
<pre><code>
&lt;?php
$attachments = get_children( array(
				'post_parent'    =&gt; get_the_ID(),
				'post_type'      =&gt; 'attachment',
				'numberposts'    =&gt; 1, // show all -1
				'post_status'    =&gt; 'inherit',
				'post_mime_type' =&gt; 'image',
				'order'          =&gt; 'ASC',
				'orderby'        =&gt; 'menu_order ASC'
				) );
foreach ( $attachments as $attachment_id =&gt; $attachment ) {
	echo wp_get_attachment_image( $attachment_id );
	$imagemeta = wp_get_attachment_metadata( $attachment_id );
	var_dump($imagemeta); // list values in array
	
	$aperture          = $imagemeta['image_meta']['aperture'];
	$credit            = $imagemeta['image_meta']['credit'];
	$camera            = $imagemeta['image_meta']['camera'];
	$caption           = $imagemeta['image_meta']['caption'];
	$created_timestamp = $imagemeta['image_meta']['created_timestamp'];
	$copyright         = $imagemeta['image_meta']['copyright'];
	$focal_length      = $imagemeta['image_meta']['focal_length'];
	$iso               = $imagemeta['image_meta']['iso'];
	$shutter_speed     = $imagemeta['image_meta']['shutter_speed'];
	$title             = $imagemeta['image_meta']['title'];
} ?&gt;
</code></pre>
<p>Im obige Code ist zur Ausgabe aller Wert ein <code>var_dump()</code> drin. Damit erkennt man recht schnell, welche Inahtle im Array existieren und an welcher Stelle man zugreifen kann.<br />
Alle Werte der Meta-Daten habe ich beispielhaft in jeweils eine Variable geschrieben, so dass auch nicht so versierte Nutzer damit zurecht kommen sollten.</p>
<p>Bei einem einfachen Bild, was via Handy-Kamera entstanden ist würde beispielsweise das Array wie folgt aussehen.</p>
<pre><code>
array
  'width' =&gt; string '1632' (length=4)
  'height' =&gt; string '1224' (length=4)
  'hwstring_small' =&gt; string 'height='96' width='128'' (length=23)
  'file' =&gt; string '2009/08/DSC00261.JPG' (length=20)
  'sizes' =&gt; 
    array
      'thumbnail' =&gt; 
        array
          'file' =&gt; string 'DSC00261-150x150.jpg' (length=20)
          'width' =&gt; string '150' (length=3)
          'height' =&gt; string '150' (length=3)
      'medium' =&gt; 
        array
          'file' =&gt; string 'DSC00261-300x225.jpg' (length=20)
          'width' =&gt; string '300' (length=3)
          'height' =&gt; string '225' (length=3)
      'large' =&gt; 
        array
          'file' =&gt; string 'DSC00261-1024x768.jpg' (length=21)
          'width' =&gt; string '1024' (length=4)
          'height' =&gt; string '768' (length=3)
  'image_meta' =&gt; 
    array
      'aperture' =&gt; string '2.8' (length=3)
      'credit' =&gt; string '' (length=0)
      'camera' =&gt; string 'W800i' (length=5)
      'caption' =&gt; string '' (length=0)
      'created_timestamp' =&gt; string '1184253323' (length=10)
      'copyright' =&gt; string '' (length=0)
      'focal_length' =&gt; string '0' (length=1)
      'iso' =&gt; string '100' (length=3)
      'shutter_speed' =&gt; string '0.0166666666667' (length=15)
      'title' =&gt; string '' (length=0)
</code></pre>
<h3>Alternative ab WordPress 2.9</h3>
<p>Mit WordPress Version 2.9 gibt es einen Template Tag genau für diese Anforderung, damit wird es einfacher und verständlicher. Man nutze einfach die Funktion <code>the_post_thumbnail()</code> und kann die Größe mitgeben. Standard ist <code>thumbnail</code>, möglich ist <code>thumbnail</code>, <code>medium</code>, <code>large</code> oder <code>full</code>.</p>
<pre><code>
the_post_thumbnail(); // without parameter -> Thumbnail
the_post_thumbnail('post-thumbnail'); // Thumbnail
the_post_thumbnail('post-medium'); // Medium resolution - use full
</code></pre>
<p>Als kleine Alternative steht noch <code>get_the_post_image()</code> zur Verfügung, wobei die Funktion kein echo hat und optional die ID des Post bekommen kann.<br />
<code>get_the_post_thumbnail( $post_id = NULL, $size = 'post-thumbnail', $attr = '' )</code></p>
<h3>Fazit</h3>
<p>WordPress bietet sehr viele unterschiedliche Funktionen um auf Anhänge, ob Bilder oder andere Art ist egal, zuzugreifen. Ebenso wird ein Teil an Meta-Daten gespeichert, die man nutzen kann. Viele Ansätze findet man im Code, vorrangig in der <code>wp-includes/media.php</code>. Vielleicht konnte ich einige Lösungen aufzeigen, leicht ist es nicht. Aber es stellt aus meiner Sicht eine bessere Alternative dar als die Nutzung der Benutzerdefinierten Felder oder gar dem Scannen des Content.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/wp-cf.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-cf.png" medium="image">
			<media:title type="html">Custom Fields</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-cf2.png" medium="image">
			<media:title type="html">Custom Fields</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-images.png" medium="image">
			<media:title type="html">Gallery-Editor</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-gallery-reihenfolge.png" medium="image">
			<media:title type="html">Drag&#038;Drop in der Galerie</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Duplikate im Loop von WordPress filtern</title>
		<link>http://bueltge.de/duplikate-im-loop-von-wordpress-filtern/882/</link>
		<comments>http://bueltge.de/duplikate-im-loop-von-wordpress-filtern/882/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 09:48:15 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Queries]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=882</guid>
		<description><![CDATA[Die Loop in den Templates des Theme in WordPress ist das Herz einer jeden Ausgabe. Mit zunehmenden Anforderungen wird die Aufgabe an den Entwickler aufwendiger und das Default-Theme von WordPress hilft nicht weiter als Vorlage.
Nicht selten muss daher mit klassichen PHP-Möglichkeiten im Template die Umsetzung realisiert werden, denn es gibt dafür keine eigene Funktion oder Template Tag, wie einige Nutzer meinen. Da die Frage recht oft auftaucht und man in dem Fall eine Lösung aufzeigen kann, möchte ich mal darstellen, wie ich dafür sorge, dass Inhalte, die in einem Loop ausgegeben wurden, nicht in einem weiteren Loop nochmal dargestellt werden.]]></description>
			<content:encoded><![CDATA[<p>Die Loop in den Templates des Theme in WordPress ist das Herz einer jeden Ausgabe. Mit zunehmenden Anforderungen wird die Aufgabe an den Entwickler aufwendiger und das Default-Theme von WordPress hilft nicht weiter als Vorlage.<br />
Nicht selten muss daher mit klassichen PHP-Möglichkeiten im Template die Umsetzung realisiert werden, denn es gibt dafür keine eigene Funktion oder Template Tag, wie einige Nutzer meinen. Da die Frage recht oft auftaucht und man in dem Fall eine Lösung aufzeigen kann, möchte ich mal darstellen, wie ich dafür sorge, dass Inhalte, die in einem Loop ausgegeben wurden, nicht in einem weiteren Loop nochmal dargestellt werden.<br />
<span id="more-882"></span><br />
WordPress identifiziert Beiträge und Seiten eindeutig via ID, die in der Datenbank angelegt sind und die auch bei der Ausgabe in der Loop eine entscheidende Rolle spielen. Alle Zuordnungen oder Verknüpfungen basieren auf der ID. Daher speichere ich im ersten Loop (<em>Loop Nr.1</em>) die IDs, die ausgeben werden, in einem Array. Diese Variable wurde im Vorfeld als Array bestimmt <code>$do_not_duplicate = array();</code>.</p>
<h4>Loop Nr.1</h4>
<pre><code>
&lt;?php
$do_not_duplicate = array(); // vor den Loops Variable als Array setzen  

// 1. Loop
query_posts('ca=1,2,3&amp;showposts=5');
while ( have_posts() ) : the_post();
    $do_not_duplicate[] = $post-&gt;ID; // IDs im Loop merken 
    // Post ausgeben ...
    the_title();
endwhile;
?&gt;
</code></pre>
<p>Nach dem nun durch die obige Loop 5 Artikel ausgegeben wurden, haben wir im Array 5 IDs, mit denen wir nun arbeiten können. Im Übrigen kann man sich das Array mit der PHP-Funktion <code><a href="http://de2.php.net/manual/de/function.var-dump.php">var_dump()</a></code> anschauen.</p>
<p>In der kommenden Loop Nr.2 sollen nun 15 Beiträge ausgegeben werden, wobei die schon aus Loop Nr. 1 bekannten IDs nicht nochmal erscheinen sollen. Dies könnte sein, wenn Beiträge mehreren Kategorien zugeordnet sind, da beide Loops unterschiedliche Kategorien ausgeben.  Ich prüfe nun mit der Funktion <code><a href="http://de2.php.net/manual/de/function.in-array.php">in_array()</a></code>, ob die aktuelle ID <code>$post-&gt;ID</code> im Array <code>$do_not_duplicate</code> vorhanden ist. Nur wenn die ID nicht ( <code>!in_array()</code> ) im Array vorhanden, dann wird im Loop Nr. 2 Inhalt ausgegeben.</p>
<h4>Loop Nr.2</h4>
<pre><code>
&lt;?php
// 2. Loop
query_posts( 'cat=4,5,6&amp;showposts=15' );
while (have_posts()) : the_post();
    if ( !in_array( $post-&gt;ID, $do_not_duplicate ) ) { // IDs prüfen
        // Post ausgeben ...
        the_title();
    }
endwhile;
?&gt;
</code></pre>
<p>Wie so oft, gibt es eine Alternative und dazu stellt WordPress einen Parameter im Query bereit - <code>post__not_in</code>, siehe <a href="http://codex.wordpress.org/Template_Tags/query_posts#Post_.26_Page_Parameters">Codex</a>. Auch diesem Parameter übergebe ich alternativ den Array und in diesem Query sind dann die IDs nicht enthalten. Je nach dem, welchen Weg man geht, stehen damit zwei unterschiedliche Syntax bereit, um doppelten Content zu vermeiden.</p>
<pre><code>
&lt;?php
// weiterer Loop ohne Duplikat
query_posts( array(
    'cat' =&gt; 456,
    'post__not_in' =&gt; $do_not_duplicate 
    )
);
while ( have_posts() ) : the_post();
    // Post ausgeben ...
        the_title();
endwhile;
?&gt;
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/duplikate-im-loop-von-wordpress-filtern/882/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/duplikate-im-loop-von-wordpress-filtern/882/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Suchformular</title>
		<link>http://bueltge.de/wordpress-suchformular/1002/</link>
		<comments>http://bueltge.de/wordpress-suchformular/1002/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 20:44:28 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1002</guid>
		<description><![CDATA[Die Integration der Suche in ein Theme für WordPress kann diverse Wege gehen, meist wird dazu ein Template gebaut, welches inkludiert wird. Dies ist nicht in jedem Fall notwendig und kann mit Hilfe eines WordPress Template Tag ebenso realisiert werden. Ob man sich dafür entscheidet und wie man darauf eingreifen kann, dies erklärt hoffentlich mein kleiner Beitrag.]]></description>
			<content:encoded><![CDATA[<p>Die Integration der Suche in ein Theme für WordPress kann diverse Wege gehen, meist wird dazu ein Template gebaut, welches inkludiert wird. Dies ist nicht in jedem Fall notwendig und kann mit Hilfe eines WordPress Template Tag ebenso realisiert werden. Ob man sich dafür entscheidet und wie man darauf eingreifen kann, dies erklärt hoffentlich mein kleiner Beitrag.<br />
<span id="more-1002"></span></p>
<p>WordPress stellt eine Funktion bereit, die es einfach erlaubt, das Suchformular zu nutzen: <code>get_search_form()</code>.  Ist genauso zu verstehen wie beispielsweise die Template Tags <code>get_sidebar()</code> oder <code>get_header()</code>, die die meisten Themes nutzen. Verfügbar ist die Funktion seit WordPress Version 2.7 und ist zu finden in <code>wp-includes/general-template.php</code>.</p>
<h4>HTML-Resultat</h4>
<p>Die Ausgabe ohne Veränderung der Funktion sieht dann im HTML wie folgt aus.</p>
<pre><code>
&lt;form role=&quot;search&quot; method=&quot;get&quot; id=&quot;searchform&quot; action=&quot;http://example.com/&quot;&gt;
	&lt;div&gt;
		&lt;label class=&quot;screen-reader-text&quot; for=&quot;s&quot;&gt;' . __('Search for:') . '&lt;/label&gt;
		&lt;input type=&quot;text&quot; value=&quot;&quot; name=&quot;s&quot; id=&quot;s&quot; /&gt;
		&lt;input type=&quot;submit&quot; id=&quot;searchsubmit&quot; value=&quot;Suche&quot; /&gt;
	&lt;/div&gt;
&lt;/form&gt;
</code></pre>
<h4>Inhalt im Inputfeld</h4>
<p><img class="alignright" src="http://bueltge.de/wp-content/images/wp/suchfeld.png" alt="Suchfeld Beispiel" /><br />
Nun bietet die Funktion einen Hook an, um auf das Suchfeld Einfluss zu nehmen. In diesem Beispiel soll der Text im Suchfeld beeinflusst werden, so dass der User eine Info dort vorfindet.<br />
Dies wird über Filter Hook <code>the_search_query</code> realisiert. Innerhalb der Funktion, die an diesen Hook übergeben wird, wird zusätzlich noch geprüft, ob schon ein Wert im Feld steht und wenn dies nicht der Standard-Wert ist, sondern zum Beispiel der zurückgegeben Wert aus der Suche, dann wird nicht der Wert im Suchfeld gesetzt, sondern unverändert gelassen.<br />
Diese Funktion gehört klassisch in die <code>functions.php</code> des Themes und kann natürlich an die eigenen Bedürfnisse angepasst werden.</p>
<pre><code>
function fb_get_search_query() {
	$return = stripslashes( get_query_var( 's' ) );
	if ( $return == '' )
		$return = __( 'Hier Suchbegriff eingeben...', FB_BASIS_TEXTDOMAIN );
	else
		$return = apply_filters( 'get_search_query', $return );
	
	return $return;
}
add_filter( 'the_search_query', 'fb_get_search_query' );
</code></pre>
<h4>Suchfeld und eigene Bedürfnisse</h4>
<p>Nun ist das Suchformular aber eventuell nicht immer, wie man sich das wünscht und daher bietet es sich an, ein eigenes Suchfeld zu erstellen und zu nutzen. Um dabei aber die Möglichkeiten von WordPress weiterhin anzubieten, ist es sinnvoll, auch diese Möglichkeit als Funktion oder auch Template mit dem Namen <code>searchform.php</code>, siehe <a href="#searchform">nähere Infos</a> weiter unten, im Theme einzubinden und die Hooks mit vorzusehen. So können eventuell genutzte Plugins darauf zugreifen. Auch dazu ein kleines Beispiel, bei dem als Veränderung eine kleine JavaScript-Funktion eingebunden werden soll.</p>
<p>Als erstes die Funktion für die <code>functions.php</code> des Themes.</p>
<pre><code>
function fb_get_search_form() {
	do_action( 'get_search_form' );

	$form = '&lt;form method=&quot;get&quot; id=&quot;searchform&quot; action=&quot;' . get_option('home') . '/&quot; &gt;
	&lt;div&gt;&lt;label class=&quot;screen-reader-text&quot; for=&quot;s&quot;&gt;' . __('Search for:') . '&lt;/label&gt;
	&lt;input type=&quot;text&quot; value=&quot;' . esc_attr(apply_filters('the_search_query', get_search_query())) . '&quot; name=&quot;s&quot; id=&quot;s&quot; onfocus=&quot;clearSearch();&quot; /&gt;
	&lt;input type=&quot;submit&quot; id=&quot;searchsubmit&quot; value=&quot;'. esc_attr__('Search') .'&quot; /&gt;
	&lt;/div&gt;
	&lt;/form&gt;';

	echo apply_filters('get_search_form', $form);
}
</code></pre>
<p>Die Funktion ernthält den schon oben angesprochenen Hook <code>the_search_query</code> und außerdem die Erweiterung des JavaScript <code>onfocus="clearSearch();"</code>. Dies kleine Funktion sorgt nur dafür, dass der Inhalt des Suchfeldes gelöscht wird, wenn man in die Box klickt. Wobei ich den Inhalt prüfe und nur dann lösche, wenn der Inhalt explizit dem vorgegebenen Syntax <em>Hier Suchbegriff eingeben...</em> entspricht.</p>
<pre><code>
function clearSearch() {
	queryBox = document.getElementById('s');

	if ( queryBox.value == 'Hier Suchbegriff eingeben...' ) {
		queryBox.value = '';
	}
	queryBox.style.color = '#292929';
}
</code></pre>
<p>Das kleine Script ist in einer Datei abgelegt und wird ebenfalls aus der <code>functions.php</code> des Themes geladen. Dazu dient der folgende  Aufruf; nähere Infos zur Funktion <code>wp_enqueue_script</code> finet ihr beispielsweise im Artikel <a href="http://bueltge.de/javascript-bibliotheken-in-und-aus-wordpress-nutzen/808/">JavaScript-Bibliotheken in und aus WordPress nutzen</a>.<br />
<code>wp_enqueue_script( 'fb_scripts', get_bloginfo('template_directory') . '/js/script.js', '', '', true );<br />
</code></p>
<p>Alternativ eine Lösung mit Hilfe von jQuery</p>
<pre><code class="php">
$(document).ready(function() {  
$("input#s").val("Enter your search text here");  
   textFill($('input.text1'));  
});  
    function textFill(input){ //input focus text function  
    var originalvalue = input.val();  
    input.focus( function(){  
        if( $.trim(input.val()) == originalvalue ){ input.val(''); }  
    });  
    input.blur( function(){  
        if( $.trim(input.val()) == '' ){ input.val(originalvalue); }  
    });  
} 
</code></pre>
<h4 id="searchform">Das Template searchform.php</h4>
<p>Natürlich besteht auch weiterhin die Möglichkeit extra ein Template für das Suchformular anzulegen. Dabei sucht WordPress nach dem Template <code>searchform.php</code> im Theme. Dabei sucht WordPress im ersten Schritt nach diesem Template, wird dies nicht gefunden, dann wird seit Version 2.7 von WordPress das Formular aus dem Template Tag <code>get_search_form()</code> genutzt.</p>
<p>Welchen Weg man geht, das ist sicher von der Arbeitsweise und Gewohnheit abhängig, aber damit ist ein Standard vorhanden, der einfach als Template Tag zur Verfügung steht und es kann bei nicht sonderlich ausgefallenen Anwendungen ein Template gespart werden.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-suchformular/1002/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-suchformular/1002/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/suchfeld.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/suchfeld.png" medium="image">
			<media:title type="html">Suchfeld Beispiel</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Ähnliche Seiten auf Basis der Kategorie in WordPress</title>
		<link>http://bueltge.de/aehnliche-seiten-auf-basis-der-kategorie-in-wordpress/967/</link>
		<comments>http://bueltge.de/aehnliche-seiten-auf-basis-der-kategorie-in-wordpress/967/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 12:23:10 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=967</guid>
		<description><![CDATA[Viele Einsätze von WordPress sind mit dem Ziel eines CMS umgesetzt und die Nutzung der Seiten steht im Vordergrund. Nicht selten möchte man dem Leser Seiten oder Beiträge anbieten, die aus der gleichen Kategorie kommen und den Leser auf der Site halten. Warum nicht, dazu reicht eine kleine Funktion, die auf Basis der Kategorie-ID ähnliche Beiträge listet.]]></description>
			<content:encoded><![CDATA[<p>Den Leser auf der Site halten ist nicht immer einfach. Es gilt Information zu bieten und es fällt schwer, gerade in Blogs, die alten Beiträge wieder dem Leser zugänglich zu machen. In dem Zusammenhang könnte man dem Leser Beiträge anbieten, die aus der gleichen Kategorie kommen und den Leser auf der Site halten. Warum nicht, dazu reicht eine kleine Funktion, die auf Basis der Kategorie-ID ähnliche Beiträge listet.<br />
<span id="more-967"></span></p>
<p>Die folgende kleine Funktion, abgelegt als Plugin oder in der <code>functions.php</code> des Themes, gibt Beiträge in Abhängigkeit der Kategorie aus. Die Funktion lässt drei Parameter zu:</p>
<ul>
<li><code>$limit</code> (int) Anzahl der auszugebenden Beiträge</li>
<li><code>$catName</code> (bool) Kategoriename ausgeben, <code>TRUE</code> oder <code>FALSE</code></li>
<li><code>$title</code> (string) String für einen Text über allen auszugebenden Beiträgen</li>
</ul>
<p>Sie hat keine direkte Ausgabe, so dass man die Inhalte auch übergeben kann. Will man sie im einfachsten Fall in einem Template einsetzen, zum Beispiel im Sidebar, dann die <code>sidebar.php</code>, ist folgende Syntax aufzurufen: <code>echo fb_cat_related_posts();</code>.</p>
<pre><code>
function fb_get_cat_related_posts( $limit = 5, $catName = TRUE, $title = '&lt;h3&gt;Recent Pages&lt;/h3&gt;' ) {
	
	if ( !is_single() ) // nur bei Beiträgen eine Ausgabe, kann angepasst/gelöscht werden
		return;
	
	$limit = (int) $limit;
	$output  = '';
	$output .= $title;
	
	$category = get_the_category();
	$category = (int) $category[0]-&gt;cat_ID;
	
	if ( $catName )
		$output .= __( 'Kategorie: ' ) . get_cat_name($category) . ' ';
	
	$output .= '&lt;ul&gt;';
	
	$args = array(
		'numberposts' =&gt; $limit,
		'category' =&gt; $category,
	); 
	
	$recentposts = get_posts( $args );
	foreach($recentposts as $post) {
		setup_postdata($post);
		$output .= '&lt;li&gt;&lt;a href=&quot;' . get_permalink($post-&gt;ID) . '&quot;&gt;' . get_the_title($post-&gt;ID) . '&lt;/a&gt;&lt;/li&gt;';
	}
	
	$output .= '&lt;/ul&gt;';
	
	return $output;
}
</code></pre>
<p>Die Funktion stellt nur eine Basis dar und kann natürlich beliebig erweitert werden. Ebenso könnte man diverse Abfragen integrieren, so dass wenn es keine Artikel gibt, auch keine Überschrift ausgegeben wird.<br />
Aktuell werden auch die Beiträge der Unterkategorien gelistet.</p>
<p>Viel Spass damit, vielleicht hat der eine oder andere nützliche Erweiterungen und legt die dann hier in den Kommentaren ab.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/aehnliche-seiten-auf-basis-der-kategorie-in-wordpress/967/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/aehnliche-seiten-auf-basis-der-kategorie-in-wordpress/967/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Debug Objects - WordPress Plugin</title>
		<link>http://bueltge.de/debug-objects-wordpress-plugin/966/</link>
		<comments>http://bueltge.de/debug-objects-wordpress-plugin/966/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 10:46:28 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[StyleSheet]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=966</guid>
		<description><![CDATA[Das Plugin <em>Debug objects</em> gibt dem User, der die entsprechenden Rechte mitbringt, im Standard der Administrator, eine große Anzahl von Informationen an die Hand. Es werden Werte und Inhalte ausgelesen und im Frontend des Blog dargestellt um Fehler zu analysieren aber auch um WordPress besser zu verstehen und an die Anforderungen anzupassen. Daher ist es für Entwickler und Leute, die WordPress besser verstehen wollen, geeignet.]]></description>
			<content:encoded><![CDATA[<p>Das Plugin <em>Debug objects</em> gibt dem User, der die entsprechenden Rechte mitbringt, im Standard der Administrator, eine große Anzahl von Informationen an die Hand. Es werden Werte und Inhalte ausgelesen und im Frontend des Blog dargestellt um Fehler zu analysieren aber auch um WordPress besser zu verstehen und an die Anforderungen anzupassen. Daher ist es für Entwickler und Leute, die WordPress besser verstehen wollen, geeignet.<br />
<span id="more-966"></span><br />
Das Plugin gibt in diversen Tabs Informationen zu; im folgenden eine Liste von diversen Möglichkeiten, auch wenn das Plugin wesentlich mehr ausgibt. Je nach Arbeitsweise können diverse Reiter besonders interessant sein oder weg fallen. Aktuell habe ich aber keine Optionen hinterlegt, die das steuern sollen.</p>
<ul>
<li>PHP</li>
<li>Speichernutzung</li>
<li>Betriebssystem</li>
<li>Server</li>
<li>WordPress Version</li>
<li>Sprache</li>
<li>sehr umfangreiche Definitionen von diversen Konstanten</li>
<li>Cookie Definitionen</li>
<li>Dateirechte</li>
<li>Eigene User- und Usermeta-Tabellen</li>
<li>FTP- und SSH Definitionen</li>
<li>Query informationen</li>
<li>Conditional Tags; wert des Tags</li>
<li>Theme informationen</li>
<li>Template informationen</li>
<li>Cache inhalte</li>
<li>Hooks und Filter</li>
<li>Funktionen, die auf Hooks und Filter ansprechen</li>
<li>inhalte von Arrays zu Hooks und Filtern</li>
<li>alle definierten Konstanten</li>
</ul>
<p>Das Plugin kann mit meinem Plugin <a href="http://bueltge.de/wordpress-performance-analysieren-plugin/558/">Debug Queries</a> zusammen arbeiten und damit die Analyse und Optimierung des Blog genutzt werden. <a href="http://bueltge.de/wordpress-performance-analysieren-plugin/558/">Debug Queries</a> wird in die Ausleitung integriert und ist auch nur für User mit den entsprechenden Rechten möglich. Damit kann die Analyse und Optimierung der Performance an WordPress verbessert werden.</p>
<p>Das Plugin filtert keinerlei Werte und sollte nur zur Information und Optimierung eingesetzt werden, es ist nicht im Livebetrieb des Blog empfohlen. Für Entwickler kann es schnell Daten liefern, die die Einsatz in einer Entwicklungsumgebung befürworten.</p>
<h3>Beispielscreenshot des ersten Tab</h3>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/debug_objects.png" alt="Screenshot Debug Objects Tab 1" /></p>
<h3>Download:</h3>
<form class="spenden" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="amount" id="eins" value="" /><br />
<input type="hidden" name="cmd" value="_xclick" /><br />
<input type="hidden" name="business" value="frank@bueltge.de" /><br />
<input type="hidden" name="item_name" value="Spende bueltge.de Debug Objects" /><br />
<input type="hidden" name="no_shipping" value="1" /><br />
<input type="hidden" name="return" value="http://bueltge.de/" /><br />
<input type="hidden" name="cancel_return" value="http://bueltge.de/" /><input type="hidden" name="currency_code" value="EUR" /><br />
<input type="hidden" name="tax" value="0" /><br />
<input type="hidden" name="bn" value="PP-DonationsBF" /><br />
<input type="image" src="http://bueltge.de/wp-content/images/donate.png" style="border:0" name="submit" alt="Zahlen Sie mit PayPal - schnell, kostenlos und sicher!" /></form>
<p><strong>Ist die Arbeit nicht 1 Euro wert?</strong><br />
Jede Spende wird dankbar angenommen und ermöglicht das weitere Arbeiten an freier Software.<br />
Möchtest du mehr oder anders spenden, so besuche meine <a href="http://bueltge.de/wunschliste/">Wunschliste</a>.</p>
<p>Der Download ist im offiziellen Repository von WP zu finden: <a href="http://wordpress.org/extend/plugins/debug-objects/">wordpress.org/extend/plugins/debug-objects/</a> oder nutzt den Installer direkt im Administrationsbereich von WordPress</p>
<h3>Historie</h3>
<p>Seit geraumer Zeit bietet das WordPress Plugin Repository die Möglichkeit der Ausgabe des Changelog an und so werde ich direkt am Plugin, in der Readme die Historie pflegen - daher bitte ich, dass ihr euch <a href="http://wordpress.org/extend/plugins/debug-objects/changelog/">dort die Änderungen anschaut</a>, so dass ich ein wenig hier pflegen muss: <a href="http://wordpress.org/extend/plugins/debug-objects/changelog/">Changelog</a>.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/debug-objects-wordpress-plugin/966/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/debug-objects-wordpress-plugin/966/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/debug_objects.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/debug_objects.png" medium="image">
			<media:title type="html">Screenshot Debug Objects Tab 1</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Hooks definieren und nutzen</title>
		<link>http://bueltge.de/wordpress-hooks-definieren-und-nutzen/909/</link>
		<comments>http://bueltge.de/wordpress-hooks-definieren-und-nutzen/909/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 23:49:01 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=909</guid>
		<description><![CDATA[WordPress basiert auf dem sogenannten Hook-System. Dieses dient WordPress und allen Erweiterungen um Funktionen an bestimmter Stelle einzubringen. Hintergründe und Verständnis habe ich versucht in unzähligen Blogartikeln zu verbreiten und aktuell im <a href="http://t3n.yeebase.com/magazin/vorschau-t3n-nr-16/">t3n-Magazin</a>. Die Hooks sind aber nicht nur zum einhaken, sondern können ebenso in eigene Erweiterungen genutzt werden und so mehr Übersicht schaffen und zusätzliche Schnittstellen für weitere Entwicklungen bieten. Gerade die zweite Möglichkeit ist interessant, wenn man ein Theme erstellt, welches diverse Schnittstellen bieten soll oder ein Plugin kreiert, was durch andere Autoren erweitert werden kann oder als Framework dienen soll.]]></description>
			<content:encoded><![CDATA[<p>WordPress basiert auf dem sogenannten Hook-System. Dieses dient WordPress und allen Erweiterungen um Funktionen an bestimmter Stelle einzubringen. Hintergründe und Verständnis habe ich versucht in unzähligen Blogartikeln zu verbreiten und aktuell im <a href="http://t3n.yeebase.com/magazin/vorschau-t3n-nr-16/">t3n-Magazin</a>. Die Hooks sind aber nicht nur zum einhaken, sondern können ebenso in eigene Erweiterungen genutzt werden und so mehr Übersicht schaffen und zusätzliche Schnittstellen für weitere Entwicklungen bieten. Gerade die zweite Möglichkeit ist interessant, wenn man ein Theme erstellt, welches diverse Schnittstellen bieten soll oder ein Plugin kreiert, was durch andere Autoren erweitert werden kann oder als Framework dienen soll.<br />
<span id="more-909"></span></p>
<p>Um die <a href="http://bueltge.de/wp-hinweise-fuer-das-schreiben-eines-wordpress-plugins/150/">Möglichkeit der Hooks</a> zu nutzen, kann man die gleiche Funktion wie WordPress (<code><a href="http://codex.wordpress.org/Function_Reference/do_action">do_action()</a></code>) einsetzen und muss sich nicht eigene Funktionen oder Methoden erstellen.</p>
<p>In der folgenden Beispiel-Funktion, welche ich beim Theme in der <code>functions.php</code> ablege, meines Footer <code>my_footer()</code> wird ein Hook definiert mit Hilfe der Funktion <code>do_action()</code>. Dieser kann nun genutzt werden und das einhaken ist von Außen möglich. </p>
<pre><code>
function my_footer() {
    do_action('my_footer');
}
</code></pre>
<p>Die eigentliche Funktion rufen ich im Template des Theme auf, in diesem Fall natürlich in der <code>footer.php</code> des Themes, im Beispiel direkt vor dem schließenden body-Tag.</p>
<pre><code>
&lt;?php my_footer(); ?&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Nun möchte ich bei einem Plugin oder einer beliebigen Funktion im Theme auf diesen Bereich zugreifen und hake mich dort ein. Dazu schreibe ich meine eigene Funktion, zum Beispiel eine Funktion um die ganzen Code-Schnipsel für die Statistik-Tools zu hinterlegen und lege diese Schnipsel in dieser einen Funktion ab. Diese neue Funktion nenne ich <code>example_function()</code>. Um nun diese Funktion an der betreffenden Stelle meines Hooks einzuhaken, muss ich lediglich die klassische Hook-Funktionalität von WordPress nutzen. Mit Hilfe von <code><a href="http://codex.wordpress.org/Function_Reference/add_action">add_action()</a></code> wähle ich also den Hook, der es sein soll und übergebe die Funktion, die ich erstellt habe. Im Anschluss gebe ich noch einen dritten Parameter mit, der mir die Priorität des Einhaken gewährleistet, was nicht zwingend ist. Der Standard-Wert für die Priorität ist 10 und hat hier weiter keinen Einfluss, da ich bisher nur diese eine Funktion via Hook anspreche.</p>
<pre><code>
add_action('my_footer', 'example_function', 1);
</code></pre>
<p>Um das Verständnis der Priorität besser zu verstehen, erstellen wir eine weitere Funktion, die mir weiteren Inhalt an die Stelle meines Hook bringt und haken diesen Funktion <code>example_function_2()</code> ebenso ein, aber mit einer niedrigeren Priorität als die erste Funktion und damit wird sie nach der Funktion <code>example_function()</code> gehakt.</p>
<pre><code>
add_action('my_footer', 'example_function_2', 2);
</code></pre>
<p>Nicht selten können mit Hilfe dieser Möglichkeit sehr saubere Lösungen geschaffen werden und so ist es vielleicht für den einen oder anderen Leser nützlich. Gerade viele kleine Code-Schnipsel, die man im Footer ablegt, können so sauber in eine Funktion ausgelagert werden und je nach Bedarf einfacher deaktiviert werden. gesteuert wird damit alles über Hooks und in der <code>functions.php</code> oder gar einer Options-Seite zum Theme im Backend.<br />
Diese Möglichkeit steht im übrigen in allen WordPress Versionen zur Verfügung, einschließlich der kommenden Version 2.8.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-hooks-definieren-und-nutzen/909/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-hooks-definieren-und-nutzen/909/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WP Basis Theme</title>
		<link>http://bueltge.de/wp-basis-theme/953/</link>
		<comments>http://bueltge.de/wp-basis-theme/953/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 09:53:31 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[CSS, xHTML, JS]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Webdeveloper]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=953</guid>
		<description><![CDATA[Fast seit dem ich mit WordPress beschäftige, irgendwann mit Version 0.71 war das, habe ich mir eine Theme-Layout geschaffen, was ich immer zum Neustart eines neuen Theme heran ziehe - <a href="http://wpbasis.de/">WP Basis</a>.
Fast genauso lange veröffentliche ich dieses Theme unter GPL und es wird wohl recht vielfach genutzt. Die Entwicklung am Theme habe ich weiter getrieben und das Theme ist mit jeder Version von WordPress gewachsen und passt sich den jeweiligen Änderungen an. Um diese Veränderungen besser Händeln zu können, habe ich das Theme seit geraumer Zeit im <a href="http://code.google.com/p/wp-basis-theme/">SVN von Google Code</a> abgelegt und konnte dadurch auch auf die Mitarbeit von <a href="http://andreas-isaak.de/">Andreas</a> und <a href="http://ocean90.de/">Dominik</a> zählen - vielen Dank an dieser Stelle nochmal!

Immer wieder kamen Fragen rein, ob das <a href="http://bueltge.de/basis-theme-fuer-wordpress/411/">alte Theme</a> aktualisiert wird und wann - daher hier nun die Info, ich habe einen Stand erreicht, der stabil ist und das Theme ist mit der aktuellen Version 2.7 und der kommenden Version 2.8 von WordPress kompatibel. Daher hier nun offiziell die <a href="http://wpbasis.de/">Freigabe zum Download und Nutzen</a>.]]></description>
			<content:encoded><![CDATA[<p><img class="alignrightob" src="http://wpbasis.de/images/wpbasis_logo.png" alt="WP Basis Theme Logo" /><br />
Fast seit dem ich mit WordPress beschäftige, irgendwann mit Version 0.71 war das, habe ich mir eine Theme-Layout geschaffen, was ich immer zum Neustart eines neuen Theme heran ziehe - <a href="http://wpbasis.de/">WP Basis</a>.<br />
Fast genauso lange veröffentliche ich dieses Theme unter GPL und es wird wohl recht vielfach genutzt. Die Entwicklung am Theme habe ich weiter getrieben und das Theme ist mit jeder Version von WordPress gewachsen und passt sich den jeweiligen Änderungen an. Um diese Veränderungen besser Händeln zu können, habe ich das Theme seit geraumer Zeit im <a href="http://code.google.com/p/wp-basis-theme/">SVN von Google Code</a> abgelegt und konnte dadurch auch auf die Mitarbeit von <a href="http://andreas-isaak.de/">Andreas</a> und <a href="http://ocean90.de/">Dominik</a> zählen - vielen Dank an dieser Stelle nochmal!</p>
<p>Immer wieder kamen Fragen rein, ob das <a href="http://bueltge.de/basis-theme-fuer-wordpress/411/">alte Theme</a> aktualisiert wird und wann - daher hier nun die Info, ich habe einen Stand erreicht, der stabil ist und das Theme ist mit der aktuellen Version 2.7 und der kommenden Version 2.8 von WordPress kompatibel. Ebenso ist es abwärtskompatibel, getestet bis Version 1.5 von WordPress. Daher hier nun offiziell die <a href="http://wpbasis.de/">Freigabe zum Download und Nutzen</a>.</p>
<ul>
<li><a href="http://wpbasis.de/">Projektsite</a></li>
<li><a href="http://code.google.com/p/wp-basis-theme/">SVN Repository mit Diskussionsplattform</a></li>
</ul>
<p><span id="more-953"></span><br />
Ein Hinweis, das Theme ist <strong>kein Framework</strong> es ist ein einfaches Theme, welches lediglich die Grundlagen eines Theme enthält und diverse Vorzüge aus meiner Arbeit mir WordPress vereint. Es dient also wirklich dazu, dass man ein Theme für Kunden oder sich selbst erstellt, angepasst auf die Anforderungen. Es bringt keinerlei überflüssiges Markup mit, was man dann nicht braucht und wie bei Frameworks zum Teil üblich, mitschleift. Es soll auch so bleiben, keine Child-Themes oder ähnliches, auch keine Hooks zum komfortablen erweitern mit Code. Ich mag diese Art der Arbeit, schlank und schnell, direkt auf die Aufgabe zugeschnitten und daher kann ich mich nicht sonderlich mit Frameworks im WordPress-Theme-Sektor anfreunden; heißt aber nicht, dass andere Entwickler das auch tun sollten!</p>
<p>Wenn euch diese Arbeit liegt und ihr ebenfalls das Theme in erster Linie selbst schreibt, dann steht euch damit eine Grundlage bereit. Durch die Verwaltung im SVN steht euch ebenso eine Möglichkeit zur Verfügung <a href="http://code.google.com/p/wp-basis-theme/issues/list">Fehler und Hinweise zu melden</a>, worüber ich mich sehr freuen würde.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wp-basis-theme/953/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wp-basis-theme/953/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
	
		<media:thumbnail url="http://wpbasis.de/images/wpbasis_logo.png" />
		<media:content url="http://wpbasis.de/images/wpbasis_logo.png" medium="image">
			<media:title type="html">WP Basis Theme Logo</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Vorbei mit my-hacks.php?</title>
		<link>http://bueltge.de/vorbei-mit-my-hacks-php/937/</link>
		<comments>http://bueltge.de/vorbei-mit-my-hacks-php/937/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 13:23:17 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP2.8]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=937</guid>
		<description><![CDATA[Noch diesen Monat soll die neue Version 2.8 von WordPress erscheinen; in der Blogosphäre wird schon lange kein so großer Wind mehr darum gemacht, wie es noch in den Jahren um Version 2.0 war. Aber der Linkmangel etc. wird ja auch in anderen Themen bemängelt.

Die neue <a href="http://codex.wordpress.org/Version_2.8">Version bringt viele neue Sachen</a>, fixt eine große Anzahl von Problemen und WordPress gestaltet sich aus meiner Sicht noch offener als in den Versionen zu vor. Eine der Punkte, die Benutzer beachten sollten, ist die Tatsache, dass man die Option für die Unterstützung der <code>my-hacks.php</code> entfernt. <a href="http://wordpress.org/development/2003/12/new-feature-my-hacksphp/">2003</a> wurde diese Datei noch als Feature angekündigt, geht sie nun wieder still und leise. WordPress hat ein ausgefeiltes Schnittstellen-System; man kann an diversen Punkten ansetzen und neue Funktionalitäten einbringen, so dass man sich dazu entschieden hat, die Lösung nicht mehr zu unterstützen. Alternativen und Möglichkeiten des weiteren Nutzen will hier kurz aufzeigen.]]></description>
			<content:encoded><![CDATA[<p>Noch diesen Monat soll die neue Version 2.8 von WordPress erscheinen; in der Blogosphäre wird schon lange kein so großer Wind mehr darum gemacht, wie es noch in den Jahren um Version 2.0 war. Aber der Linkmangel etc. wird ja auch in anderen Themen bemängelt.</p>
<p>Die neue <a href="http://codex.wordpress.org/Version_2.8">Version bringt viele neue Sachen</a>, fixt eine große Anzahl von Problemen und WordPress gestaltet sich aus meiner Sicht noch offener als in den Versionen zu vor. Eine der Punkte, die Benutzer beachten sollten, ist die Tatsache, dass man die Option für die Unterstützung der <code>my-hacks.php</code> entfernt. <a href="http://wordpress.org/development/2003/12/new-feature-my-hacksphp/">2003</a> wurde diese Datei noch als Feature angekündigt, geht sie nun wieder still und leise. WordPress hat ein ausgefeiltes Schnittstellen-System; man kann an diversen Punkten ansetzen und neue Funktionalitäten einbringen, so dass man sich dazu entschieden hat, die Lösung nicht mehr zu unterstützen. Alternativen und Möglichkeiten des weiteren Nutzen will hier kurz aufzeigen.<br />
<span id="more-937"></span></p>
<h3>my-hacks.php weiter nutzen</h3>
<p>Die Datei mit eigenen Erweiterungen kann auch in 2.8 weiter genutzt werden, sie wird nur nicht mehr per Option aus dem Backend aktiviert. Will man dies tun, so muss man den Eintrag <code>hack_file</code> in der Tabelle <em>options</em> auf <em>1</em> setzen.<br />
Dies geschieht entweder direkt in der Datenbank, beispielsweise über phpMyAdmin oder via Code:</p>
<pre><code>
update_option( 'hack_file', 1 );
</code></pre>
<p>Alternativ kann man die Option via Plugin wieder in das Backend holen, siehe <a href="http://schnurpsel.de/das-ende-der-wordpress-hacker-145/">Beitrag und Plugin-Download</a> bei Schurpsel.</p>
<p>Die Abfrage der Datei ist weiterhin im Core und soll auch so bleiben, auch die Abfrage des Felder in der Datenbank soll bleiben.</p>
<pre><code>
// Check for hacks file if the option is enabled
if ( get_option('hack_file') ) {
	if ( file_exists(ABSPATH . 'my-hacks.php') )
		require(ABSPATH . 'my-hacks.php');
}
</code></pre>
<p>Damit bleibt alles beim alten, wer das möchte. Die Datei weiterhin im Root (<code>ABSPATH</code>) der Installation ablegen und sie wird gezogen.</p>
<p>Die Überlegung die Datei nicht mehr zu unterstützen ist natürlich mit Überlegungen verbunden und da WordPress ausgezeichnete Schnittstellen bietet, ist die Unterstützung nicht mehr als relevant angesehen. Außerdem wird die Datei recht früh gezogen und lässt sich damit nicht immer so sauber steuern, wie man das von anderen Schnittstellen kennt. Eine Prüfung auf Intoleranzen und Probleme ist garnicht vorhanden und die Datei kann auch das System bremsen.</p>
<h3>via Plugin</h3>
<p>Eine der Schnittstellen ist die Plugin-Schnittstelle und daher bietet es sich an, dass man sich ein Plugin anlegt, in dem man die kleinen Hacks ablegt. Entweder man lernt wie das geht, zum Beispiel in meinem <a href="http://bueltge.de/wp-tutorial-wir-schreiben-ein-simples-wp-plugin-teil-0/211/">kleinen Tutorial zum Plugin schreiben</a> oder hier die Vorlage.</p>
<p>Einfach eine PHP-Datei anlegen und folgenden Syntax rein, dann die eigenen Hacks dort ablegen und die Datei in das Plugin-Verzeichnis kopieren. Im Backend muss es dann nur noch aktiviert werden.</p>
<pre><code>
&lt;?php
/*
Plugin Name: my-hacks.php
Plugin URI: http://
Description: my-hacks.php - Ersatz seit WordPress 2.8
Author: DU
Version: 0.1
Author URI: http://
*/

/**
 * hier die Hacks ablegen
 */

?&gt;
</code></pre>
<h3>Theme-Funktionen</h3>
<p>Das aktive Theme kann immer eigene Funktionen hinzubringen, dazu wird die Datei <code>functions.php</code> genutzt und die kann jedem Theme hinzugefügt werden. Gedacht ist sie, um explizit für das jeweilige Theme, neue Funktionen einzubringen. Daher kann man auch die Hacks dort ablegen, also einfach in die <code>functions.php</code> des Themes schreiben, hochladen in den Theme-Ordner und fertig.</p>
<h3>Alternative Sprachordner</h3>
<p>Ein dritte Möglichkeit um eigene Funktionen einzubringen ist der Sprachordner, im Standard ist das <code>/wp-content/languages/</code>; <code>wp-content</code> kann seit Version 2.5 verschoben und umbenannt werden. Wenn ein Sprachschlüssel in der <code>wp-config.php</code> gesetzt ist, zum Beispiel de_DE, dann wird durch WordPress in dem Ordner nach einer Sprachdatei <code>.mo</code>- und einer <code>.php</code>-Datei gesucht und wenn vorhanden, gezogen.</p>
<pre><code>
define ('WPLANG', 'de_DE');
</code></pre>
<pre><code>
/**
 * The locale of the blog
 * @since 1.5.0
 */
$locale = get_locale();
$locale_file = WP_LANG_DIR . "/$locale.php";
if ( is_readable($locale_file) )
	require_once($locale_file);

/**
 * Loads the theme's translated strings.
 *
 * If the current locale exists as a .mo file in the theme's root directory, it
 * will be included in the translated strings by the $domain.
 *
 * The .mo files must be named based on the locale exactly.
 *
 * @since 1.5.0
 *
 * @param string $domain Unique identifier for retrieving translated strings
 */
function load_theme_textdomain($domain, $path = false) {
	$locale = get_locale();

	$path = ( empty( $path ) ) ? get_template_directory() : $path;

	$mofile = "$path/$locale.mo";
	load_textdomain($domain, $mofile);
}
</code></pre>
<p>Dies sollte natürlich nur für Hacks und Funktionen genutzt werden, die mit der Sprache des Blog zu tun haben und nicht missbraucht werden. Im Grunde kann man aber auch dort Funktionen ablegen. Diese Möglichkeit ist vor allem sehr gut geeignet und sprachtypische Funktionen abzulegen, wie zum Beispiel das die URL bei Permalinks sauber übergeben wird (ue statt u bei ü etc.).<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/vorbei-mit-my-hacks-php/937/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/vorbei-mit-my-hacks-php/937/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Keine Sub-Kategorien im Loop von WordPress</title>
		<link>http://bueltge.de/keine-sub-kategorien-im-loop-von-wordpress/901/</link>
		<comments>http://bueltge.de/keine-sub-kategorien-im-loop-von-wordpress/901/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 01:07:28 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Webdeveloper]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=901</guid>
		<description><![CDATA[Nicht immer soll die Ausgabe des Loop innerhalb einer Kategorie die Unterkategorien enthalten. Um das zu bewerkstelligen kann man einen eigene  WP Query bauen und jeweils ein Template erstellen, siehe einige Tipps und Hinweis dazu in <a href="http://bueltge.de/wordpress-query-quick-tipps/717/" title="zum Beitrag WordPress Query Quick Tipps">einem anderen Beitrag</a> von mir. Alternativ kann man aber auch einen Hook nutzen und alle Unterkategorien zu filtern. Die folgende Syntax ablegen in der <code>functions.php</code> des Themes oder in ein Plugin auslagern und fertig.

Alternativ kann man diesen Hook aber auch zu anderen Sachen benutzen. Auch dazu möchte ich hier einige Worte verlieren.]]></description>
			<content:encoded><![CDATA[<p>Nicht immer soll die Ausgabe des Loop innerhalb einer Kategorie die Unterkategorien enthalten. Um das zu bewerkstelligen kann man einen eigene  WP Query bauen und jeweils ein Template erstellen, siehe einige Tipps und Hinweis dazu in <a href="http://bueltge.de/wordpress-query-quick-tipps/717/" title="zum Beitrag WordPress Query Quick Tipps">einem anderen Beitrag</a> von mir. Alternativ kann man aber auch einen Hook nutzen und alle Unterkategorien zu filtern. Die folgende Syntax ablegen in der <code>functions.php</code> des Themes oder in ein Plugin auslagern und fertig.</p>
<p>Alternativ kann man diesen Hook aber auch zu anderen Sachen benutzen. Auch dazu möchte ich hier einige Worte verlieren.<br />
<span id="more-901"></span><br />
Der Hook <code>posts_where</code> ist eine wichtige Möglichkeit um auf den Query von WordPress Einfluss zu nehmen und daher ein Bestandteil des Query: <code>$where = apply_filters('posts_where', $where);</code>. Er dient beispielsweise dazu, den Query von WordPress zu erweitern. Dabei wird immer ein Parameter übergeben. Dieser kann mit jede Art von SQL-Anweisungen befüllt werden.</p>
<p>Ein bekanntes Beispiel ist eventuell mein Artikel zum verspäteten Veröffentlichen von Feeds: &#8222;<a href="http://bueltge.de/wordpress-feed-zeitversetzt-befuellen/806/">WordPress Feed zeitversetzt befüllen</a>&#8220;.</p>
<p>Eine weitere Möglichkeit ist es, wie schon im Eingang angesprochen, dass bei der Ausgabe innerhalb von Kategorien die Unterkategorien nicht gelistet werden sollen. Die folgende Syntax tut genau dies.</p>
<pre><code>
if ( !function_exists('fb_filter_child_cats') ) {
	function fb_filter_child_cats( $cats= '' ) { 
		global $wp_query, $wpdb;
	
		if ( is_category() ) {
			
			// get children ID's
			if ( $excludes = get_categories( "child_of=" . $wp_query->get('cat') ) ) {
				
				// set array with ID's
				foreach ( $excludes as $key => $value ) {
					$exclude[] = $value->cat_ID;
				}
			}
			
			// remove child cats
			if ( isset($exclude) &#038;& is_array($exclude) ) {
				$cats .= " AND " . $wpdb->prefix . "term_taxonomy.term_id NOT IN (" . implode(",", $exclude) . ") ";
			}
		}
		
		return $cats;
	}
	
	if ( !is_admin() ) {
		add_filter( 'posts_where', 'fb_filter_child_cats' );
	}
}
</code></pre>
<p>Um ein stabileres Ergebnis zu erzielen, sollte man möglichst SQL Selects umgehen und damit stabiler in WP zu bleiben. Daher hier eine weitere Lösung für die Filterung der Kinder-Kategorien:</p>
<pre><code>
function fb_filter_child_cats($query) {
	
	$cat = get_term_by('name', $query-&gt;query_vars['category_name'], 'category');
	$child_cats = (array) get_term_children( &amp;$cat-&gt;term_id, 'category' );
	
	if ( !$query-&gt;is_admin )
		$query-&gt;set( 'category__not_in', array_merge($child_cats) );
	
	return $query;
}
add_filter( 'pre_get_posts', 'fb_filter_child_cats' );
</code></pre>
<p>Ein weiteres Beispiel soll zeigen, wie man den Query erweitert. Dabei beziehe ich mich auf einige Fragen aus der WP Hacker Mailingliste, die eigentlich dort nicht hingehören, dazu ist das Forum da.<br />
In die Funktion habe ich mal drei Beispiele integriert.</p>
<ul>
<li>Beiträge der Zukunft im Loop</li>
<li>Seiten im Loop</li>
<li>Nur Beiträge im Loop, die älter als 5 Tage sind</li>
</ul>
<p>Ich hoffe, dass die Möglichkeiten damit recht gut dargestellt werden.</p>
<pre><code>
if ( !function_exists('fb_filter_where') ) {
	function fb_filter_where( $where = '' ) {
		global $wpdb;
		
		// allow future posts in loop
		$where .= " OR $wpdb->posts.post_status = 'future' ";
		
		// show pages in loop
		$where .= " OR $wpdb->posts.post_type = 'page' ";
		
		// only older (<) as 5 days
		$where .= " AND post_date < '" . date('Y-m-d', strtotime('-5 days')) . "'";
		
		return $where;
	}
	
	if ( !is_admin() ) {
		add_filter( 'posts_where', 'fb_filter_where' );
	}
}
</code></pre>
<p>Die Möglichkeiten sind sehr flexibel und im Grunde nur abhängig von den SQL-Abfragen. Damit sollte der Hook ein wenig verständlicher sein und seine vielseitigen Möglichkeiten lassen sich nur annähernd darstellen. Dieser Hook ist nur einer von vielen Hooks, die die Flexibilität von WordPress auszeichnen.<br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/keine-sub-kategorien-im-loop-von-wordpress/901/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/keine-sub-kategorien-im-loop-von-wordpress/901/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Statische Links zu WordPress Seiten hinzufügen</title>
		<link>http://bueltge.de/statische-links-zu-wordpress-seiten-hinzufuegen/903/</link>
		<comments>http://bueltge.de/statische-links-zu-wordpress-seiten-hinzufuegen/903/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 11:17:19 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=903</guid>
		<description><![CDATA[Nicht selten werden die Menus auf Blogs, welche mit WordPress arbeiten, mit statischen Links erstellt. Das mag anfangs einfacher erscheinen und weniger Mühe machen, aber bei Veränderungen oder Pflege durch User, die keine Kenntnis oder Zugriffe auf die Templates haben, ist es aufwändig, fehleranfällig und umständlich. Daher bietet es sich an, lieber die nötigen Template Tags zu nutzen und mit Hilfe der Parameter die nicht erwünschte (<code>exclude</code>) oder erwünschten (<code>include</code>) Seiten zu laden. Zusätzlich kann man Inhalte hinzufügen via Hook, was ich hier mal kurz erklären will.]]></description>
			<content:encoded><![CDATA[<p>Nicht selten werden die Menus auf Blogs, welche mit WordPress arbeiten, mit statischen Links erstellt. Das mag anfangs einfacher erscheinen und weniger Mühe machen, aber bei Veränderungen oder Pflege durch User, die keine Kenntnis oder Zugriffe auf die Templates haben, ist es aufwändig, fehleranfällig und umständlich. Daher bietet es sich an, lieber die nötigen Template Tags zu nutzen und mit Hilfe der Parameter die nicht erwünschte (<code>exclude</code>) oder erwünschten (<code>include</code>) Seiten zu laden. Zusätzlich kann man Inhalte hinzufügen via Hook, was ich hier mal kurz erklären will.<br />
<span id="more-903"></span><br />
So wie sehr viele Funktionen von WordPress, so lässt auch <code>wp_list_pages()</code> den Eingriff per Filter Hook zu. Die Funktion selbst hat eine ausführliche <a href="http://codex.wordpress.org/Template_Tags/wp_list_pages">Beschreibung im Codex</a>.</p>
<pre><code>
$output = apply_filters('wp_list_pages', $output);
</code></pre>
<p>Diesen machen wir uns zunutze und erweitern den Inhalt um zwei Beispiellinks, die man sonst im Theme händisch ergänzen müsste. Dazu legen wir den folgenden Code-Schnipsel in die <code>functions.php</code> des Themes. Die Tags müssen mit übergeben werden, da der Hook nach der Ausgabe der Liste integriert ist.</p>
<pre><code>
if ( !function_exists('fb_add_page_link') ) {
	function fb_add_page_link($output) {
		$output .= '&lt;li&gt;&lt;a href=&quot;http://example.com/1/&quot;&gt;Example 1&lt;/a&gt;&lt;/li&gt;';
		$output .= '&lt;li&gt;&lt;a href=&quot;http://example.com/2/&quot;&gt;&lt;span&gt;Example&lt;/span&gt; 2&lt;/a&gt;&lt;/li&gt;';
	
		return $output;
	}
	
	add_filter('wp_list_pages', 'fb_add_page_link');
}
</code></pre>
<p>Nun wird die Ausgabe erweitert um die beiden Beispiellinks. Der folgenden HTML-Syntax soll es verdeutlichen.</p>
<pre><code>
&lt;li class=&quot;pagenav&quot;&gt;
	&lt;h3&gt;Seiten&lt;/h3&gt;
	&lt;ul&gt;
		&lt;li class=&quot;page_item page-item-2&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=2&quot; title=&quot;About&quot;&gt;About&lt;/a&gt;&lt;/li&gt;
		&lt;li class=&quot;page_item page-item-64&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=64&quot; title=&quot;Default Form&quot;&gt;Default Form&lt;/a&gt;&lt;/li&gt;
		&lt;li class=&quot;page_item page-item-40&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=40&quot; title=&quot;Offerings&quot;&gt;Offerings&lt;/a&gt;&lt;/li&gt;
		&lt;li class=&quot;page_item page-item-12&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=12&quot; title=&quot;Page 2&quot;&gt;Page 2&lt;/a&gt;
			&lt;ul&gt;
				&lt;li class=&quot;page_item page-item-14&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=14&quot; title=&quot;Subpage&quot;&gt;Subpage&lt;/a&gt;
					&lt;ul&gt;
						&lt;li class=&quot;page_item page-item-45&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=45&quot; title=&quot;Subsubpage&quot;&gt;Subsubpage&lt;/a&gt;&lt;/li&gt;
					&lt;/ul&gt;
				&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li class=&quot;page_item page-item-16&quot;&gt;&lt;a href=&quot;http://example.com/?page_id=16&quot; title=&quot;Page 3&quot;&gt;Page 3&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;http://example.com/1/&quot;&gt;Example 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://example.com/2/&quot;&gt;&lt;span&gt;Example&lt;/span&gt; 2&lt;/a&gt;&lt;/li&gt;
</code></pre>
<p>Aufpassen, diese Links werden nach Prüfen der Parameter hinzugefügt und sind damit nicht mehr mit Hilfe der Parameter zu entfernen. Setzt man den Template Tag <code>wp_list_pages()</code> also mehrfach mit unterschiedlicher Ausgabe ein, so ist bei allen Ausgaben die Erweiterung dabei. Unterschiede lassen sich dann nicht ohne weiteres gestalten. Auch nicht mit dem zweiten Template Tag für Pages  <code>wp_page_menu()</code>. Dieser Template Tag zieht die Inhalte aus aus der Funktion <code>wp_list_pages()</code>!</p>
<p>Als Hinweis sei noch gesagt, dass man den Template Tag <code>wp_page_menu()</code> erst seit WordPress Version 2.7 einsetzen kann. Dieser Tag kann im Grunde nicht viel mehr außer das automatische Hinzufügen eines Home-Link und die Steuerung der Ausgabe (<code>echo</code>), mehr in <a href="http://codex.wordpress.org/Template_Tags/wp_page_menu">Beschreibung</a> oder bei <a href="http://www.texto.de/wp-27-wp_page_menu-neuer-template-tag-688/">Monikas Artikel</a>. Aber die Funktion unterscheidet sich noch in zwei weiteren Fällen und so kann man an zwei Punkten via Filter Hook einhaken und modifizieren.<br />
Zum einen kann man die Argumente erweitern ...</p>
<pre><code>
$args = apply_filters( 'wp_page_menu_args', $args );
</code></pre>
<p>... und zum anderen das Menu erweitern.</p>
<pre><code>
$menu = apply_filters( 'wp_page_menu', $menu, $args );
</code></pre>
<p>Und damit kann man doch wieder unterschiedliche Ausgaben realisieren. So ruft der folgende Syntax wieder die beiden Beispiellinks in die zu letzt genannte Funktion <code>wp_page_menu()</code> und damit kommt <code>wp_list_pages()</code> ohne die Erweiterung der beiden Links aus.</p>
<pre><code>
add_filter('wp_page_menu', 'fb_add_page_link');
</code></pre>
<p>Mit ein wenig Überlegung kann man so also recht flexibel die Ausgabe gestallten und die Autoren mitwirken lassen, wenn es darum geht, automatisch Seiten zu Navigationen hinzuzufügen.</p>
<p><cite>Die Idee ist aufgefallen bei <a href="http://sivel.net/2009/03/adding-additional-links-to-the-output-from-wp_list_pages/">Sivel.net</a></cite><br />
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/statische-links-zu-wordpress-seiten-hinzufuegen/903/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/statische-links-zu-wordpress-seiten-hinzufuegen/903/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
	</channel>
</rss>

