<?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/"
	>

<channel>
	<title>Der Interaktionsdesigner - PHP, jQuery und CSS &#187; WordPress</title>
	<atom:link href="http://www.interaktionsdesigner.de/category/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.interaktionsdesigner.de</link>
	<description>Webentwicklung mit TYPO3, jQuery, CakePHP und Spaß an neuen Projekten</description>
	<lastBuildDate>Wed, 07 Dec 2011 14:26:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Wie ein Entwickler einen WordPress Blog aufsetzt</title>
		<link>http://www.interaktionsdesigner.de/2010/10/02/wie-ein-entwickler-einen-wordpress-blog-aufsetzt/</link>
		<comments>http://www.interaktionsdesigner.de/2010/10/02/wie-ein-entwickler-einen-wordpress-blog-aufsetzt/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 17:32:19 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=721</guid>
		<description><![CDATA[Wenn der Kunde einen Blog möchte, denkt der Entwickler nach: "ich schreibe das coolste Blogsystem allerzeiten", in der Regel sofort an WordPress. Der Platzhirsch unter den Blogsystemen. Leider habe ich im Moment auch nicht genügend Zeit das coolste Blogsystem allerzeiten selbst zu programmieren, deshalb greife ich auf WordPress zurück. Wie man von einem leeren Ordner [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/10/Bildschirmfoto-2010-08-31-um-17.41.29.png"><img class="alignright size-full wp-image-728" title="WordPress für Entwickler" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/10/Bildschirmfoto-2010-08-31-um-17.41.29.png" alt="WordPress für Entwickler" width="170" height="123" /></a>Wenn der Kunde einen Blog möchte, denkt der Entwickler nach: "ich schreibe das coolste Blogsystem allerzeiten", in der Regel sofort an <strong>WordPress</strong>. Der Platzhirsch unter den Blogsystemen.</p>
<p>Leider habe ich im Moment auch nicht genügend Zeit das coolste Blogsystem allerzeiten selbst zu programmieren, deshalb greife ich auf WordPress zurück. Wie man von einem leeren Ordner zu einem funktionierenden System mit <strong>eigenem Theme</strong> kommt ist der Inhalt dieses Eintrags.</p>
<p><span id="more-721"></span></p>
<h2>Dateien beschaffen</h2>
<p>Los gehts mit einer ganzen Reihe downloads. Entweder man hat einen Ressourcenordner auf dem Rechner in dem das drin liegt oder man holt es sich aus dem Netz. Als erstes natürlich <a title="WordPress" href="http://wordpress.org/" target="_blank">WordPress</a> und um im eigenen Theme eine vernünftige Aufteilung zu ermöglichen das <a title="960gs" href="http://www.960.gs" target="_blank">960 GridSystem</a>.</p>
<p>Da man schon das ganze System nicht selbst schreibt, kann man sich auch bei den Grundlagen des Themes die Arbeit abnehmen lassen und ein <a href="http://speckyboy.com/2010/03/22/10-blanknaked-wordpress-themes-perfect-for-development/" target="_blank">Naked Theme</a> benutzen. Ich nehme <a href="http://simonwebdesign.com/simon-wordpress-framework-blank-theme/" target="_blank">Simons Blank Theme</a>, da es schon <strong>960.gs</strong> und <strong>Featured Posts</strong> implementiert hat.</p>
<h2>Installation</h2>
<p>WordPress ist ein bisschen zickig wenn sich die <strong>Baseurl</strong> ändert. Deshalb macht es Sinn schon unter der finalen Domain zu entwickeln. In den meisten Fällen gehts aber lokal los, also Ordner anlegen, Datenbank erstellen und das WordPress Archiv in den Ordner entpacken.</p>
<p>Der Ordner <strong>wp-content/uploads/</strong> muss, sofern nicht vorhanden, angelegt werden und für den Webserver beschreibbar sein.</p>
<p>Das ausgewählte Theme kommt in den Ordner <strong>wp-content/themes/</strong>. Anschließend die WordPress <strong>index.php</strong> aufrufen und der Installation folgen.</p>
<h2>Einrichten</h2>
<p>Die Datenbanken und notwendigen Ordner hat sich WordPress schon selbst zurecht gelegt. Als erstes sollte man prüfen ob schon Updates verfügbar sind (in meinem Fall Akismet). Entweder über WordPress automatisch installieren lassen (dem vertraue ich nicht so recht), oder von der Downloadseite ziehen, entpacken und in den Ordner <strong>wp-content/plugins/</strong> legen.</p>
<p>Im Frontend sieht man jetzt das nette Standardtheme, das auch schon eine Menge kann. Aber wir haben ja ein eigenes Layout das es umzusetzen gilt. Also im Backend unter <strong>Design / Themes</strong> aktivieren.</p>
<h2>Mein Theme</h2>
<p>Alle Daten die man als Themeentwickler verändern darf liegen im Ordner <strong>wp-content/themes/themename</strong>. Den Ordnernamen sollte man nach eigenen Wünschen benennen und anschließend die Datei <strong>style.css</strong> öffnen. Im Kommentar am Seitenanfang kann man den Themenamen, Version, URL und Autor festlegen.</p>
<pre>/*
Theme Name: Apeversity
Theme URI: http://www.apeunit.com
Description: Ape Unit Videotheme
Author: Paul Lunow
Author URI: http://www.paul-lunow.de
Version: 1.0
*/</pre>
<p>Jetzt fängt das schöne entwickeln an. Die <strong>header.php</strong> ist ein guter Einstiegspunkt. Eine WordPressseite wird immer aus verschiedenen Teilen zusammengebaut. Es geht los mit dem Header, dann kommt der eigentliche Inhalt, die Sidebar und dann der Footer.</p>
<p>Die Startseite wird in der <strong>index.php</strong> generiert. Hier gibt es ein WordPress Tag um den Header einzubinden:</p>
<pre>&lt;?php get_header(); ?&gt;</pre>
<p>Eine großartige Funktion ist <strong>bloginfo()</strong>. Damit erfährt man jede Menge über die Installation und die Pfade. Will man die Werte im Script weiter verarbeiten, holt man sich die Infos mit <strong>get_bloginfo()</strong>.</p>
<p>Um zum Beispiel eine JavaScript Datei aus dem Themeordner einzubinden nutzt man folgendes Tag:</p>
<pre>&lt;script type="text/javascript" src="&lt;? bloginfo('template_directory'); ?&gt;/action.js"&gt;&lt;/script&gt;</pre>
<p>Aber Halt: nicht auf die Idee kommen eine Kopie von jQuery herunterzuladen und wie oben beschrieben einzubinden. jQuery kommt schon als Standard Framework mit und muss über die <strong>functions.php</strong> nur freigeschaltet werden:</p>
<pre>wp_enqueue_script("jquery");</pre>
<p>Die <strong>functions.php</strong> wird bei jedem Seitenaufruf eingebunden und ist ein idealer Platz für eigene Funktionen, Abkürzungen und Konfiguration.</p>
<p>Im Idealfall hat das leere Theme schon ein paar praktische CSS Regeln dabei. Damit man nicht anfängt etwas doppelt zu schreiben, klickt man mit <strong>Firebug</strong> das zu stylende Element an und schaut ob es schon eine Regel dafür in den CSS Dateien gibt.</p>
<p>An dieser Stelle sollte man nicht davor zurück schrecken <strong>tiefgreifende Veränderungen und Restrukturierungen</strong> durchzuführen um das CSS den eigenen Bedürfnissen anzupassen. Alles löschen was einem nicht gefällt und bloß nicht anfangen mit <strong>important!</strong> oder anderen Mitteln eine zweite CSS Struktur zu erstellen.</p>
<p>Falls noch nicht geschehen sollte man sich jetzt die Tastenkombination in der bevorzugten Entwicklungsumgebung einprägen, um zu einer bestimmten Zeile zu springen. Für Coda ist es [CMD]+[UMSCHALT]+[L] in Eclipse [CMD]+[L].</p>
<h2>Custom Menu</h2>
<p>Mit <strong>WordPress 3</strong> gibt es ein paar coole Neuerungen die man im eigenen Theme aufjedenfall benutzen möchte. Eins davon sind die eigenen Menüs. Das funktioniert so:</p>
<p>Im Theme (in der <strong>functions.php</strong>) sagt man WordPress, dass man Menüs unterstützt. Man kann verschiedene Menüs definieren (z.B. Header, Footer und Sidebar). Der Benutzer kann diese Platzhalter im Backend mit Seiten, Posts, Kategorien und Links bestücken.</p>
<p>Dem Theme teilt man das wiefolgt mit:</p>
<pre>function register_my_menus() {
&nbsp;&nbsp;register_nav_menus(array(
&nbsp;&nbsp;'header-menu' =&gt; __( 'Header Menu' )
&nbsp;&nbsp;));
}
add_action('init', 'register_my_menus');</pre>
<p>Im Backend unter <strong>Design / Menüs</strong> kann man jetzt ein eigenes Menü erstellen, bestücken und dem Marker <strong>header-menu</strong> zuweisen.</p>
<p>Ausgegeben wird das Menü über die Funktion <a href="http://codex.wordpress.org/Function_Reference/wp_nav_menu" target="_blank">wp_nav_menu</a>. So sieht es aus:</p>
<pre>&lt;?php wp_nav_menu( array('menu' =&gt; 'header-menu' ) ); ?&gt;</pre>
<p>Um die <strong>Startseite</strong> im Menü ebenfalls erreichbar zu machen, muss man meiner Meinung nach den Link zur Baseurl als Link Element hinzufügen. Das ist allerdings nicht besonders prickelnd, vorallem nicht wenn sich die Baseurl ändert.</p>
<h2>Post Thumbnails</h2>
<p>Post Thumbnails erlauben es dem Redakteur für ein Post ein Bild zu definieren, welches dann bei der Ausgabe beliebig verwendet werden kann.</p>
<p>Das gute an denen, im Gegensatz zu einem "Benutzerdefinierten Feld", ist die Möglichkeit zur <strong>Bildbearbeitung</strong>. Außerdem kümmert sich WordPress um die Bereitstellung und <strong>Validierung</strong>.</p>
<p>Um Post Thumbnails zu benutzen, muss man sie über die <strong>functions.php</strong> aktivieren:</p>
<pre>add_theme_support('post-thumbnails');
set_post_thumbnail_size(215, 150, true);</pre>
<p>Anschließend steht in der rechten Seitenleiste beim <strong>Artikel schreiben</strong> ein entsprechendes Feld zur Verfügung.</p>
<p>Für die Ausgabe gibt es zwei Methoden. Die erste überprüft ob ein Post Thumbnail vorhanden ist:</p>
<pre>has_post_thumbnail();</pre>
<p>Mit der zweiten Funktion wird das Thumbnail direkt ausgegeben:</p>
<pre>the_post_thumbnail();</pre>
<p>Mit einem vorrausgestellten <strong>get_</strong> kriegt man den HTML Code zur weiteren Verarbeitung zurück. In einem strangen Fall brauchte ich allerdings nur die <strong>URL des Post Thumbnails</strong>. Gelöst habe ich es über XML:</p>
<pre>$s = simplexml_load_string(get_the_post_thumbnail());
echo $s-&gt;attributes()-&gt;src;</pre>
<h2>Benutzerdefinierte Felder</h2>
<p>Das Post Thumbnail ist schon ausgegliedert. Trotzdem ist es sehr praktisch wenn man zu jedem Post individuell verschiedene Eigenschaften angeben kann.</p>
<p>Im Backend passiert das über die "Benutzerdefinierten Felder". Im Theme werden die Inhalte über die Funktion <strong>get_post_custom_values() </strong>ausgelesen. Die Funktion gibt die Daten allerdings in einem etwas unübersichtlichen Array zurück.</p>
<p>Deshalb ab in die <strong>functions.php</strong> und dort eine neue Funktion <strong>custom_field()</strong> erstellen:</p>
<pre>function custom_field($name) {
&nbsp;&nbsp;$value = @array_pop(get_post_custom_values($name));
&nbsp;&nbsp;if(empty($value)) {
&nbsp;&nbsp;return false;
&nbsp;&nbsp;}
&nbsp;&nbsp;return $value;
}</pre>
<p>Im Theme, innerhalb der Artikelausgeben (<strong>The Loop</strong>), kann man jetzt einfach den Namen des Feldes eingeben und erhält den Inhalt:</p>
<pre>&lt;h3&gt;&lt;? echo custom_field('subheader'); ?&gt;&lt;/h3&gt;</pre>
<h2>Custom Queries</h2>
<p>Bei umfangreichen Projekten kommt man schnell in die Situation nur Posts, die bestimmten Kriterien erfüllen auszugeben. Kein Problem!</p>
<p>Dafür steht in WordPress die Klasse <strong>WP_Query</strong> zur Verfügung. Von dieser erzeugt man ein neues Objekt und übergibt ein Array mit <a href="http://codex.wordpress.org/Function_Reference/query_posts" target="_blank">Einstellungen</a>.</p>
<pre>$my_query = new WP_Query(array('category_name' =&gt; 'featured', 'posts_per_page' =&gt; 1));</pre>
<p>Im Objekt <strong>$my_query</strong> ist jetzt der letzte Post mit der Kategorie <strong>featured</strong> gespeichert. An die Posts kommt man, in dem man die berühmte Loop erstellt:</p>
<pre>while($my_query-&gt;have_posts()):
&nbsp;&nbsp;$my_query-&gt;the_post();
&nbsp;&nbsp;&lt;div class="post"&gt;&lt;? the_title(); ?&gt;&lt;/div&gt;
endwhile;</pre>
<p>Innerhalb der While Schleife stehen einem jetzt alle <a href="http://codex.wordpress.org/Template_Tags" target="_blank">gewohnten Funktionen</a> zur Verfügung. Auf die Daten zugreifen können sie aufgrund von dem Aufruf <strong>the_post()</strong>.</p>
<p>Besonders habe ich mich gerade über die Möglichkeit gefreut die Posts nach einem bestimmten <strong>benutzerdefinierten Feld</strong> zu sortieren:</p>
<pre>$my_query = new WP_Query(array(
&nbsp;&nbsp;'orderby' =&gt; 'meta_value',
&nbsp;&nbsp;'meta_key' =&gt; 'episode',
&nbsp;&nbsp;'order' =&gt; 'ASC'
));</pre>
<h2>Social Media und Plugins</h2>
<p>Wer will schon alleine auf seinem Blog sein? Damit man selbst und alle Besucher sehen wieviele <strong>Fans und Freunde</strong> man hat, braucht man je nach Anforderung verschiedene Buttons und Funktionen.</p>
<p>Das meiste gibt es schon als fertiges Plugin. Eine gute Übersicht gibt es zum Beispiel bei <a href="http://www.elmastudio.de/wordpress/18-der-angesagtesten-social-media-plugins-fur-deinen-wordpress-blog/" target="_blank">Ellen</a>. Für mich ist bei der Auswahl immer wichtig, dass es eine Funktion gibt, mit deren Hilfe man die Funktionalität an beliebiger stelle im eigenen Theme einbauen kann.</p>
<p>Man lädt eine <strong>ZIP Datei</strong> herunter, entpackt sie auf dem eigenen Rechner und schiebt den kompletten Ordner in das Verzeichnis <strong>wp-content/plugins/</strong>. Anschließend im Backend unter Plugins den neuen Eintrag in der Liste aktivieren.</p>
<p>Der <a href="http://wordpress.org/extend/plugins/facebook-share-new/screenshots/" target="_blank">Facebook Share Button</a> ist sehr komfortabel. Nach Installation des Plugins findet man im linken Menü ganz unten eine Optionsseite mit Einstellungsmöglichkeiten. Im Theme bindet man an geeigneter Stelle innerhalb des Loops das entsprechende Tag ein:</p>
<pre>&lt;?php echo fb_generate_button(); ?&gt;</pre>
<p>Welches Tag das ist findet man heraus in dem man die <strong>PHP Dateien im Plugin Ordner</strong> ansieht. Meistens gibt es nur eine in der alles mögliche zusammen gefasst ist. Je nach Entwickler besser oder schlechter gemacht und dokumentiert.</p>
<p>Facebook steht, als nächstes kommt <strong>Twitter</strong>. Diesmal kommt das Plugin <a href="http://wordpress.org/extend/plugins/topsy/" target="_blank">Topsy</a> zum Einsatz. Die Einstellungen verstecken sich nach der Installation unter <strong>Einstellungen / Topsy</strong>. Für das Theme stehen zwei Tags zur Verfügung:</p>
<pre>&lt;?php echo topsy_retweet_small(); ?&gt;
&lt;?php echo topsy_retweet_big(); ?&gt;</pre>
<p>Viel Spaß beim einbinden!</p>
<h2>Fazit</h2>
<p>WordPress ist ein tolles System um die unterschiedlichsten Anforderungen zu erfüllen. Allerdings sieht man auch das sich nach einiger Zeit ein ziemliches Chaos entwickelt. Vorallem wenn mehrere Leute ohne genau definierte Regeln an einem Projekt arbeiten.</p>
<p>Aber es geht schnell und macht Spaß. Unsere <a href="http://www.apeunit.com">Firmenseite</a> ist ebenfalls in WordPress realisiert. Ich bin gespannt auf eure Verbesserungsvorschläge.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/10/02/wie-ein-entwickler-einen-wordpress-blog-aufsetzt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asynchron Inhalte in WordPress nachladen</title>
		<link>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/</link>
		<comments>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/#comments</comments>
		<pubDate>Thu, 06 May 2010 09:53:39 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=674</guid>
		<description><![CDATA[Neben der Gründung einer neuen Firma die sich um Webentwicklungsthemen und Medienproduktion kümmert (Die Ape Unit GmbH Berlin) hatte ich eine Menge mit WordPress zu tun. Ein guter Grund hier mal wieder etwas Leben in den Blog zu bringen. Es geht natürlich um den heißen Scheiß: Ajax. Mit aktiviertem JavaScript soll bei einem Klick auf [...]]]></description>
			<content:encoded><![CDATA[<p>Neben der Gründung einer neuen Firma die sich um Webentwicklungsthemen und Medienproduktion kümmert (<a title="Webentwicklung und Medienproduktion" href="http://www.apeunit.com" target="_blank">Die Ape Unit GmbH Berlin</a>) hatte ich eine Menge mit <strong>WordPress</strong> zu tun. Ein guter Grund hier mal wieder etwas Leben in den Blog zu bringen.</p>
<p>Es geht natürlich um den heißen Scheiß: <strong>Ajax</strong>. Mit aktiviertem JavaScript soll bei einem Klick auf einen Eintrag der <strong>Eintrag dynamisch nachgeladen</strong> werden anstatt auf die Einzelansicht zu verlinken. Mit <strong>TYPO3</strong> und Typoscript baut man sich dafür ein weiteres <strong>Page Objekt</strong> und passt die Ausgabe an, <a title="Ajax und TYPO3" href="http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/" target="_self">darüber hatte ich schon berichtet</a>. Bei WordPress gibt es aber kein Typoscript.</p>
<p>Mein erster Gedanke war ein alternatives Template per URL Parameter zu laden in dem nur die Inhalte angezeigt werden. Die Anleitungen waren allerdings allesamt nicht besonders ergiebig. Der nächste Ansatz war den gesamten Inhalt abzufragen und per jQuery nur den entsprechenden Container mit den Inhalten auszugeben. Das finde ich aber irgendwie unelegant.</p>
<p>Und nach einmal drüber schlafen kam dann der rettende und <strong>sehr simple Einfall</strong>.</p>
<p><span id="more-674"></span></p>
<h2>functions.php</h2>
<p>Mit meinem <a title="Mein Lieblingsframework" href="http://www.cakephp.org" target="_blank">CakePHP</a> verwöhntem Blick würde ich die functions.php mal mit einer Art <strong>Controller</strong> vergleichen. Der Aufruf geht also durch diese Datei, in der Variablen gesetzt und Funktionen definiert werden können, die anschließend in den Views zur Verfügung stehen.</p>
<p>Und hier steckt schon das ganze Geheimnis, ist die Servervariable <strong>HTTP_X_REQUESTED_WITH</strong> gesetztz, handelt es sich um eine asynchrone Anfrage:</p>
<pre>if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
&nbsp;&nbsp;$ajax = true;
}
else {
&nbsp;&nbsp;$ajax = false;
}</pre>
<h2>Die Views</h2>
<p>In den üblichen Verdächtigen des Themes, damit meine ich die <em>single.php</em>, <em>page.php</em>, <em>index.php</em> usw. steht jetzt die Variable <strong>$ajax</strong> zur Verfügung. Bisher fand ich die Arbeitsweise von WordPress nicht sehr elegant in jeder Datei Header, Sidebar und Footer einbinden zu müssen, aber jetzt finde ich sie gut. Denn wenn bei einem Ajaxaufruf <strong>nur der Inhalt</strong> zurück gegeben werden soll, dann lässt man das überflüssige HTML Gerüst einfach draußen:</p>
<pre>if(!$ajax) {
&nbsp;&nbsp;get_header();
}</pre>
<h2>Fazit</h2>
<p><strong>Das war einfach.</strong> WordPress ist ein tolles System und ich kann es kaum erwarten endlich die neue Version 3.0 stable zu sehen. Wie das ganze drum herum mit jQuery funktioniert, steht im bereits oben erwähnten <a href="http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/" target="_self">Eintrag zu TYPO3</a>. Frohes bloggen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Benutzeranmeldung im Frontend</title>
		<link>http://www.interaktionsdesigner.de/2009/03/02/wordpress-benutzeranmeldung-im-frontend/</link>
		<comments>http://www.interaktionsdesigner.de/2009/03/02/wordpress-benutzeranmeldung-im-frontend/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 14:30:50 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=307</guid>
		<description><![CDATA[Neue Benutzer können sich bei WordPress bequem anmelden, wenn bei den Einstellungen die entsprechende Checkbox angeklickt wurde. Allerdings können sich die Benutzer nur im Backend anmelden, und das ist doch alles andere als elegant. Außerdem kann der Benutzer nur seinen Namen und eine E-Mailadresse angeben. Weitere Daten werden nicht abgefragt und das Passwort automatisch generiert. [...]]]></description>
			<content:encoded><![CDATA[<p>Neue Benutzer können sich bei WordPress bequem anmelden, wenn bei den Einstellungen die entsprechende Checkbox angeklickt wurde. Allerdings können sich die Benutzer nur im Backend anmelden, und das ist doch alles andere als elegant. Außerdem kann der Benutzer nur seinen Namen und eine E-Mailadresse angeben. Weitere Daten werden nicht abgefragt und das Passwort automatisch generiert. <strong>Suboptimal</strong>.</p>
<p>Es gibt das Plugin <a title="WordPress Plugin Register Plus" href="http://skullbit.com/wordpress-plugin/register-plus/" target="_blank">Register Plus</a> welches auf vielfältige Art erlaubt das Registrierungsformular zu erweitern (auch mit eigenen Feldern). Aber trotzdem befindet sich das Teil noch im Backend. <strong>Aber das muss nicht so bleiben</strong>.<span id="more-307"></span>Als erstes braucht das verwendete Theme eine <strong>neue Seitenvorlage</strong>. Dazu dupliziert man die Datei <em>page.php</em> und fügt als erstes den folgenden PHP Kommentar ein: <pre>&lt;?php
/*
Template Name: Frontend Registrierung
*/
?&gt;</pre></p>
<p>Anschließend kann man eine <strong>neue Seite</strong> anlegen und in der rechten Spalte die Seitenvorlage<em> Frontend Registrierung</em> (bzw. was man eingetragen hat) auswählen.</p>
<p>Jetzt muss nur noch die Datei <strong>die Funktionalität</strong> kriegen. Dazu öffnet man in seinem bevorzugten Editor die duplizierte Datei und fügt, wo auch immer das Formular erscheinen soll, den folgenden Inhalt ein. <pre>&lt;form name="registerform" id="registerform" action="&lt;?=site_url('wp-login.php?action=register', 'login_post')?&gt;" method="post"&gt;
&nbsp;&nbsp;&lt;p&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&gt;&lt;?php _e('Username') ?&gt;&lt;br /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type="text" name="user_login" id="user_login" class="input" value="&lt;?php echo attribute_escape(stripslashes($user_login)); ?&gt;" size="20" tabindex="10" /&gt;&lt;/label&gt;
&nbsp;&nbsp;&lt;/p&gt;
&nbsp;&nbsp;&lt;p&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&gt;&lt;?php _e('E-mail') ?&gt;&lt;br /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type="text" name="user_email" id="user_email" class="input" value="&lt;?php echo attribute_escape(stripslashes($user_email)); ?&gt;" size="25" tabindex="20" /&gt;&lt;/label&gt;
&nbsp;&nbsp;&lt;/p&gt;
&nbsp;&nbsp;&lt;?php $register_plus-&gt;RegForm(); ?&gt;
&nbsp;&nbsp;&lt;input type="submit" value="Registrieren!"&gt;
&lt;/form&gt;</pre></p>
<p>Was ist passiert? Es wird ein ganz normales <strong>HTML Formular</strong> erstellt mit der gleichen Zielseite wie das Backendregistrierungsformular. Mit<strong> site_url()</strong> wird das Formular unabhängig von der verwendeten Baseurl gemacht.</p>
<p>Die beiden Felder <em>Username</em> und<em> E-mail</em> müssen per Hand angelegt werden, der Rest wird vom Plugin <strong>register plus</strong> übernommen. Im Plugin wird die Variable <em>$register_plus</em> mit der Klasse initalisiert und steht deshalb im Template zur Verfügung. Die Funktion <em>RegForm() </em>gibt das Formular je nach den getroffenen Einstellungen im Backend zurück.</p>
<p>Noch ein<strong> Abschicken-Knopf </strong>drunter und fertig! <em>Es gibt nur eine unschöne Sache</em>: die Antwort vom Script wird auf der normalen Registrierungsseite ausgegeben. Das ist noch nicht ganz perfekt, aber vielleicht hat jemand einen Tipp(?) oder in der nächsten Zeit kommt Teil 2 von diesem Tutorial.</p>
<p>Frohes bloggen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/03/02/wordpress-benutzeranmeldung-im-frontend/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Weg mit den verdammten Anführungszeichen von WordPress</title>
		<link>http://www.interaktionsdesigner.de/2009/01/08/weg-mit-den-verdammten-anfuhrungszeichen-von-wordpress/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/08/weg-mit-den-verdammten-anfuhrungszeichen-von-wordpress/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 10:06:49 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=170</guid>
		<description><![CDATA[WordPress verändert bekanntlich alle Anführungszeichen in einem Beitrag und zerstört so jedes Codestückchen. Aber das muss nicht sein! Diese Zeile muss in die functions.php übernommen werden und schon sind sie Vergangenheit! Endlich. Der Tipp kam von den 10 Killer WordPress Hacks vom Smashingmagazin. Danke, weitermachen!]]></description>
			<content:encoded><![CDATA[<p>WordPress verändert bekanntlich alle <strong>Anführungszeichen</strong> in einem Beitrag und zerstört so jedes Codestückchen. Aber das muss nicht sein!<br />
<pre>remove_filter('the_content', 'wptexturize');</pre><br />
Diese Zeile muss in die <em>functions.php</em> übernommen werden und schon sind sie Vergangenheit!</p>
<p>Endlich. Der Tipp kam von den <a href="http://www.smashingmagazine.com/2009/01/07/10-killer-wordpress-hacks/" target="_blank">10 Killer WordPress Hacks</a> vom Smashingmagazin. Danke, weitermachen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/08/weg-mit-den-verdammten-anfuhrungszeichen-von-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shortcode API von WordPress benutzen</title>
		<link>http://www.interaktionsdesigner.de/2009/01/03/shortcode-api-von-wordpress-benutzen/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/03/shortcode-api-von-wordpress-benutzen/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 17:47:00 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=139</guid>
		<description><![CDATA[Gerade war ich auf der Suche nach einer Möglichkeit diese verdammten "Anführungszeichen" aus meinem Quelltext zu verbannen. Nebenbei habe ich mich auch geärgert, ständig in den Quelltext wechseln zu müssen um die endlosen &#60;pre&#62;&#60;code class="bla"&#62; Tags für das Syntaxhighlighting zu schreiben. Nervt, muss aber nicht sein! Die functions.php ist mit ein paar einfachen Funktionen in [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-141" title="wp-header" src="http://www.interaktionsdesigner.de/wp-content/uploads/2009/01/wp-header.png" alt="wp-header" width="800" height="115" /></p>
<p>Gerade war ich auf der Suche nach einer Möglichkeit diese verdammten "Anführungszeichen" aus meinem Quelltext zu verbannen. Nebenbei habe ich mich auch geärgert, ständig in den Quelltext wechseln zu müssen um die endlosen <strong>&lt;pre&gt;&lt;code class="bla"&gt;</strong> Tags für das Syntaxhighlighting zu schreiben.</p>
<p>Nervt, muss aber nicht sein! Die<em> functions.php</em> ist mit ein paar einfachen Funktionen in der Lage, dem fleißigen Blogger einige Arbeit abzunehmen. <strong>Ich bin begeistert!</strong> Und so funktionierts:<br />
<span id="more-139"></span></p>
<p>Die <strong>Shortcode API</strong> bietet die Möglichkeit eigene Kurzbefehle zu erstellen. Die werden vom Autor in eckige Klammern geschrieben und können allein stehen (z.B. <em>[datum]</em>) oder Text umfassen (z.B. <em>[wichtig]</em>das ist es!<em>[/wichtig]</em>). Außerdem kann der Shortcode mit Attributen erweitert werden, also [datum <em>undzwar="gestern"</em>].</p>
<p>Also verpacken wir das &lt;pre&gt;&lt;code...&gt; gequatsche in einen praktischen Shortcode: <strong>[ code lang="php" ]</strong>. Der PHP Code dafür, gespeichert in der<em> functions.php</em> sieht wie folgt aus.</p>
<pre>function code_func($atts, $content = null) {
&nbsp;&nbsp;extract(shortcode_atts(array(
&nbsp;&nbsp;&nbsp;&nbsp;'lang' =&gt; '',
&nbsp;&nbsp;), $atts));&nbsp;&nbsp;
&nbsp;&nbsp;return "&lt;pre&gt;&lt;code class='{$atts["lang"]}'&gt;".do_shortcode($content)."&lt;/code&gt;&lt;/pre&gt;";
}
add_shortcode('code', 'code_func');</pre>
<p>Die Funktion wird mit einem Array aufgerufen (<strong>$atts</strong>) welches die Attribute beinhaltet. Die Variable <strong>$content</strong> wird mit dem umschlossenden Inhalt gefüllt. Der Rest ist dem Entwickler überlassen!</p>
<p>Der <strong>Rückgabewert</strong> wird im Blogpost gezeigt. Um weitere Shortcodes innerhalb zu erlauben, wird der Inhalt nochmal durch die Funktion <em>do_shortcode() </em>gejagt.</p>
<p>Nur ein Problem: mehrere Leerzeichen oder Tabs werden vom Editor aussortiert. Also nochmal in die Datei und ein weiterer Shortcode hinzugefügt: <strong>[ tab ]</strong>.</p>
<pre>function tab_func($atts) {
&nbsp;&nbsp;return str_repeat("&amp;nbsp;", 2);
}
add_shortcode('tab', 'tab_func');</pre>
<p>Herrlich! Vor dem Kopieren aus dem Editor ein kurzes Suchen und Ersetzen und fertig! Jetzt wird auch die Funktion <em>do_shortcode() </em>gleich noch viel sinnvoller <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bleibt noch das Problem mit den nervigen Anführungszeichen. Aber vermutlich bietet WordPress da auch die eine oder andere Lösung. Eine <a title="Shortcode API" href="http://codex.wordpress.org/Shortcode_API" target="_blank">offizielle Beschreibung</a> gibt es natürlich auch.</p>
<p>PS: Kaum bloggt man über WordPress wird der Feedreader mit nützlichen Einträgen überfallen, zum Beispiel dem hier: <a href="http://www.hongkiat.com/blog/40-most-wanted-wordpress-tricks-and-hacks/">40+ Most Wanted WordPress Tricks and Hacks </a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/03/shortcode-api-von-wordpress-benutzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress Plugin SpamKill!</title>
		<link>http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/</link>
		<comments>http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 17:03:06 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=45</guid>
		<description><![CDATA[Na, genervt vom Spam in den Kommentaren? Meine Erfahrungen mit den fiesen Spamrobotern habe ich jetzt in ein WordPress Plugin gepackt und biete es zum freien Einsatz an. Hier auf dem Blog ist es schon im Einsatz, hat aber bisher noch nichts abwehren müssen. Direkt zum Download. Funktionsweise Die ausführliche Beschreibung finden Sie hier. Die [...]]]></description>
			<content:encoded><![CDATA[<p>Na, genervt vom Spam in den Kommentaren? Meine Erfahrungen mit den fiesen Spamrobotern habe ich jetzt in ein WordPress Plugin gepackt und biete es zum freien Einsatz an.<br />
Hier auf dem Blog ist es schon im Einsatz, hat aber bisher noch nichts abwehren müssen. <a href="http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/#download">Direkt zum Download</a>.</p>
<p><span id="more-45"></span></p>
<h2>Funktionsweise</h2>
<p><a href="http://www.interaktionsdesigner.de/2008/05/14/spamschutz-ohne-kompromisse/" target="_new">Die ausführliche Beschreibung finden Sie hier.</a> Die Regeln habe ich weiter vereinfacht. Mein PlugIn prüft aktuell nur 3 von 5:</p>
<ol>
<li><strong>Zeit</strong><br />
Ein Kommentator muss mind. 5s benötigen um einen Kommentar zu schreiben. Ansonsten ist er eine Machine.</li>
<li><strong>Vertauschte Bezeichnungen</strong><br />
Im HTML Formular sind Name und Emailfeld von den Bezeichnungen her vertauscht. Ist eine E-Mailadresse im Namenfeld eingetragen, handelt es sich mit ziemlicher Sicherheit um unerwünschte Werbung.</li>
<li><strong>Hiddenfield</strong><br />
Ein verstecktes Formularfeld (&lt;input type="hidden") muss leer bleiben. Spamroboter füllen meistens sinnlos alles aus.</li>
</ol>
<p>Schon wenn eine der Regeln zutritt wird der Kommentar abgewiesen.<br />
Zum verfolgen der Tätigkeiten wird eine simple Logdatei beschrieben. Dieses Verhalten sollte man bei vielen Spamnachrichten abschalten.</p>
<h2>Installation</h2>
<p>Nach dem Download in den Ordner <em>wp-content/plugins/</em> verschieben und im WordPress Backend aktivieren.</p>
<p>Anschließend müssen noch ein paar Dinge im Formular der Kommentareingabe angepasst werden. Je nach Theme unterschiedlich, meistens findet sich dies aber in der Datei <em>wp-content/themes/THEME-NAME/comments.php</em>.</p>
<ol>
<li><strong>Attribut Action vom Form-Tag</strong>
<p>Ich habe keinen anderen Weg gefunden in die Abarbeitung einzugreifen. Deshalb habe ich sie ersetzt. Das Attribut Action muss auf folgende Datei zeigen:</p>
<pre>&lt;?php echo get_option('siteurl'); ?&gt;/wp-content/plugins/id-spamkill/id-comments-without-spam.php</pre>
</li>
<li><strong>Bezeichnungen vertauschen</strong>
<p>Name und ID vom Namen und E-Mailfeld vertauschen. Nicht vergessen auch das for-Attribut vom Label anzupassen. Bei mir sieht es jetzt so aus:</p>
<pre><code class="html">&lt;p class="first"&gt;
	&lt;label for="email"&gt;Name &lt;?php if ($req) echo "(erforderlich)"; ?&gt;&lt;/label&gt;
	&lt;input class="styling" type="text" name="email" id="email" value="&lt;?php echo $comment_author; ?&gt;" size="22" tabindex="1" /&gt;
&lt;/p&gt;

&lt;p&gt;
	&lt;label for="author"&gt;eMail &lt;?php if ($req) echo "(erforderlich)"; ?&gt;&lt;/label&gt;
	&lt;input class="styling" type="text" name="author" id="author" value="&lt;?php echo $comment_author_email; ?&gt;" size="22" tabindex="2" /&gt;
	&lt;span&gt;(wird nicht veröffentlicht)&lt;/span&gt;
&lt;/p&gt;</code></pre>
</li>
<li>Innerhalb der beiden Form-Tags müssen die Hooks abgearbeitet werden. Auch das sollte bei den meisten Themes schon vorhanden sein:
<pre><code class="php">&lt;?php do_action('comment_form', $post-&gt;ID); ?&gt;</code></pre>
</li>
</ol>
<p>Zu guter letzt muss die Datei <em>wp-content/plugins/id-spamkill/id-spamlog.txt</em> für das Script noch beschreibbar gemacht werden (z.B. mit chmod(0777)). Das wars! Einträge werden gefiltert.</p>
<h2>Konfiguration</h2>
<p>Viel muss beim Plugin nicht konfiguriert werden. Da es so wenige Sachen sind sie noch nicht als "normale" Einstellungen über das Backend erreichbar sondern in der Datei <em>id-spamkill.php</em> zu finden. Ab Zeile 13 geht es los:</p>
<pre><code class="php">protected $logSpam = true;   // Spamlog speichern?
protected $logFile = "id-spamlog.txt";    // Datei in der das Spamlog gespeichert wird
protected $logSep = "\n-----------------------------------------------\n";    // Trennezeichen zwischen dein einzelnen Einträgen der Logdatei.</code></pre>
<h2 id="download">Download</h2>
<p>Das Plugin kann als <a href="http://www.interaktionsdesigner.de/wp-content/uploads/2008/07/id-spamkill-01.zip">Archiv herunter geladen werden</a>. Bei der Verwendung wäre eine kurze Nachricht nett.</p>
<h2>Fazit</h2>
<p>Das Plugin ist in einer sehr frühen Version und bietet noch viel Raum nach oben. Gerade die aufwendige Installation stört mich gewaltig, aber ich habe bisher keinen anderen Weg gefunden um so tiefgreifend das System zu verändern.</p>
<p>Ich habe ein gutes Gefühl und lade alle Besucher herzlich ein, mit mir zu beoachten welcher Spamkommentator es als erstes schafft durch zu kommen.</p>
<p>Bei Fragen, Problemen und Anregungen stehe ich gern zur Verfügung.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/07/09/wordpress-plugin-spamkill/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pauls Blog ist schöner geworden</title>
		<link>http://www.interaktionsdesigner.de/2008/07/09/pauls-blog-wird-schoner/</link>
		<comments>http://www.interaktionsdesigner.de/2008/07/09/pauls-blog-wird-schoner/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 23:08:10 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Ich]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=43</guid>
		<description><![CDATA[Es ist vollbracht! Ohne Stress und Verluste habe ich nicht nur auf die aktuelle WordPress Version aktualisiert, sondern auch gleich noch einen behutsamen Relaunch vollzogen. Der weiße Hintergrund hat jetzt einen Abschluss und darunter finden sich interessante Listen oder die Kommentare zu den Beiträgen. Außerdem habe ich den Beiträgen auf der Startseite einen Rahmen gegeben, [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Die Wartungsarbeiten auf Pauls Blog sind vorbei!" rel="lightbox" href="http://www.interaktionsdesigner.de/wp-content/uploads/2008/07/bild-1.png"><img class="alignright size-medium wp-image-44" title="Wartungsarbeiten an Pauls Blog" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/07/bild-1-300x167.png" alt="Pauls Blog" width="300" height="167" /></a></p>
<p>Es ist vollbracht! Ohne Stress und Verluste habe ich nicht nur auf die aktuelle WordPress Version aktualisiert, sondern auch gleich noch einen behutsamen Relaunch vollzogen.</p>
<p>Der weiße Hintergrund hat jetzt einen Abschluss und darunter finden sich interessante Listen oder die Kommentare zu den Beiträgen.<br />
Außerdem habe ich den Beiträgen auf der Startseite einen Rahmen gegeben, damit sie besser unterscheidbar sind. Die Suchbox hat jetzt ein schöneres Äußeres (die inneren Werte sind unangetastet) und man kann mir ein Bier spendieren (Rechts unten auf der Startseite).<br />
Unter <em>Einstellungen</em> ist entscheidbar ob sich externe Links im gleichen oder neuen Fenster öffnen sollen.  Die aktuelle Auswahl wird in einem Cookie gespeichert. Die Erkennung von externen Links ist noch nicht perfekt gelöst, aber innerhalb von Beiträgen funktioniert es.</p>
<p><strong>Viel Interessanter</strong> ist aber mein erstes WordPress Plugin: <strong>ID SpamKill! </strong>In einer langen Nacht habe ich meine <a title="Pauls Spamschutz für Gästebücher" href="http://www.interaktionsdesigner.de/2008/05/14/spamschutz-ohne-kompromisse/" target="_blank">Erkenntnisse</a> aus dem Papyros Gästebuch in ein sehr kleines Plugin gepackt und hier zum laufen bekommen. Kommentare können ganz ohne Anmeldung, Captchas oder sonst was geschrieben und werden (ggf.) direkt veröffentlicht.<br />
In Kürze werde ich es hier ausführlich vorstellen.</p>
<p>Bleibt mir noch eine gute Nacht zu wünschen und den Todo-Punkt <em>IE6 + 7 testen</em> doppelt zu unterstreichen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/07/09/pauls-blog-wird-schoner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

