<?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; Themes</title>
	<atom:link href="http://bueltge.de/category/wordpress/themes/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>Wed, 09 May 2012 15:13:47 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WordPress Custom Post Types als CSS-Klasse im Frontend nutzen</title>
		<link>http://bueltge.de/wordpress-custom-post-types-als-css-klasse-im-frontend-nutzen/1247/</link>
		<comments>http://bueltge.de/wordpress-custom-post-types-als-css-klasse-im-frontend-nutzen/1247/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 02:41:26 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1247</guid>
		<description><![CDATA[Um die Inhalte, welche über Custom Post Types eingebracht werden, im Frontend eventuell anders zu gestalteten, kann man sich diesen Typ als Klasse in den body-Tag holen und damit via CSS einfach darauf zugreifen.]]></description>
			<content:encoded><![CDATA[<p>Die Möglichkeit in WordPress eigene Post-Types einzubringen erfreut sich wachsender Beliebtheit und kann so manche Arbeit vereinfachen - wichtig ist, dass man im Vorfeld die Anforderungen exakt bewertet und die Möglichkeiten einschätzt. Aber darum soll es in diesem kleinen Beitrag nicht gehen - ich möchte kürz eine Lösung zeigen, die den oder die neuen Post Typen in das Frontend bringt, um die neuen Typen mittels CSS anzusprechen.<br />
<span id="more-1247"></span><br />
Im Grunde wird lediglich die Funktion <a href="http://codex.wordpress.org/Template_Tags/body_class"><code>body_class()</code></a> von WordPress erweitert um die eigenen Post Types, so dass man sie übergeordnet ansprechen kann und das Design entsprechend gestaltet.<br />
Gleiches hatte ich schon in einem <a href="http://bueltge.de/wordpress-theme-in-abhaengigkeit-des-titel/397/">anderen Beitrag</a> ausführlicher erläutert, wo der Titel eines Beitrags in diese Funktion übernommen wurde; daher dort bitte die Zusatzinformationen abholen.</p>
<pre><code class="php">
// Adds classes for custom post types to body_class() and post_class()
function fb_add_body_class( $class ) {
	$post_type = 'my_example_post_type'; // der Post Type

	if ( get_query_var('post_type') === $post_type ) { // nur wenn der Post Type aktiv ist, dann erweitern
		$class[] = $post_type;
		$class[] = 'type-' . $post_type;
	}

	return $class;
}
add_filter( 'body_class', 'fb_add_body_class' );
</code></pre>
<p>Alternativ kann man auch die <a href="http://codex.wordpress.org/Function_Reference/post_class"><code>post_class()</code></a> Funktion erweitern um die Klasse des Custom Post Type nicht direkt am body-Tag zu haben. Dazu verwende ich die gleiche Funktion und es muss lediglich der Hook für die post-Klassen angesprochen werden.</p>
<pre><code class="php">
add_filter( 'post_class', 'fb_add_body_class' );
</code></pre>
<p>Beide Template Tags werden im HTML-Tag verwendet, wie auch die verlinkten Codex-Seiten aufzeigen; bzw. ein Beispiel für die Post-Klasse:</p>
<pre><code class="php">
&lt;div &lt;?php post_class('class-name'); ?&gt;&gt;
</code></pre>
<p>Viel Freude beim austesten und nutzen. Die Kommentarfunktion steht wie immer für Verbesserungen und Diskussion offen.<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-custom-post-types-als-css-klasse-im-frontend-nutzen/1247/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-custom-post-types-als-css-klasse-im-frontend-nutzen/1247/feed/</wfw:commentRss>
		<slash:comments>6</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>Einfaches Autoresize für die WordPress Hintergrundbild-Funktion</title>
		<link>http://bueltge.de/einfaches-autoresize-fur-die-wordpress-hintergrundbild-funktion/1230/</link>
		<comments>http://bueltge.de/einfaches-autoresize-fur-die-wordpress-hintergrundbild-funktion/1230/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 13:22:01 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CSS, xHTML, JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[StyleSheet]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1230</guid>
		<description><![CDATA[Die Hintergrundbild-Funktion von WordPress kann angepasst werden, wie man dies tut und was man erwarten kann zeige ich an einem Beispiel, welches das Hintergrund mittels Autoresize immer an die Größe des Browsers anpasst. ]]></description>
			<content:encoded><![CDATA[<p>Mit WordPress 3.0 wurde die Möglichkeit im Theme geschaffen, dass der User einfach ein <a href="http://wpengineer.com/1964/wordpress-3-0-custom-background-support/">Hintergrundbild</a> hochladen und nutzen können. Das Bild wird mittels CSS im Hintergrund positioniert. Damit ist es nicht ganz so einfach, dass die Möglichkeit des Autoresize schafft und der Hintergrund sich an die Größe des Browsers anpasst. Es gibt einige schöne Möglichkeiten für diese Anforderung, ich möchte kurz eine sehr einfache Möglichkeit mittels CSS aufzeigen, da so die Funktion von WordPress nicht angefasst werden muss.<br />
<span id="more-1230"></span><br />
Die folgende Syntax muss innerhalb des Stylesheet integriert werden. Dazu kann auch ein <a href="http://bueltge.de/wordpress-child-themes-verstehen/1192/">Child-Theme</a> angelegt werden, wenn das Originaltheme nicht verändert werden sollte. Die Werte müssen mit <code>!important</code> versehen werden, da ansonsten die Werte von WordPress genutzt werden, das Überschreiben dieser Werte ist nicht anders möglich. Damit wird der Hintergrund immer an die Größe des Browsers angepasst - aber Achtung: dies ist nicht immer die optimale Lösung, da die Bilder dazu in der eigentlichen Größe verändert werden, heißt also, dass ein sehr schmaler Bildausschnitt das Bild extrem verzerrt. Der Beispielscreenshot ist da wenig empfindlich, da die Wolken dies vertragen können und trotzdem ein angenehmes Hintergrundbild liefern - im Gegensatz zum Standard, in dem das Bild wie in der Vorschau gekachelt wäre; bei anderen Bildern kann dies sehr unschön aussehen.</p>
<p><img src="http://wpengineer.com/wp-content/uploads/autoresize-settings-300x190.png" alt="" title="autoresize-settings" width="300" height="190" class="aligncenter size-medium wp-image-2107" /></p>
<pre><code lang="css">
body {
	background-repeat:no-repeat !important;
	background-position:center center !important;
	background-attachment:fixed !important;
	-o-background-size: 100% 100%, auto !important;
	-moz-background-size: 100% 100%, auto !important;
	-webkit-background-size: 100% 100%, auto !important;
	background-size: 100% 100%, auto !important;
}
</code></pre>
<p>Das CSS ist nicht in allen Browsern nutzbar, <a href="http://caniuse.com/?utm_content=backtype-tweetcount&#038;utm_medium=bt.io-twitter&#038;utm_source=twitter.com#search=background-size">siehe Übersicht</a>, liefert daher nur in den aktuellen Browsern den erwarteten Effekt. Der Internet Explorer, Browser kann man ihn ja schlecht nennen, hat hiermit so seine Schwierigkeiten.</p>
<p><img src="http://wpengineer.com/wp-content/uploads/autoresize-example-300x153.png" alt="" title="autoresize-example" width="300" height="153" class="aligncenter size-medium wp-image-2106" /></p>
<p>Eine Alternative ist es den Callback für die Funktion mitzugeben und eine eigene kleine Funktion in der <code>functions.php</code> abzulegen, die sich um das Ausgeben des CSS kümmert. Die folgende Funktion tut dies statisch, fragt also nur das Bild ab und nutzt die Werte aus dem Backend nicht.</p>
<pre><code>
function fb_header_callback() {
  
  $background = get_background_image();
  if ( !$background )
    return;

  if ( $background ) {
    $image = &quot; background-image: url('$background');&quot;;
  
    $style  = 'background-repeat:no-repeat;';
    $style .= 'background-position:center center;';
    $style .= 'background-attachment:fixed;';
    $style .= '-o-background-size: 100% 100%, auto;';
    $style .= '-moz-background-size: 100% 100%, auto;';
    $style .= '-webkit-background-size: 100% 100%, auto;';
    $style .= 'background-size: 100% 100%, auto;';

    $style .= $image . $style;
  }
?&gt;
&lt;style type=&quot;text/css&quot;&gt;
body { &lt;?php echo trim( $style ); ?&gt; }
&lt;/style&gt;
&lt;?php
}
</code></pre>
<p>Diese Funktion muss in der Funktion als Callback mitgeben, sie kann natürlich beliebig angepasst werden. In der <code>functions.php</code> des Themes sollte es, wenn es die Background-Image-Funktionalität schon gibt, die Funktion <code>add_custom_background()</code> geben. Dieser muss im ersten Parameter mit der neuen Funktion erweitert werden und nun wird der Standard-Callback von WordPress nicht mehr aufgerufen. </p>
<pre><code class="php">
	// This theme allows users to set a custom background
	add_custom_background( 'fb_header_callback' );
</code></pre>
<p>Als Hinweis, der Style wird dann via Hook <code>wp_head</code> direkt im <code>head</code> ausgegeben, eher unschön - wie ich finde, und daher solltet ihr diese Formatierung wohl besser im Stylesheet ablegen, da sie eh statisch ist und nicht vom User angepasst werden kann. Ebenso ist wichtig das der Hook auch im Theme vorhanden ist, was aber auch für andere Plugins oder Funktionen wichtig ist.</p>
<h4>Werte aus dem Backend nutzen</h4>
<p>Als letzter kleiner Tipp für eure eigenen Anpassungen möchte ich noch zeigen, wie man die Werte aus dem Backend bekommt und nutzt.<br />
Die Hintergrundfarbe der Optionen zum Hintergrundbild wird mit folgender Funktion zurück gegeben:</p>
<pre><code>$color = get_background_color();</code></pre>
<p>Das Bild bekommt via:</p>
<pre><code>$background = get_background_image();</code></pre>
<p>Und einzelne Einstellungen zum Style werden via <code>get_theme_mod($name);</code> abgefragt:<br />
Der folgende kleine Schnipsel gibt die gesetzten Werte zum Theme zurück.</p>
<pre><code>
$mods = get_theme_mods();
var_dump($mods);
</code></pre>
<p>Dies könnte beispielsweise für das Standard Theme Tweny Ten wie folgt aussehen</p>
<pre><code class="php">
string 'Twenty Ten' (length=10)

array
  'background_image' => string 'http://localhost/wpbeta/wp-content/uploads/2010/12/apple-touch-icon.png' (length=71)
  'background_image_thumb' => string 'http://localhost/wpbeta/wp-content/uploads/2010/12/apple-touch-icon.png' (length=71)
  'background_repeat' => string 'no-repeat' (length=9)
  'background_position_x' => string 'center' (length=6)
  'background_attachment' => string 'scroll' (length=6)
  'background_color' => string '' (length=0)
</code></pre>
<p>Aufgrund dieser Werte im Array kann man beispielsweise den Wert <code>background_repeat</code> holen,</p>
<pre><code>$repeat = get_theme_mod( 'background_repeat' );</code></pre>
<p>der in diesem Beispiel <code>no-repeat</code> zurück gibt.</p>
<p>Mit den anderen Werten kann man genauso verfahren; eine Menge an Spielraum und Möglichkeiten.<br />
Zum den Themen CSS und Hintergrund findet man einen ausführlichen Artikel bei Chris: <a href="http://css-tricks.com/perfect-full-page-background-image/">Perfect Full Page Background Image</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/einfaches-autoresize-fur-die-wordpress-hintergrundbild-funktion/1230/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/einfaches-autoresize-fur-die-wordpress-hintergrundbild-funktion/1230/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/autoresize-settings-300x190.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/autoresize-settings-300x190.png" medium="image">
			<media:title type="html">autoresize-settings</media:title>
		</media:content>
		<media:content url="http://wpengineer.com/wp-content/uploads/autoresize-example-300x153.png" medium="image">
			<media:title type="html">autoresize-example</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>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 Login-Seite anpassen #3</title>
		<link>http://bueltge.de/wordpress-login-seite-anpassen-3/1214/</link>
		<comments>http://bueltge.de/wordpress-login-seite-anpassen-3/1214/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 23:10:25 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1214</guid>
		<description><![CDATA[Schon mehrfach habe ich über die Möglichkeiten der Anpassungen des Login zum WordPress Backend berichtet, diverse Beiträge lassen sich dazu finden. Aktuell kommen trotzdem immer wieder Fragen und so möchte ich zwei einfache Möglichkeiten aufzeigen, so dass man mit wenig Aufwand das Login an die Site anpassen - ein schöner Mehrwert auch im Bezug auf Kundenprojekte, die so runder wirken, als wenn immer das WordPress Logo und der Link erscheint.]]></description>
			<content:encoded><![CDATA[<div class="contentnavi">
<h3>Mehr:</h3>
<ul>
<li><a href="http://bueltge.de/wordpress-25-und-theme-definiertes-login/617/">#1</a></li>
<li><a href="http://bueltge.de/wordpress-27-login-design-anpassen/846">#2</a></li>
<li>#3</li>
</ul>
</div>
<p>Schon mehrfach habe ich über die Möglichkeiten der Anpassungen des Login zum WordPress Backend berichtet, diverse Beiträge lassen sich dazu finden. Aktuell kommen trotzdem immer wieder Fragen und so möchte ich drei einfache Möglichkeiten aufzeigen, so dass man mit wenig Aufwand das Login an die Site anpassen - ein schöner Mehrwert auch im Bezug auf Kundenprojekte, die so runder wirken, als wenn immer das WordPress Logo und der Link erscheint.<br />
<span id="more-1214"></span><br />
Im ersten Schritt passe ich dazu das Logo auf der Login-Seite an. Dies wurde von mir <a href="http://bueltge.de/wordpress-27-login-design-anpassen/846/">schon mal beschrieben</a>, allerdings mehr im Hinblick auf das Ändern des kompletten Login-Screen und so hier eine einfachere Art und Weise, die schnell realisiert ist. Die Stylesheet-Anweisung soll einfach in den head geschrieben werden, im älteren Tutorial wird ein externes Stylesheet eingebunden.</p>
<h4>Logo ändern</h4>
<p>Im ersten Code-Beispiel binde ich das Favicon ein, ein schneller Weg ohne großen Aufwand. Alternativ kann natürlich auch ein Logo aus dem Theme eingebunden werden, dazu Code-Beispiel Nummer zwei. Jedes der folgenden Beispiele gehört in die functions.php des Themes.</p>
<pre><code class="php">
function fb_custom_login_logo() {
	$style = '&lt;style type=&quot;text/css&quot;&gt; h1 a { background: transparent url(' . get_bloginfo('url') . '/favicon.ico) no-repeat 30px center !important; } &lt;/style&gt;';
	echo $style;
}
add_action( 'login_head', 'fb_custom_login_logo' );
</code></pre>
<pre><code class="php">
function fb_custom_login_logo() {
	$style = '&lt;style type=&quot;text/css&quot;&gt; h1 a { background: transparent url(' . get_bloginfo('template_directory') . '/images/your-logo-image.png) no-repeat center top !important; } &lt;/style&gt;';
	echo $style;
}
add_action( 'login_head', 'fb_custom_login_logo' );
</code></pre>
<p>Nun haben wir zwar das Logo angepasst, aber der Name beim Hover-Effekt ist noch immer nicht der Site entsprechend. Also auch dafür eine Anpassung, wozu es einen Hook gibt.</p>
<h4>Namen ändern</h4>
<p>Diesen Hook sprechen wir an und geben in dem folgenden Schnippsel den Namen des Blog mit, der in der Datenbank gepflegt ist, der also über die Einstellungen erreichbar und veränderbar ist. Alternativ kann man natürlich auch statische Inhalte oder eigene Felder abfragen.</p>
<pre><code class="php">
function fb_login_headertitle() {
	$name = get_option('blogname');
	echo $name;
}
add_filter( 'login_headertitle', 'fb_login_headertitle' );
</code></pre>
<h4>Link ändern</h4>
<p>Zum Abschluss soll nun noch der Link ebenfalls angepasst werden, so dass ein Klick auf das Logo zum Frontend der Installation führt. Auch dafür hat WP einen Hook vorgesehen.</p>
<pre><code>
function fb_login_headerurl() {
	$url = bloginfo('url');
	echo $url;
}
add_filter( 'login_headerurl', 'fb_login_headerurl' );
</code></pre>
<p>Drei kleine einfache Möglichkeiten die in fast jedes Theme gehören und so das Login zur Site entsprechend anpassen. Der Kunde wird es danken und das Produkt ist einfach ein wenig runder. Viel Freude damit.<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-login-seite-anpassen-3/1214/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-login-seite-anpassen-3/1214/feed/</wfw:commentRss>
		<slash:comments>17</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 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>WordPress und jQuery - einige Tipps</title>
		<link>http://bueltge.de/wordpress-und-jquery-einige-tipps/1172/</link>
		<comments>http://bueltge.de/wordpress-und-jquery-einige-tipps/1172/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 16:00:21 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1172</guid>
		<description><![CDATA[jQuery und WordPress gemeinsam nutzen ist einfach, wenn man die Funktionen kennt und einige Beispiel sollen dem Verständnis dienen.]]></description>
			<content:encoded><![CDATA[<p>Innerhalb von WordPress sind eine ganze Reihe von Javascript Bibliotheken vorhanden, diese kann man einfach nutzen und muss sie nicht extra in Themes und Plugins mitbringen. Ebenfalls empfiehlt sich diese Vorgehensweise, damit Bibliotheken nicht mehrfach geladen werden. Einiges Hinweise zu beiden Themen findet ihr in den Beiträgen <a href="http://bueltge.de/javascript-bibliotheken-in-und-aus-wordpress-nutzen/808/">JavaScript-Bibliotheken in und aus WordPress nutzen</a> und <a href="http://bueltge.de/abfrage-einer-script-version-in-wordpress/570/">Abfrage einer Script-Version in WordPress</a>.</p>
<p><img class="alignrightob" src="http://bueltge.de/wp-content/images/jquery_logo.gif" alt="jQuery Logo" /><br />
Ab und an braucht man aber etwas bestimmtes und einiges davon wiederholt sich und daraus sind einige Code-Schnippsel entstanden, die hier nun abgelegt sind. Dabei möchte ich speziell am Beispiel jQuery zeigen, wie das geht - liegt zum einen daran, dass jQuery mit vielen Plugins im Core von WordPress vorhanden ist und dass die Arbeit mit jQuery recht unkompliziert ist. Prinzipiell gelten die Hooks und Aufrufe aber auch für eigene Scripte und andere Bibliotheken.<br />
<span id="more-1172"></span></p>
<h4>Die Hooks zum einhaken</h4>
<p>WordPress bietet die Hooks um an bestimmten Punkten im Core einzuhaken. Hier ist einer der Stärken von WordPress und die folgenden drei Hooks sind insbesondere für das inkludieren von Scripten bei Themes interessant. Die nachfolgenden Beispiele zeigen die Verwendung auf.</p>
<ul>
<li><a href="http://adambrown.info/p/wp_hooks/hook/init"><code>init</code></a></li>
<li><a href="http://adambrown.info/p/wp_hooks/hook/template_redirect"><code>template_redirect</code></a></li>
<li><code>after_setup_theme</code> ab WordPress 3.0</li>
</ul>
<h4>jQuery von WordPress im Theme mit der Google AJAX Library ersetzen</h4>
<p>Im folgenden Source wird die jquery-Library von Google CDN geladen; die Nutzung von jQuery kann aber ungestört genutzt bleiben. Andere Plugins können also via <code>wp_enqueue_script()</code> sehr einfach auf die Bibliothek zugreifen.</p>
<pre><code class="php">
function fb_greyfoto_init() {
	if ( !is_admin() ) { // prinzipiell überflüssig, da der Hook nur im Theme zieht
		wp_deregister_script( 'jquery' ); // deregister Schlüssel jquery
		wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, '1.4.2'); // registriere Schlüssel jquery mit der URL von Google CDN
		wp_enqueue_script( 'jquery' ); // binde jquery ein
	}
}
// nur für Theme, ab WordPress 3.0
add_action( 'after_setup_theme', 'fb_greyfoto_init' ); // Theme aktiv, inkludiere Funktion
</code></pre>
<h4>jQuery Library im Footer</h4>
<p>Der Standard-Aufruf von <code>wp_enqueue_script( 'jquery' )</code> im Theme sorgt zwar dafür, dass man jQuery von WordPress holt und wenn alle Plugins und Themes die Bibliothek so referenzieren, dann wird die Bibliothek auch nur einmal eingebunden, aber jQuery wird nicht im Footer geladen, sondern im <em>head</em> der Site. Daher muss der Aufruf umgestellt werden und der Parameter für "lade im Footer" mitgegeben werden.<br />
Im Aufruf des Beispiel zeigt sich auch der Unterschied der Hooks, da <code>after_setup_theme</code> erst ab WordPress 3.0 zur Verfügung steht.</p>
<pre><code class="php">
function fb_greyfoto_init() {
	if ( !is_admin() ) {
		wp_deregister_script( 'jquery' );
		wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', false, '1.4.2', true ); // lade im Footer - true
		wp_enqueue_script( 'jquery' );
		
		// js vom Theme laden, Vorraussetzung jQuery
		wp_enqueue_script( 'styleswitcher', get_bloginfo( 'template_directory') . '/js/styleswitcher.jquery.php', array( 'jquery'), '1.3.2', true ); // lade mein Script mit Schlüssel styleswitcher im Footer und benutze jquery
		wp_enqueue_script( 'greyfoto', get_template_directory_uri() . '/js/photoblogfb.js', array( 'jquery', 'styleswitcher'), '1.1.3.1', true ); // nutze jquery und styleswitcher und lade dann Script greyfoto
	}
}

// auch für WP < version 3.0
global $wp_version;
if ( version_compare($wp_version, "3.0alpha", "<") ) {
	add_action( 'init', 'fb_greyfoto_init' );
} else {
	add_action( 'after_setup_theme', 'fb_greyfoto_init' );
}
</code></pre>
<p>Das obige Beispiel kann man noch ein wenig eleganter lösen und so das Laden der Scripte an WP übergeben; wichtig ist, dass die eigenen Scripte über einen Schlüssel registriert sind und diese Schlüssel gibt man dann nur als Voraussetzung mit.</p>
<pre><code class="php">
function fb_greyfoto_init() {
	if ( !is_admin() ) {
		wp_deregister_script( 'jquery' );
		wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', false, '1.4.2', true ); // lade im Footer - true
		wp_register_script( 'styleswitcher', get_template_directory_uri() . '/js/styleswitcher.jquery.php', array( 'jquery'), '1.3.2', true ); // registrier mein Script mit Schlüssel styleswitcher für das Laden im Footer und Vorraussetzung jquery
		wp_register_script( 'greyfoto', get_template_directory_uri() . '/js/photoblogfb.js', array( 'jquery', 'styleswitcher'), '1.1.3.1', true ); // nutze jquery und styleswitcher und lade dann Script greyfoto
		
		wp_enqueue_script( array('greyfoto') ); // greyfoto braucht styleswitcher und jquery
	}
}

add_action( 'after_setup_theme', 'fb_greyfoto_init' );
</code></pre>
<h4>Script bei spezieller Seite laden</h4>
<p>Manche Scripte braucht man explizit nur auf bestimmten Templates, Seiten oder Beiträgen - dazu sind die <a href="http://bueltge.de/debug-objects-wordpress-plugin/966/">Conditional Tags</a> da; es gilt sie zu nutzen. Hier beginnt Performance-Optimierung. Das folgende Script wird nur beim Template <code>custom-page.php</code> geladen.</p>
<pre><code class="php">
function fb_greyfoto_page_init() {
	if ( !is_page_template( 'custom-page.php' ) )
		return;

	wp_enqueue_script( 'mypagescript', get_template_directory_uri() . '/js/my_script_4_page.js', array('jquery'), '0.1', true );
}
add_action( 'template_redirect', 'fb_greyfoto_page_init' );
</code></pre>
<h4>Die Verwendung des $</h4>
<p>Auch innerhalb der Scripte gibt es einiges zu beachten.<br />
Um mit $ zu arbeiten, wie viele mit jQuery gewohnt sind, muss Jquery aan $ übergeben werden; einfach und schnell passiert und nun kann man wie gewohnt arbeiten. Die Kurzvariante <code>$(function() {} );</code> sollte man sich innerhalb von WordPress angewöhnen.</p>
<pre><code class="javascript">
jQuery(function ($) {
	// hier kann man nun ohne Probleme $ als Referenz auf jQuery nutzen
});
</code></pre>
<p>Um zu prüfen, ob das HTML geladen ist, nutzt man den folgenden Aufruf. So stellt man sicher, dass der DOM geladen ist und man via jQuery das DOM durchsuchen kann und nun die eigentliche Arbeit des Scriptes starten kann. Ein klare Empfehlung also für diese Variante. Die vielen Vorteile möchte ich nicht erklären, dies kann man genau und umfangreich im Beitrag <a href="http://www.learningjquery.com/2006/09/introducing-document-ready">Introducing $(document).ready()</a> nachlesen.</p>
<pre><code class="javascript">
jQuery(document).ready(function ($) {
	$('#id').toggle({
		//paramter für bsp. toggle
	});
});
</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-und-jquery-einige-tipps/1172/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-und-jquery-einige-tipps/1172/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/jquery_logo.gif" />
		<media:content url="http://bueltge.de/wp-content/images/jquery_logo.gif" medium="image">
			<media:title type="html">jQuery 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>Photoblog Theme Greyfoto in neuer Version</title>
		<link>http://bueltge.de/photoblog-theme-greyfoto-in-neuer-version/1175/</link>
		<comments>http://bueltge.de/photoblog-theme-greyfoto-in-neuer-version/1175/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 13:29:54 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1175</guid>
		<description><![CDATA[Das Theme Greyfoto in neuer Version verfügbar - Betatester gesucht!]]></description>
			<content:encoded><![CDATA[<p>Da das <a href="http://bueltge.de/photoblog-theme-greyfoto/837/">Theme Greyfoto</a> eine große Resonanz erfahren hat,  pflege ich es bisher noch. Aktuell habe ich eine neue Version erstellt und in Übersee wurde es bereits bei einigen Anwendern getestet. Auch mit der neuen Version 3.0 von WordPress wird es laufen und es werden einige Funktionen unterstützt.<br />
<span id="more-1175"></span><br />
Auf den ersten Blick werden nur wenige Anwender Unterschiede erkennen, unter der Haube hat sich aber einiges getan und daher wäre ich dankbar, wenn ihr testet und mir eine Rückmeldung gebt. Die neue <strong>Version 2.3.2</strong> ist auf der <a href="http://bueltge.de/photoblog-theme-greyfoto/837/">Seite zum Theme</a> zu bekommen - hinterlasst bitte auch dort eure Hinweise oder direkt via Mail an mich. Ich werde dann versuchen, dass ich es zeitnah bearbeiten kann.</p>
<p><a href="http://bueltge.de/photos/"><img class="centered" src="http://bueltge.de/wp-content/download/wp/themes/greyfoto.jpg" alt="Screenshot Greyfoto" /></a><br />
<cite><a href="http://bueltge.de/photos/">Demo des Photoblog</a></cite><br />
Vielen Dank schon jetzt an die Tester.<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/photoblog-theme-greyfoto-in-neuer-version/1175/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/photoblog-theme-greyfoto-in-neuer-version/1175/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/download/wp/themes/greyfoto.jpg" />
		<media:content url="http://bueltge.de/wp-content/download/wp/themes/greyfoto.jpg" medium="image">
			<media:title type="html">Screenshot Greyfoto</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>Template-Part im WordPress Template laden</title>
		<link>http://bueltge.de/template-part-im-wordpress-template-laden/1157/</link>
		<comments>http://bueltge.de/template-part-im-wordpress-template-laden/1157/#comments</comments>
		<pubDate>Thu, 06 May 2010 09:39:11 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></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=1157</guid>
		<description><![CDATA[Wer sein Theme für WordPress recht flexibel gestaltet wollte und die Modularisierung liebt, der musste bisher immer über den Pfad gehend das Template einbinden. Mit WordPress 3.0 wird dies anders sein und es steht eine Funktion bereit, die das laden von Templates einfach macht.]]></description>
			<content:encoded><![CDATA[<p>Wer sein Theme für WordPress recht flexibel gestalten wollte und die Modularisierung liebt, der musste bisher immer über den Pfad gehend das Template einbinden. Mit WordPress 3.0 wird dies anders möglich sein und es steht eine Funktion bereit, die das laden von Templates einfach macht.<br />
<span id="more-1157"></span></p>
<h4>Am Beispiel verstehen</h4>
<p>Stellen wir uns vor, es soll eine Navigation mehrfach verwendet werden - aber an unterschiedlichen Positionen und an unterschiedlicher Stelle des Markup. Hier würde es also nicht ausreichen, wenn man via CSS das Aussehen beeinflusst. In den meisten Fällen würde man wohl die Navigation in ein eigenes Template auslagern, zum Beispiel die <code>nav.php</code>.  In dieser Datei befindet sich das HTML-Markup und die nötigen Template Tags um eine Navigation zu erstellen. Diese Datei würde man dann inkludieren. Bis WordPress 3.0 wurde das üblicherweise wie folgt getan: <code>include( TEMPLATEPATH . '/navi.php' );</code></p>
<h4>Funktion <code>get_template_part()</code></h4>
<p>Mit WordPress 3.0 soll in diese Form der Modularisierung mehr Bewegung kommen und so kann man mit Hilfe der Funktion <code>get_template_part()</code> Templates ansprechen. Die Funktion erlaubt die Übergabe von zwei Parametern:</p>
<pre><code class="php">
/**
 * @uses locate_template()
 * @since 3.0.0
 * @uses do_action() Calls 'get_template_part{$slug}' action.
 *
 * @param string $slug The slug name for the generic template.
 * @param string $name The name of the specialised template.
 */
get_template_part( $slug, $name = null )
</code></pre>
<p>und besitzt einen Hook <code>get_template_part_$slug</code>, den man ansprechen kann.</p>
<p>Kommen wir nun zurück auf das obige Beispiel der Navigation, die nun mit Hilfe der neuen Funktion wie folgt inkludiert wird: <code>get_template_part( 'navi' );</code>. In diesem Fall wurde lediglich der Parameter <code>slug</code> übergeben - <code>navi</code> - der nun dafür sorgt, dass die <code>navi.php</code> geladen wird.<br />
Im nächsten Schritt soll die Navi, welche explizit für die Sidebar erstellt wurde, genutzt werden. Der Source ist in der <code>navi-sidebar.php</code> gehalten und damit sieht der Aufruf wie folgt aus: <code>get_template_part( 'navi', 'sidebar' );</code>. Der Aufbau der Template-Datei muss also aus <code><em>slug</em>-<em>name</em>.php</code> entstehen.</p>
<p>So lassen sich quasi beliebige Muster erstellen, die vor allem dann an Wert gewinnen, wenn es um Wiederverwendung geht oder wenn man mit Hilfe von Child-Themes arbeitet, da man so auf das Vater-Theme zugreifen kann und doch recht flexibel die eigenen Templates erstellen kann.</p>
<h4>Reihenfolge beim Laden</h4>
<p>WordPress nutzt beim Laden der Templates eine Hierarchie, so dass man auf verschiedene Templates zugreifen kann, ein Beispiel soll es verdeutlichen. Das Vater-Theme befindet sich in <code>wp-content/themes/</code> und benutzt den Ordner <code>wpbasis</code>, das Child-Theme ist im Ordner <code>wpbasischild</code> zu finden. Nun gibt es in einem der Templates den Aufruf <code>&lt;?php get_template_part( 'navi', 'index' ); ?&gt;</code>. Nun wird nach der <code>navi-index.php</code> gesucht mit folgendem Muster:</p>
<ol>
<li><code>wp-content/themes/wpbasischild/navi-index.php</code></li>
<li><code>wp-content/themes/wpbasischild/navi.php</code></li>
<li><code>wp-content/themes/wpbasis/navi-index.php</code></li>
<li><code>wp-content/themes/wpbasis/navi.php</code></li>
</ol>
<p>Auch hier also einige Neuerungen unter der Haube, die für Theme-Autoren recht nützlich sein können. Da in letzter Zeit die Nutzung von Child-Themes gewachsen ist, sicher eine nützliche Funktion.<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/template-part-im-wordpress-template-laden/1157/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/template-part-im-wordpress-template-laden/1157/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>Beiträge pro Kategorie</title>
		<link>http://bueltge.de/beitraege-pro-kategorie/1147/</link>
		<comments>http://bueltge.de/beitraege-pro-kategorie/1147/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 11:21:32 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1147</guid>
		<description><![CDATA[Eine Funktion für die Navigation, die die Beiträge pro Kategorie ausgibt - eine Alternative für statische Seiten.]]></description>
			<content:encoded><![CDATA[<p><img src="http://bueltge.de/wp-content/images/wp/postbycategory.png" alt="Beispiel der Ausgabe" class="alignright" /><br />
WordPress ist in erster Linie ein Blog-Plattform. Nicht selten wird es aber als CMS eingesetzt und dabei spielen nicht nur Seiten eine Rolle, sondern auch Beiträge, da sie mehr Möglichkeiten geben, performanter laufen und im Standard im Feed zu finden sind. Daher nutze ich auch im  Rahmen von WP als CMS oft lieber die Beiträge als die statischen Seiten. Ab und an sind die Wünsche im Rahmen von Navigationen dabei recht ausgefallen und so war bei einem letzten Projekt die Anforderung, liste die Beiträge pro Kategorie zur Kategorie in der Navigation.<br />
Dies ist insofern unüblich, da man auf lange Sicht viele Beiträge hat und die Navigation dann recht unübersichtlich wird - trotzdem hat in dem Fall der Wunsch Sinn gemacht und eine Lösung für die Navi musste her.</p>
<p>Die kleine Funktion listet die Kategorie und darunter die Beiträge. Es gibt einen Parameter, der die Ausgabe der Beiträge einschränkt, so dass es im Extremfall nicht zu viele werden und die letzten Beiträge gelistet werden - <code>$mylimit</code>. Die Übergabe des Wertes <code>-1</code> für diesen Parameter sorgt für das Ausgeben aller Beiträge, alternativ nutzt einen Wert, der die Anzahl bestimmt. Die Funktion selber gehört in die <code>functions.php</code> des Themes oder ein Plugin ausgelagert. Eine beispielhafte Verwendung findet ihr im Anschluss an die Funktion.<br />
<span id="more-1147"></span></p>
<pre><code>
function fb_posts_by_category() {
	global $wpdb, $post;
	
	$mylimit = '-1'; // limit for posts, -1 for all
	$sort_code = 'ORDER BY name ASC, post_date DESC';
	$the_output = '';

	$last_posts = (array)$wpdb-&gt;get_results(&quot;
		SELECT $wpdb-&gt;terms.name, $wpdb-&gt;terms.term_id
		FROM $wpdb-&gt;terms, $wpdb-&gt;term_taxonomy
		WHERE $wpdb-&gt;terms.term_id = $wpdb-&gt;term_taxonomy.term_id
		AND $wpdb-&gt;term_taxonomy.taxonomy = 'category'
		{$hide_check} 
	&quot;);

	if ( empty($last_posts) )
		return NULL;

	$used_cats = array();
	$i = 0;
	foreach ($last_posts as $posts) {
		if ( in_array($posts-&gt;name, $used_cats) ) {
			unset($last_posts[$i]);
		} else {
			$used_cats[] = $posts-&gt;name;
		}
		$i++;
	}
	$last_posts = array_values($last_posts);

	//$the_output .= '&lt;ul&gt;';
	foreach ($last_posts as $posts) {
		$class = 'cat-item cat-item-' . $posts-&gt;term_id;
		$catsy = get_the_category();
		$current_category = $catsy[0]-&gt;cat_ID;
		if ( isset($current_category) &amp;&amp; $current_category &amp;&amp; ($posts-&gt;term_id == $current_category) )
		$class .=  ' current-cat';
		elseif ( isset($_current_category) &amp;&amp; $_current_category &amp;&amp; ($posts-&gt;term_id == $_current_category-&gt;parent) )
		$class .=  ' current-cat-parent';
		
		$the_output .= '&lt;li class=&quot;' . $class . '&quot;&gt;&lt;a class=&quot;category&quot; href=&quot;' . get_category_link($posts-&gt;term_id) . '&quot;&gt;' . apply_filters('list_cats', $posts-&gt;name, $posts) . '&lt;/a&gt;';
		$where = apply_filters('getarchives_where', &quot;WHERE post_type = 'post' AND post_status = 'publish'&quot; , $r );
		
		if ('-1' !== $mylimit)
			$limit = ' LIMIT ' . (int) $mylimit;
		else
			$limit = '';
		
		$arcresults = $wpdb-&gt;get_results(&quot;SELECT ID, post_title  FROM $wpdb-&gt;posts WHERE post_type = 'post' AND post_status = 'publish' AND ID IN (Select object_id FROM $wpdb-&gt;term_relationships, $wpdb-&gt;terms WHERE $wpdb-&gt;term_relationships.term_taxonomy_id =&quot; . $posts-&gt;term_id . &quot;) ORDER BY post_date DESC$limit&quot;);
		if (isset($arcresults) &amp;&amp; $arcresults) {
			$the_output .= '&lt;ul&gt;';
			foreach ( $arcresults as $arcresult ) {
				$class = 'post-item post-item-' . $arcresult-&gt;ID;
				$current_post = get_the_ID();
				if ( isset($current_post) &amp;&amp; $current_post &amp;&amp; is_singular() &amp;&amp; ($arcresult-&gt;ID == $current_post) )
				$class .=  ' current-post';
				
				$the_output .= '&lt;li class=&quot;' . $class . '&quot;&gt;&lt;a class=&quot;post&quot; href=&quot;' . get_permalink($arcresult-&gt;ID) . '&quot;&gt;' . apply_filters('the_title', $arcresult-&gt;post_title) . '&lt;/a&gt;&lt;/li&gt;';
			}
			$the_output .= '&lt;/ul&gt;';
		}
		
		$the_output .= '&lt;/li&gt;';
	}
	//$the_output .= '&lt;/ul&gt;';
	
	echo $the_output;
}
</code></pre>
<h4>Nur bestimmte Kategorien einbeziehen</h4>
<p>Dazu genügt im einfachsten Fall die Ergänzung des SQL-Query, wo man die IDs mitteilt, die durchsucht werden dürfen.</p>
<pre><code class="php">
AND $wpdb->term_taxonomy.term_id IN (3,8,9)
</code></pre>
<p>Alternativ kann man auch Kategorien ausschließen</p>
<pre><code class="php">
AND $wpdb->term_taxonomy.term_id NOT IN (3,8,9)
</code></pre>
<h4>Beispielhafte Verwendung</h4>
<p>Beispielhafte Verwendung in der <code>sidebar.php</code>, die hier mit Markup HTML5 auskommt.<br />
<img class="aligncenter size-large wp-image-1990" title="postbycategory2" src="http://bueltge.de/wp-content/images/wp/postbycategory2-600x196.png" alt="Screenshot des Beispiels" /></p>
<pre><code>
&lt;div id=&quot;sidebar&quot;&gt;
	&lt;nav&gt;
		&lt;h3&gt;Navigation&lt;/h3&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a title=&quot;Startseite aufsuchen&quot; href=&quot;&lt;?php bloginfo('url'); ?&gt;&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
			&lt;?php
			fb_posts_by_category();
			
			wp_list_pages( 'title_li=&amp;sort_column=menu_order&amp;exclude=2,14,49' );
			?&gt;
		&lt;/ul&gt;
	&lt;/nav&gt;
&lt;/div&gt;
</code></pre>
<h4>Accordion Menu ergänzen</h4>
<p>Mit Hilfe von ein wenig JavaScript und dem Framework <a href="http://jquery.com">jQuery</a> kann man dann jeweils nur den Bereich zeigen, der aktiv ist, eine kleines Beispiel dazu, welches die Klassen anspricht und entsprechend die Animation auslößt.</p>
<pre><code class="javascript">
jQuery(document).ready(function($) {
	$(".cat-item ul").hide();
	$(".current-cat ul").show();
 
	$(".page_item ul").hide();
	$(".current_page_parent ul, .current_page_item ul").show();
 
	return false;
});</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/beitraege-pro-kategorie/1147/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/beitraege-pro-kategorie/1147/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/postbycategory.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/postbycategory.png" medium="image">
			<media:title type="html">Beispiel der Ausgabe</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/postbycategory2-600x196.png" medium="image">
			<media:title type="html">postbycategory2</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>Theme Documentation in neuer Version</title>
		<link>http://bueltge.de/theme-documentation-in-neuer-version/1103/</link>
		<comments>http://bueltge.de/theme-documentation-in-neuer-version/1103/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 00:25:37 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1103</guid>
		<description><![CDATA[Mein Theme Documentation gibt es nun in einer neuen Version und unterstützt damit einige neuen Möglichkeiten aus WordPress 2.8 und 2.9. Vieles wurde überarbeitet und die Mehrsprachigkeit ist weiterhin gegeben.]]></description>
			<content:encoded><![CDATA[<p>Ich habe in letzter Zeit diverse Plugins gepflegt, diverse Veränderungen in WordPress 2.9 haben einiges an Zeit erfordert und trotzdem bin ich noch nicht mit allen Plugins durch.</p>
<p>Parallel habe ich aber auch das Theme <a href="http://bueltge.de/documentations-theme-fuer-wordpress/469/">Documentation</a> auf einen neuen Stand gehoben und einige kleine Erweiterungen integriert. Liegt zum einem daran, dass ich das Theme in einigen Bereichen einsetze, wo explizit Neuentwicklungen dokumentiert werden und zum anderen, dass es einige Anfragen per Mail gab. Im Grunde pflege ich keine Themes, der Zeitaufwand ist von mir einfach nicht zu stemmen - in diesem Fall also eine Ausnahme und nun viel Freude mit dem Theme <a href="http://bueltge.de/documentations-theme-fuer-wordpress/469/">Documentation</a>.<br />
<span id="more-1103"></span><br />
Aktuell unterstützt das Plugin einige Funktionen, eine Auswahl:<br />
<img class="alignright" src="http://bueltge.de/wp-content/download/wp/themes/documentation20.png" alt="Documentation Theme für WordPress" /></p>
<ul>
<li>Post-Thumbnails für Beiträge</li>
<li>Übersicht der Post-Thumbnails im Edit-Bereich des Admin</li>
<li>Angepasstes Login-Design</li>
<li>Mehrsprachigkeit vollständig unterstützt, deutsches Sprachfile liegt bei</li>
<li>Kommentarfunktion mit allen Möglichkeiten, die WordPress seit 2.8 mitbringt</li>
<li>Filter der Kommentare in Trackback, Pingback und Kommentare; inkl. Zähler</li>
<li>2 Widget-Bereiche zum Trennen der Ausgabe:
<ol>
<li>Nicht sichtbar auf Seiten und Beiträgen</li>
<li>Nur sichtbar auf Seiten und Beiträgen</li>
</ol>
</li>
<li>Angepasster Title in Abhängigkeit der dargestellten Inhalte</li>
<li>Abfrage <a href="http://wpml.org/">WPML Plugin</a> bei Mehrsprachigkeit im Sidebar</li>
<li>Minimiertes Stylesheet; Arbeitsdatei liegt jeweils bei als <code>...-dev.css</code></li>
</ul>
<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/theme-documentation-in-neuer-version/1103/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/theme-documentation-in-neuer-version/1103/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/download/wp/themes/documentation20.png" />
		<media:content url="http://bueltge.de/wp-content/download/wp/themes/documentation20.png" medium="image">
			<media:title type="html">Documentation Theme für 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>Stylesheet laden, wenn die WordPress Galerie im Beitrag ist</title>
		<link>http://bueltge.de/stylesheet-laden-wenn-wordpress-galerie-beitrag/1090/</link>
		<comments>http://bueltge.de/stylesheet-laden-wenn-wordpress-galerie-beitrag/1090/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 00:06:37 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linktipp]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[StyleSheet]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1090</guid>
		<description><![CDATA[Im Bezug auf die bessere Gallery ist es eigentlich nicht nötig das Stylesheet zu laden, wenn es keine Gallery gibt, insofern ist es also lohnend, wenn man im Vorfeld prüft, ob die Gallery im Beitrag genutzt wird und nur dann das Stylesheet laden. Dazu muss man die Beitrag parsen und das kann man auf zwei Arten tun.]]></description>
			<content:encoded><![CDATA[<p>Im Bezug auf die <a href="http://dynamicinternet.eu/blog/2009-11-06/eine-loesung-fuer-die-wordpress-galerie/">bessere Gallery</a> ist es eigentlich nicht nötig das Stylesheet zu laden, wenn es keine Galerie gibt, insofern ist es also lohnend, wenn man im Vorfeld prüft, ob die Gallery im Beitrag genutzt wird und nur dann das Stylesheet laden. Dazu muss man die Beitrag parsen und das kann man auf zwei Arten tun.<br />
<span id="more-1090"></span><br />
Die klassische Lösung ist den Content in der Ausgabe zu parsen und den Shortcode zu suchen, klassisches PHP <a href="http://de2.php.net/manual/de/function.strstr.php"><code>strstr</code></a>. Je nach Ergebnis wird das Stylesheet geladen.<br />
<code>if ( strstr($post-&gt;post_content, '[gallery') )</code>.<br />
Dies kostet natürlich Zeit und Performance, was man eigentlich meiden möchte. Insofern ist es besser, wenn man den Beitrag im Vorfeld parsen kann. In diesem Zusammenhang gibt es einen <a href="http://wordpress.org/support/topic/350167#post-1344676">Tread im Forum von WordPress</a>, welches genau dazu eine erstklassige Lösung von <a href="http://w-shadow.com/">WhiteShadow</a> hat und diesen Ansatz kann man natürlich auch für das Laden des Stylesheet nutzen, wenn es um die Gallery geht.</p>
<pre><code class="php">
// onyl css, when post has a gallery
function gallery_stylesheet($posts) {
	if ( empty($posts) )
		return $posts;

	$found = false;

	foreach ($posts as $post) {
		if ( stripos($post-&gt;post_content, '[gallery') )
			$found = true;
			break;
		}

	if ($found)
		wp_enqueue_style( 'gallery-stylesheet', get_bloginfo('stylesheet_directory') . '/gallery.css', false, false, 'screen' );

	return $posts;
}
add_action('the_posts', 'gallery_stylesheet');
</code></pre>
<p>Diesen Ansatz kann man natürlich auch nutzen für das Laden von Scripten,</p>
<pre><code class="php">
// onyl js, when post has a gallery
function my_script($posts) {
	if ( empty($posts) )
		return $posts;

	$found = false;

	foreach ($posts as $post) {
		if ( stripos($post-&gt;post_content, '[gallery') )
			$found = true;
			break;
		}

	if ($found)
		wp_enqueue_script( 'my-script', get_bloginfo('stylesheet_directory') . '/script.js', false, false, true );

	return $posts;
}
add_action('the_posts', 'my_script');
</code></pre>
<p>Weitere Hinweise zum Einbinden von JavaScript- und CSS-Dateien gibt es <a href="http://bueltge.de/javascript-bibliotheken-in-und-aus-wordpress-nutzen/808/">in einem anderen Beitrag</a> zum Thema.<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/stylesheet-laden-wenn-wordpress-galerie-beitrag/1090/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/stylesheet-laden-wenn-wordpress-galerie-beitrag/1090/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 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>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>Update Prüfung für Themes entfernen</title>
		<link>http://bueltge.de/update-pruefung-fuer-themes-entfernen/1076/</link>
		<comments>http://bueltge.de/update-pruefung-fuer-themes-entfernen/1076/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 07:09:40 +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[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1076</guid>
		<description><![CDATA[Ich hatte das Thema hier schon mehrfach - der Update-Check von WordPress ist nicht in jedem Fall sinnvoll und kann Last kosten, die man anders gebrauchen kann. Ich klemme je nach Anforderung den Cron ab und via Hook sorge ich dafür, dass das Update auf diverse Themen nicht mehr läuft.]]></description>
			<content:encoded><![CDATA[<p><img  class="alignright" src="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-16.jpg" alt="WP Adventskalender 16" /><br />
Ich hatte das Thema hier schon mehrfach (und in <a href="http://bueltge.de/wordpress-crons-loeschen/1070/">Türchen Nr. 12</a>) - der Update-Check von WordPress ist nicht in jedem Fall sinnvoll und kann Last kosten, die man anders gebrauchen kann. Ich klemme je nach Anforderung den Cron ab und via Hook sorge ich dafür, dass das Update auf diverse Themen nicht mehr läuft.</p>
<p><a href="http://markjaquith.wordpress.com/2009/12/14/excluding-your-plugin-or-theme-from-update-checks/">Mark Jaquith</a> stellt zwei sehr schöne Lösungen vor, wie man in Plugins und Themes als Autor den Update-check abklemmt. Viele Blogs nutzen Themes, welche selbst geschrieben sind, oder welche kein Update erhalten können. Insofern ist vor allem die Lösung für die Themes sehr nützlich.<br />
<span id="more-1076"></span><br />
Sie ist schnell in die <code>functions.php</code> des jeweiligen Themes integriert und so muss man sich nicht mehr in den Einstellungen des Blog darum kümmern. Gerade im Hinblick auf Themes für Kunden, welche sicher kein automatisches Update bekommen, ist diese kleine Funktion ein Mehrwert und gehört daher in die Arbeit aufgenommen.</p>
<pre><code>
function cws_hidden_theme_12345( $r, $url ) {
	if ( false !== strpos( $url, 'http://api.wordpress.org/themes/update-check' ) )
		return $r; // Not a theme update request. Bail immediately.
	
	$themes = unserialize( $r['body']['themes'] );
	unset( $themes[ get_option( 'template' ) ] );
	unset( $themes[ get_option( 'stylesheet' ) ] );
	$r['body']['themes'] = serialize( $themes );
	return $r;
}

add_filter( 'http_request_args', 'cws_hidden_theme_12345', 5, 2 );
</code></pre>
<p><a href="http://markjaquith.wordpress.com/2009/12/14/excluding-your-plugin-or-theme-from-update-checks/">Mark stellt in seinem Beitrag</a> ebenso eine Lösung für Plugins vor, die ich ebenso sinnvoll finde; gerade bei Plugins für explizite Kundenwünsche finde ich das wichtig und so kommt man auch nicht in Kollision, wenn es ein Plugin im SVN gibt/entsteht, was den gleichen Namen trägt.<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/update-pruefung-fuer-themes-entfernen/1076/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/update-pruefung-fuer-themes-entfernen/1076/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-16.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/wp/christmas/wp-christmas-16.jpg" medium="image">
			<media:title type="html">WP Adventskalender 16</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 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>Aktivierung von Themes nutzen</title>
		<link>http://bueltge.de/aktivierung-von-themes-nutzen/1009/</link>
		<comments>http://bueltge.de/aktivierung-von-themes-nutzen/1009/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 20:08:59 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1009</guid>
		<description><![CDATA[Möchte man das Aktivieren des Themes nutzen um diverse Einstellungen zu setzen, dann kann auch folgender Schnipsel sehr nützlich sein, der in der Diskussion der WP Hacker auf kam. Dies klappt wunderbar und sollte für Theme-Entwickler nützlich sein, die Optionen beim Aktivieren schreiben wollen.
]]></description>
			<content:encoded><![CDATA[<p>Das Photoblog-Theme <a href="http://bueltge.de/photoblog-theme-greyfoto/837/">Greyfoto</a> wurde von mir mit einem Update versehen und ich woltle erstmalig sicher gehen, dass die Einstellungen von WordPress so sind, wie ich sie für das Theme brauche. Daher muss also beim Aktivieren einige Daten in der Datenbank geschrieben werden. Aktuell gibt es dafür keinen Hook, wie man das von Plugins her kennt. Die Diskussion in der <a href="http://www.nabble.com/Activation-hook-exist-for-themes--to25211004.html">WP-Hacker-Liste</a> kam da gerade recht und eventuell bekommen Theme-Entwickler diese Hooks, ähnlich wie bei Plugins, dann auch zu Themes, ab WordPress Version 2.9.</p>
<p>Möchte man das Aktivieren des Themes nutzen um diverse Einstellungen zu setzen, dann kann auch folgender Schnipsel sehr nützlich sein, der in der Diskussion der WP Hacker auf kam. Dies klappt wunderbar und sollte für Theme-Entwickler nützlich sein, die Optionen beim Aktivieren schreiben wollen.<br />
<span id="more-1009"></span><br />
Hier ein kleines Beispiel, in dem die Standard-Einstellung <code>posts_per_page</code> von WordPress in der Tabelle <code>options</code> neu auf den Wert 1 gesetzt wird.</p>
<pre><code>
// with activate istall option
if ( is_admin() &#038;& isset($_GET['activated'] ) &#038;& $pagenow == 'themes.php' ) {
	update_option( 'posts_per_page', 1 );
}
</code></pre>
<p>Seit WordPress Version 2.9 gibt es explizit dafür die Funktion <code>register_theme_directory()</code>.<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/aktivierung-von-themes-nutzen/1009/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/aktivierung-von-themes-nutzen/1009/feed/</wfw:commentRss>
		<slash:comments>8</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 Standard Widgets deaktivieren</title>
		<link>http://bueltge.de/wordpress-standard-widgets-deaktivieren/1005/</link>
		<comments>http://bueltge.de/wordpress-standard-widgets-deaktivieren/1005/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 21:34: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[Entwicklung]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP2.8]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1005</guid>
		<description><![CDATA[Nicht immer möchte man alle Widgets, die der WordPress Core so mitbringt, im Theme aktiv haben. Das haben sich auch die Entwickler von WordPress gedacht und eine entsprechende Funktion mitgeliefert anstatt die Widgets in ein Plugin, gern auch als Core Plugin, ausgelagert.

Für Theme-Autoren bleibt nur der Weg, in die <code>functions.php</code> des Themes eine kleine Funktion abzulegen, die die Widgets, welche man nicht mag, deaktiviert. Der folgende Syntax schaltet alle Standard-Widgets ab. Er sollte daher angepasst werden, je nach Anforderung.]]></description>
			<content:encoded><![CDATA[<p>Nicht immer möchte man alle Widgets, die der WordPress Core so mitbringt, im Theme aktiv haben. Das haben sich auch die Entwickler von WordPress gedacht und eine entsprechende Funktion mitgeliefert anstatt die Widgets in ein Plugin, gern auch als Core Plugin, ausgelagert.</p>
<p>Für Theme-Autoren bleibt nur der Weg, in die <code>functions.php</code> des Themes eine kleine Funktion abzulegen, die die Widgets, welche man nicht mag, deaktiviert. Der folgende Syntax schaltet alle Standard-Widgets ab. Er sollte daher angepasst werden, je nach Anforderung.<br />
<span id="more-1005"></span></p>
<pre><code>
// unregister all default WP Widgets
function unregister_default_wp_widgets() {

	unregister_widget('WP_Widget_Pages');

	unregister_widget('WP_Widget_Calendar');

	unregister_widget('WP_Widget_Archives');

	unregister_widget('WP_Widget_Links');

	unregister_widget('WP_Widget_Meta');

	unregister_widget('WP_Widget_Search');

	unregister_widget('WP_Widget_Text');

	unregister_widget('WP_Widget_Categories');

	unregister_widget('WP_Widget_Recent_Posts');

	unregister_widget('WP_Widget_Recent_Comments');

	unregister_widget('WP_Widget_RSS');

	unregister_widget('WP_Widget_Tag_Cloud');
}

add_action('widgets_init', 'unregister_default_wp_widgets', 1);
</code></pre>
<p>Die Funktion <code>unregister_widget()</code> benötigt als Parameter die Übergabe der Klasse, damit ist der Code hier nur ab Version 2.8 nutzbar, im Vorfeld wurden Widgets anders unterstützt.</p>
<p>Wie man eigene Widgets ab WordPress Version 2.8 erstellt, kann man beispielsweise im Beitrag <a href="http://dynamicinternet.eu/blog/2009-03-31/wordpress-28-widget-erstellen/">WordPress 2.8 Widget erstellen</a> von Micha nachlesen.<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-standard-widgets-deaktivieren/1005/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-standard-widgets-deaktivieren/1005/feed/</wfw:commentRss>
		<slash:comments>19</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 in (x)HTML5</title>
		<link>http://bueltge.de/wp-basis-theme-in-xhtml5/984/</link>
		<comments>http://bueltge.de/wp-basis-theme-in-xhtml5/984/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 13:18:48 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CSS, xHTML, JS]]></category>
		<category><![CDATA[Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[StyleSheet]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP2.7]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=984</guid>
		<description><![CDATA[Ich möchte die Kosten, die dieses Blog und die kleinen Nebenprodukte verursachen gern deckeln, so dass ich keinen Aufwand in die finanziellen Kosten des Webspace stecke, sondern in die Inhalte. Daher wird es also ab jetzt die Möglichkeit geben, eine Fläche zu mieten.]]></description>
			<content:encoded><![CDATA[<p><img class="alignrightob" src="http://wpbasis.de/images/wpbasis_logo.png" alt="Logo WP Basis Theme" /><br />
Das <a href="http://wpbasis.de/">WP Basis Theme</a> erfreut sich großer Beliebtheit und die Arbeit daran wird von diversen Leuten unterstützt, sei es mit Übersetzungsarbeit, Fehlerkorrekturen, Verbesserungsvorschlägen oder Tests. Daher auch hier nochmal Danke an alle Helfer!</p>
<p>Da sich HTML5 aber schon geraume Zeit auf meiner ToDo-Liste befindet und ich ein Thema benötige um zu starten, habe ich begonnen das Basis Theme in HTML5 zu bauen, so dass WordPress direkt damit arbeiten kann. Dabei habe ich auch gleich ein Beispiel-Stylesheet beigelegt, so dass es ein Design gibt.<br />
<span id="more-984"></span><br />
Zusätzlich gibt es eine kleines Stylesheet, welches die neuen Bereiche und ihre Tags darstellt, so dass man bei einem Einstieg in HTML5 ein wenig visueller arbeiten kann. Das Stylesheet ist nicht im Code verdrahtet und kann zum Beispiel einfach und unkompliziert mit Hilfe des WebDeveloper-Toolbar hinzugefügt werden. Zu finden ist das Stylesheet in der Struktur unter <code>layout/html5areas/html5areas.css</code>. Ein Beitrag ist damit wie folgt ersichtlich.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wpbasis-html5/html5areas.png" alt="HTML5 visuell dargestellt" /></p>
<p>Diverse Punkte sind aktuell nur im Opera > 9.5 sichtbar. Dazu zählen alle Inhalte des Kommentar-Formulars. Dort wurde unter anderem Pflichtfelder übergeben, wenn sie durch WordPress gesetzt werden und die <code>type</code>-Attribute haben der Aufgabe bezogen ihren Wert erhalten, daher die Image-Zuordnung im Opera.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wpbasis-html5/form-opera.png" alt="Kommentarformular in Opera 9.6" /></p>
<h3>Arbeit mit...</h3>
<p>Als Nachschlagewerk dient mit die Übersicht des w3c und das Blog zum Thema HTML5. Leider ist die Arbeit beim Validieren aktuell nicht so einfach, da mir kein Validator bekannt ist, der lokal validieren kann. Über Tipps würde ich mich daher freuen. Für den IE liefere ich ein Script mit, welches ihm den Umgang mit diversen Elementen beibringt.</p>
<ul>
<li><a href="http://dev.w3.org/html5/spec/Overview.html">HTML 5</a></li>
<li><a href="http://html5doctor.com/">html5doctor</a></li>
<li><a href="http://html5.validator.nu/">HTML5 Validator</a></li>
<li><a href="http://remysharp.com/2009/01/07/html5-enabling-script/">HTML5 enabling script</a></li>
</ul>
<h3>Warum das alles?</h3>
<p>Ich würde mir wünschen, dass der eine oder andere mal drüber schaut, vielleicht Leute, die schon mehr mit HTML5 gearbeitet haben und tief in der Materie stecken. Rückmeldungen wären toll und vielleicht erweitert der eine oder andere das Theme um bestimmte Tags oder Elemente.</p>
<h3>Wie komme ich daran?</h3>
<p>Es gibt hier keinen Download und die Arbeit daran wird in der freien Zeit weiter gehen und daher wird es immer wieder Veränderungen geben. Aktuell stehen nur wenige Grundzüge und es soll den gleichen Stand wie das WP Basis Theme bekommen. Um sich in das Theme einzuarbeiten oder einfach mal drüber zu schauen steht ein <a href="http://code.google.com/p/wp-basis-theme/source/browse/#svn/tags/html5">Repository</a> bereit. Dort kann auch Kommentiert und diskutiert werden.</p>
<p>Der Ordner mit allen Inhalten findet sich im Bereich <a href="http://code.google.com/p/wp-basis-theme/source/browse/#svn/trunk/basis-html5">trunk/basis-html5</a> des <a href="http://code.google.com/p/wp-basis-theme/source/browse/#svn">SVN</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/wp-basis-theme-in-xhtml5/984/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wp-basis-theme-in-xhtml5/984/feed/</wfw:commentRss>
		<slash:comments>8</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">Logo WP Basis Theme</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wpbasis-html5/html5areas.png" medium="image">
			<media:title type="html">HTML5 visuell dargestellt</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wpbasis-html5/form-opera.png" medium="image">
			<media:title type="html">Kommentarformular in Opera 9.6</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 head erleichtern</title>
		<link>http://bueltge.de/wordpress-head-erleichtern/968/</link>
		<comments>http://bueltge.de/wordpress-head-erleichtern/968/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 23:36:25 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=968</guid>
		<description><![CDATA[WordPress bringt seit Version 2.5 stetig neue Standard Funktionen in den head des Themes ein, immer über den Hook <code>wp_head</code>. Auch mit WordPress 2.8 wurden neue Funktion ergänzt, die vorrangig den Link-Tag bedienen. Nicht immer ist das aber gewollt und daher können die Funktionen auch deaktiviert werden, schlicht und einfach mit Hilfe der Funktion <code>remove_action</code>.]]></description>
			<content:encoded><![CDATA[<p>WordPress bringt seit Version 2.5 stetig neue Standard Funktionen in den head des Themes ein, immer über den Hook <code>wp_head</code>. Auch mit WordPress 2.8 wurden neue Funktion ergänzt, die vorrangig den Link-Tag bedienen. Nicht immer ist das aber gewollt und daher können die Funktionen auch deaktiviert werden, schlicht und einfach mit Hilfe der Funktion <code>remove_action</code>.<br />
<span id="more-968"></span></p>
<h3>Funktion <code>remove_action</code></h3>
<p><code>remove_action( $tag, $function_to_add, $priority, $accepted_args );</code></p>
<blockquote><p>This function removes a function attached to a specified action hook. This method can be used to remove default functions attached to a specific action hook and possibly replace them with a substitute.</p>
<p><strong>Important:</strong> To remove a hook, the <code>$function_to_remove</code> and <code>$priority</code> arguments must match when the hook was added. This goes for both filters and actions. No warning will be given on removal failure.<br />
<cite>via: <a href="http://codex.wordpress.org/Function_Reference/remove_action">WP Codex</a></cite></p></blockquote>
<p>Die folgenden Syntax zeigt einen Auszug, der nur einen Teil der Ausgabe zeigt, die man im Theme aktiv haben kann. Sie resultieren aus den Standard Funktion, die in den head des Themes geladen werden. Erkennbar, in dem man in der Datei <code>wp-includes/default-filters.php</code> nach dem Hook <code>wp_head</code> sucht. Nicht alle Filter sollte man deaktivieren, da sie in den meisten Fällen sinnvoll sind. Aber WordPress ist nicht nur in klassischen Blogscenarios im Einsatz und daher bietet es sich, wenn man zumindest die Lösung kennt. Diese ist dann im zweiten Syntax-Feld zu erkennnen.</p>
<pre><code class="php">
&lt;link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://bueltge.de/xmlrpc.php?rsd" /&gt;
&lt;link rel='index' title='bueltge.de [by:ltge.de]' href='http://bueltge.de' /&gt;
&lt;link rel='start' title='WP - Datenbank sichern' href='http://bueltge.de/datenbank-sichern/9/' /&gt;
&lt;link rel='prev' title='WordPress Konstanten nutzen' href='http://bueltge.de/wordpress-konstanten-nutzen/962/' /&gt;
</code></pre>
<p>Hier werden nun diverse Funktion deaktiviert, beispielhaft und nicht als Empfehlung. Untersucht euren Head und schaltet ab, was ihr nicht benötigt. Weniger Markup freut nicht nur die Ladezeit.</p>
<pre><code class="php">
remove_action( 'wp_head', 'feed_links_extra', 3 ); // Display the links to the extra feeds such as category feeds
remove_action( 'wp_head', 'feed_links', 2 ); // Display the links to the general feeds: Post and Comment Feed
remove_action( 'wp_head', 'rsd_link' ); // Display the link to the Really Simple Discovery service endpoint, EditURI link
remove_action( 'wp_head', 'wlwmanifest_link' ); // Display the link to the Windows Live Writer manifest file.
remove_action( 'wp_head', 'index_rel_link'); // index link
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); // prev link
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); // start link
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ); // Display relational links for the posts adjacent to the current post.
remove_action(  'wp_head', 'wp_generator' ); // Display the XHTML generator that is generated on the wp_head hook, WP version
</code></pre>
<p>Als Hinweis, wer noch nicht mit eigenen Funktionen im Theme gearbeitet hat: Zugriffe auf Hooks werden durch die Pluginschnittstelle realisiert oder in der <code>functions.php</code> des Themes abgelegt. Sollte es die Datei nicht geben, dann einfach anlegen und im Theme ablegen, WordPress erkennt die Datei und inkludiert die Funktionen.</p>
<h5>Ergänzung</h5>
<p>Mit WordPress 3.0 gibt es einen Filter, der dafür sorgt, dass das P in WordPress immer groß geschrieben wird; muss man aus meiner Sicht nicht haben, kostet nur unnötig Last. Daher entfernt man auch diesen Filter, der auf drei Hooks geht.</p>
<pre><code class="php">
// Remove Format WordPress 
foreach ( array( 'the_content', 'the_title', 'comment_text' ) as $filter ) { 
	remove_filter( $filter, 'capital_P_dangit' ); 
}
</code></pre>
<p>Mit 3.0 wurde auch der Filter für relational links umgestellt, daher der folgende Code, der beide Filter beachtet, je nach WordPress version.</p>
<pre><code class="php">
if ( !remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ) )
    remove_action ('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
</code></pre>
<p><cite>Ergänzt von <a href="http://lloc.de/noch-mehr-zu-wordpress-themes-optimieren.html">realloc</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/wordpress-head-erleichtern/968/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-head-erleichtern/968/feed/</wfw:commentRss>
		<slash:comments>42</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>

