<?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; Plugin</title>
	<atom:link href="http://bueltge.de/tag/plugin/feed/" rel="self" type="application/rss+xml" />
	<link>http://bueltge.de</link>
	<description>Frank Bültge schreibt auf bueltge.de zu den Themen Webentwicklung &#38; design, WordPress, Literatur und andere Themen bezüglich Internet und Development</description>
	<lastBuildDate>Tue, 22 May 2012 20:02:25 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Daten aus WordPress an JavaScript übergeben #2</title>
		<link>http://bueltge.de/daten-aus-wordpress-an-javascript-uebergeben-2/1334/</link>
		<comments>http://bueltge.de/daten-aus-wordpress-an-javascript-uebergeben-2/1334/#comments</comments>
		<pubDate>Fri, 04 May 2012 08:24:04 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1334</guid>
		<description><![CDATA[Mittels PHP Werte an JavaScript übergeben ist ein wichtiger Teil, sei es für Optionen oder für Inhalte - es wird gebraucht. Hier möchte ich eine von 2 Lösungen vorstellen, die Funktionen aus dem Core nutzt.]]></description>
			<content:encoded><![CDATA[<p>Im <a href="http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/" title="Artikel: Optionen aus WordPress an JavaScripts übergeben #1">ersten Artikel</a> dieser kleinen Serie habe ich aufgezeigt, wie man von PHP an JS mittels <a href="http://de.wikipedia.org/wiki/JavaScript_Object_Notation" title="Was ist JSON?">JSON</a> übergibt. Alternativ kann man dies auch mittels der WordPress-Funktion <code>wp_localize_script()</code> tun, die einige Fallstricke bereit hält. Dazu dieses kleine Tutorial und ihr solltet euch mit diesen beiden Lösungen den Weg mi Vorfeld gut überlegen.<br />
<span id="more-1334"></span><br />
Die Funktion dient der Übergabe von Strings, in erster Linie zum Lokalisieren; also dem Übersetzungsthema mittels Javascript. Daher kann man aber bequem Werte übergeben und in Javascript abfragen. Der wichtigste Punkt ist wohl, dass die Funktion HTML Entities decodiert. Wichtig ist ebenso, dass das Script im Vorfeld bekannt ist; also mittels <code>wp_enqueue_script()</code> einbinden.</p>
<p>Ein Beispiel soll es verdeutlichen.</p>
<pre><code class="php">
// im Admin Bereich die Scripte einbinden; Verwaltung, Reihenfolge übernimmt WP
add_action( 'admin_enqueue_scripts', 'fb_admin_enqueue_scripts' );
function fb_admin_enqueue_scripts( $where ) {
	// trennung dev und live version des scriptes
	$suffix = defined('SCRIPT_DEBUG') &#038;& SCRIPT_DEBUG ? '.dev' : '';
	
	// Script einbinden, Identifiziert an dem id-String
	wp_enqueue_script(
		'example_script_id', 
		plugins_url( '/js/my-example-script' . $suffix. '.js', __FILE__ ), 	
		array( 'jquery' ),
		'',
		TRUE
	);
	
	// Daten innerhalb eines Array
	// array with data; also possible via get_option( 'my_option_string' )
	$data = array( 
		'some_string' => __( 'Some string to translate' ),
		'a_value' => '10'
	);
	// lokalisiere die Daten für das bekannte Script
	wp_localize_script( 'example_script_id', 'js_object_name', $data );
}
</code></pre>
<p>Mit diesem kleinen Beispiel ist PHP-seitig alles erledigt; die Inhalt des Array werden nun als Objekt <code>js_object_name</code> bekannt und können über den name-String <code>js_object_name</code> in JS genutzt werden.</p>
<p>Nun aber einige Hinweise, die helfen sollen, wenn es zu Problemen kommt oder die direkt zur <a href="http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/">Lösung mittels JSON</a> verweisen.<br />
Die Funktion <code>wp_localize_script()</code> dekodiert HTML Entities, was inhaltlich wichtig ist, aber nicht immer die ideale Lösung darstellt. Die Funktion nutzen <code>json_encode()</code>, was bei mehrdimensionalen Arrays im Zusammenhang mit dem Dekodieren von Entities zu Problemen führt. Sobald das Array mehr als eine Dimension hat, ist meine Empfehlung <a href="http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/">JSON ohne die WP Core Lösung</a> mittels <code>wp_localize_script()</code>.</p>
<p>Mit WordPress 3.4 soll sich dies bessern und die Funktion in diese Richtung nutzbarer sein - lassen wir uns überraschen, aktuell nutze ich bei mehreren Dimensionen lieber direkt JSON.<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/daten-aus-wordpress-an-javascript-uebergeben-2/1334/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/daten-aus-wordpress-an-javascript-uebergeben-2/1334/feed/</wfw:commentRss>
		<slash:comments>5</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 Nutzer Daten in Übersichten der Artikel und Usern verwenden</title>
		<link>http://bueltge.de/wordpress-nutzer-daten-in-uebersichten-der-artikel-und-usern-verwenden/1357/</link>
		<comments>http://bueltge.de/wordpress-nutzer-daten-in-uebersichten-der-artikel-und-usern-verwenden/1357/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 11:00:57 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1357</guid>
		<description><![CDATA[Ein kleines Plugin um die Möglichkeiten der Erweiterung in den Tabellen der verschiedenen Sichten von WordPress zu verstehen und zu erkennen welche Möglichkeite es gibt.]]></description>
			<content:encoded><![CDATA[<p>Die Spalten im Backend von WordPress lassen sich erweitern und Filtern, ebenso die Daten der User-Profile. Ein kleines Plugin soll dies demonstrieren und vielleicht hilft es dem einem oder anderen es zu verstehen und seine eigenen Anforderungen umzusetzen.</p>
<p>Die Einfachheit des Plugins spricht für sich, daher wollte ich es veröffentlichen und denke, dass wer mit Code arbeitet, die Hooks erkennt und versteht, woher was kommt und wo wirkt. In vielen Beispielen sind komplexe Anwendungen ersichtlich, die aber dem Lerneffekt im Wege stehen und die Einfachheit verdecken. Ich hoffe, dass das kleine Plugin genau diesen Wert abbildet und einen Ansatz für eigene Möglichkeiten aufzeigt.</p>
<p><a href="http://bueltge.de/wp-content/images/user-meta-table.png"><img src="http://bueltge.de/wp-content/images/user-meta-table-450x194.png" alt="" title="user-meta-table" width="450" height="194" class="aligncenter size-medium wp-image-1363" /></a></p>
<p>Das kleine Plugin ist auf Anforderung entstanden, da diverse Autoren schreiben und der Link des Autors jeweils geprüft werden muss. Daher war es nahe liegend, dass die URL am Artikel des jeweiligen Autors und am Profil schnell ersichtlich ist.<br />
<span id="more-1357"></span><br />
Die Inhalte können beliebig angepasst werden, deutlich wird aber, wie einfach man die Daten des Users an verschiedenen Stellen nutzen kann. Die Hooks für die Erweiterung der Spalten in den verschiedenen Sichten sollten deutlich machen, wie es funktioniert und wo man ansetzen muss, wenn das Know How bisher nicht vorhanden war.</p>
<p><a href="http://bueltge.de/wp-content/images/user-meta-table-post.png"><img src="http://bueltge.de/wp-content/images/user-meta-table-post-450x232.png" alt="" title="user-meta-table-post" width="450" height="232" class="aligncenter size-medium wp-image-1364" /></a></p>
<pre><code class="php">
&lt;?php
/**
 * Plugin Name: Add User Meta Website to different Tables
 * Plugin URI:  
 * Text Domain: add-user-meta-to-table
 * Domain Path: /languages
 * Description: Add the Website data of user profile to users.php table and table of edit posts
 * Version:	1.0.0
 * Author:      Frank Bültge
 * Author URI:  http://bueltge.de
 * License:     GPLv3
 */

/**
License:
==============================================================================
Copyright 2011 Frank Bültge  (email : frank@bueltge.de)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Requirements:
==============================================================================
This plugin requires WordPress &gt;= 3.3 and tested with PHP Interpreter &gt;= 5.3
*/

if ( ! function_exists( 'add_action' ) ) {
	echo "Hi there! I'm just a part of plugin, not much I can do when called directly.";
	exit;
}

add_action( 'admin_init', array( 'Fb_Add_User_Website', 'init' ) );

class Fb_Add_User_Website {
	
	public function init() {
		// add to user table
		add_filter( 'manage_users_columns', array( __CLASS__, 'add_user_columns' ) );
		add_action( 'manage_users_custom_column', array( __CLASS__, 'add_custom_user_columns' ), 10, 3 );
		// add to the edit posts table
		add_filter( 'manage_posts_columns', array( __CLASS__, 'add_user_columns' ) );
		add_action( 'manage_posts_custom_column', array( __CLASS__, 'add_custom_post_columns' ), 10, 2 );
	}
	
	/**
	 * Add String to table head
	 * 
	 * @param  $columns  Array
	 * @return $columns  Array
	 */
	public function add_user_columns( $columns ) {
		
		$columns['user_url'] = __( 'Website' );
		
		return $columns;
	}
	
	/**
	 * Add value to the custom field
	 * 
	 * @param  $value
	 * @param  $column_name var for column
	 */
	public function add_custom_user_columns( $value, $column_name, $id ) {
		
		if ( 'user_url' === $column_name &amp;&amp; is_integer( $id ) ) {
			$user_url = esc_attr( get_the_author_meta( 'user_url', (int) $id ) );
			if ( ! empty( $user_url ) )
				return '&lt;a href=&quot;' . $user_url . '&quot;&gt;' . str_replace( 'http://', '', $user_url ) . '&lt;/a&gt;';
		}
	}
	
	public function add_custom_post_columns( $column_name, $post_id ) {
		
		if ( 'user_url' === $column_name ) {
			$user_id  = get_the_author_meta( 'ID' );
			$user_url = esc_attr( get_the_author_meta( 'user_url', (int) $user_id ) );
			if ( ! empty( $user_url ) )
				echo '&lt;a href=&quot;' . $user_url . '&quot;&gt;' . str_replace( 'http://', '', $user_url ) . '&lt;/a&gt;';
		}
	}
	
} // end class
</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-nutzer-daten-in-uebersichten-der-artikel-und-usern-verwenden/1357/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-nutzer-daten-in-uebersichten-der-artikel-und-usern-verwenden/1357/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/user-meta-table-200x200.png" />
		<media:content url="http://bueltge.de/wp-content/images/user-meta-table.png" medium="image">
			<media:title type="html">user-meta-table</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/user-meta-table-200x200.png" />
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/user-meta-table-post.png" medium="image">
			<media:title type="html">user-meta-table-post</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/user-meta-table-post-200x200.png" />
		</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 mehrsprachig nutzen - ein Lösungsvorschlag</title>
		<link>http://bueltge.de/wordpress-mehrsprachig-nutzen-ein-loesungsvorschlag/1339/</link>
		<comments>http://bueltge.de/wordpress-mehrsprachig-nutzen-ein-loesungsvorschlag/1339/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 07:33:02 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1339</guid>
		<description><![CDATA[WordPress muss ebenso im mehrsprachigen Umfeld genutzt werden, verschiedene Lösungen haben unterschiedliche Herangehensweisen. Ich habe eine Lösung via Multisite immer bekräftigt und hier einige Worte und eine Plugin Lösung als Unterstützung.]]></description>
			<content:encoded><![CDATA[<p>Ja, es gibt WordPress schon lange und fast ebenso lange möchte man den Inhalt in verschiedenen Sprachen ausgeben und dem Leser den Inhalt entsprechend aufbereiten. Das Thema kann schnell vielschichtig und komplex werden, denn nicht nur das Darstellen von Inhalt in Form von Text in unterschiedlichen Sprachen ist ein Thema; es geht ebenfalls um die Meta Daten zum Inhalt, um Bilder, die je nach Sprache verschieden sein können und es geht um die Nutzung der Admin-Oberfläche in der bevorzugten Sprache. Damit ist nur ein Teil angedeckt und je nach Anforderungen (<a href="http://wordpress.stackexchange.com/questions/1552/best-practices-for-localizing-wordpress-content">ein Bsp. bei StackExchange</a>) wird dies schnell ein eigenes Projekt und WordPress ist nur ein "kleines" Framework im Hintergrund. Es gibt schon jetzt eine <a href="http://codex.wordpress.org/Multilingual_WordPress">Reihe von Plugins</a>, die verschiedenen Ansätze fahren - von neuen Tabellen im System oder de Trennung von Content nach Sprache in einem Tabelleneintrag zum Post bis hin zu Ablage in den Metadaten des Artikels.</p>
<p>Alle diese Lösungen haben ihre Grenzen, sind unflexibel und man begibt sich in eine Abhängigkeit, die man nur schwer wieder los wird und mit jedem Update von WordPress bekommt man es mit der Angst oder Minimum einem recht großen Aufwand im Testen zu tun. Darum möchte ich eine Lösung vorstellen, die wir im Team <a title="Inpsyde GmbH" href="http://inpsyde.com">Inpsyde</a> vielfach bei Kunden einsetzen und die ihre Stärke in der Flexibilität hat, in der Erweiterbarkeit und in der Eigenschaft, den WordPress Standard zu nutzen und nicht zu verbiegen. Ein Abschalten ist jederzeit möglich; das System bleibt in seinem Zustand.<br />
<span id="more-1339"></span></p>
<p><a href="http://bueltge.de/wordpress-mehrsprachig"><iframe src="http://bueltge.de/wordpress-mehrsprachig//?full#Cover" width="650" height="406" title="via Cursortasten blättern"></p>
<p>Die Slides zum Thema sind eingebettet; dein Form des Lesens lässt dies nicht zu, daher schaue dir die Slides unter folgenden Link an: <a href="http://bueltge.de/wordpress-mehrsprachig/">Mehrsprachigkeit mit WordPress</a>.</p>
<p></iframe></a></p>
<h3>Warum mehrsprachig?</h3>
<ul>
<li>2/3 der Weltbevölkerung sprechen mehr als eine Sprache</li>
<li>Globale Aufstellung von Unternehmen</li>
<li>Streuung von Inhalten</li>
<li>Service am Kunden</li>
<li>Suchmaschinenoptimierung</li>
</ul>
<h3>Die Lösung</h3>
<p>WordPress Multisite liefert die Lösung am Standard.<br />
Damit wird die Verwaltung verschiedener Instanzen, mit Gemeinsamkeiten und Unterschieden, mit Hilfe einer Installation möglich. Der Austausch von Daten ist via Core-Funktionen möglich, welche mittels Plugins gebündelt und vereinfacht werden.</p>
<h3>Vorteile</h3>
<ul>
<li>WordPress Core Funktionen</li>
<li>Keine Abhängigkeiten von Plugins – überlebensfähig</li>
<li>Unabhängig von WordPress Entwicklung*</li>
<li>Themes, Plugins zentral steuern, dezentral nutzen</li>
<li>Geringer Wartungsaufwand</li>
<li>Trennung Sprachen in Backend/Frontend (Userabhänig)</li>
<li>Komplett gespiegelt oder in jeder Inhaltsform getrennt</li>
<li>Kulturelle Hintergründe getrennt umsetzbar</li>
<li>Subdomains oder Subdirectories</li>
<li>de.example.com, example.com/de</li>
<li>Getrennte Domains via Domainmapping</li>
<li>example.de, example.com</li>
<li>Freiheit der Entwicklung in Design und Nutzeranforderung</li>
<li>Optimierung nicht nur im sichtbaren Bereich, lang-Attribute, SEO</li>
</ul>
<p>Weitere Ausführungen zu Frage, Ansatz und Lösung findet ihr den <a href="http://bueltge.de/wordpress-mehrsprachig/" title="Slides: Mehrsprachigkeit mit WordPress Einfach &#038; flexibel, mit WordPress Standard">Slides</a> zum WordCamp 2011.</p>
<h3>Unterstützung via Plugin</h3>
<p>Mit all diesen Anforderungen und Vorteilen nutzen wir eine Basis, die als Plugin im offiziellen Repository von WordPress zur Verfügung steht <a href="http://wordpress.org/extend/plugins/multilingual-press/">Multilingual Press</a>. Das Plugin liefert einige Werkzeuge um Multisite komfortabel für den Einsatz in der Mehrsprachigkeit umzusetzen.</p>
<p><a href="http://bueltge.de/wp-content/images/screenshot-2.png"><img src="http://bueltge.de/wp-content/images/screenshot-2-450x280.png" alt="Settings pro Blog" title="screenshot-2" width="450" height="280" class="aligncenter size-medium wp-image-1342" /></a></p>
<p>Dieses Plugin erleichtert die Zuordnung der unterschiedlichen Blogs im Netzwerk zu einer Sprache und der Verknüpfung zu anderen Blogs, so dass beim Publizieren in Blog A der Inhalt in anderen Blogs als Draft abgelegt wird. So stehen die Artikel in Relation, das System kennt ihre Zugehörigkeit und mit Hilfe einiger Funktionen kann dies im Frontend und Backend genutzt werden.<br />
Das Plugin liefert die Möglichkeit, dass am Artikel und Seite eine Meta Box mit dem Inhalt der verlinkten Daten zu sehen ist; im einfachsten Fall als Übersetzungshilfe. Ebenso gibt es ein Widget, welches im Frontend die Umschaltung erleichtert. Je Blog können einige Einstellungen vorgenommen werden, so dass eine Sprache, Flagge zugeordnet ist.</p>
<h3>Ausblick</h3>
<p>Wir haben eine weitere Version in Arbeit, die zusätzliche Hilfe mitbringt; z.B. ein Dashboardwidget mit der Übersicht alles Artikel und Verknüpfungen, einer Erweiterungen der Mediathek um globale Inhalte über alle Blogs und eigenständige Inhalte pro Blog zu trennen, in den Rechten und der Bedienung. Ebenso gibt es Helfer für das Updaten von bestehenden Installationen. Im weiteren besteht die Möglichkeit die Sprachpakete direkt im Backend zu laden, ohne via FTP/SSH auf den Server zu greifen und die Sprachen zuzuordnen. Unterstützen können wir auch, wenn ein Blog neu im Netzwerk angelegt wird, in dem bestehende Blogs als Vorlage dienen und Optionen u.a. kopiert werden. Dies aber nur ein kleiner Ausblick.</p>
<h3>Fazit</h3>
<p>WordPress Multisite liefert die Basis und mit einigen Anpassungen ensteht eine saubere, kontrollierte Lösung für die Nutzung von WordPress im mehrsprachigen Umfeld. Nun liegt es an euch - Multisite nutzen, Plugin testen und Rückmeldungen sehen wir gern am <a href="https://github.com/inpsyde/multilingual-press">Repo auf Github</a>.</h3>
<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-mehrsprachig-nutzen-ein-loesungsvorschlag/1339/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-mehrsprachig-nutzen-ein-loesungsvorschlag/1339/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/screenshot-2-200x200.png" />
		<media:content url="http://bueltge.de/wp-content/images/screenshot-2.png" medium="image">
			<media:title type="html">screenshot-2</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/screenshot-2-200x200.png" />
		</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>Einschränken der Daten-typen im WordPress Upload</title>
		<link>http://bueltge.de/einschraenken-der-daten-typen-im-wordpress-upload/1338/</link>
		<comments>http://bueltge.de/einschraenken-der-daten-typen-im-wordpress-upload/1338/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 12:16:22 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[mediathek]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1338</guid>
		<description><![CDATA[Der Upload von Dateien in WordPress kann eingeschränkt oder erweitert werden, wie erklärt der Beitrag.]]></description>
			<content:encoded><![CDATA[<p>WordPress hat mit Version 3.3 die Mediathek verändert - verbessert. Die Restriktionen im Bezug auf die Datei-Typen sind geblieben und man kann auf diese via Hook einwirken. So kann man in der Anwendungen die Datei-Typen einschränken und erweitern. Mittels zweier Hooks ist dies schnell getan und dabei ist noch ein Hinweis in der Oberfläche dabei, der die erlaubten Typen bekannt gibt.<br />
<span id="more-1338"></span><br />
<a href="http://wpengineer.com/wp-content/uploads/restrict-mime-type.png"><img src="http://wpengineer.com/wp-content/uploads/restrict-mime-type-300x187.png" alt="Screenshot Example for restrive the mime type" title="restrict-mime-type" width="300" height="187" class="aligncenter size-medium wp-image-2370" /></a></p>
<p>Das folgenden kleine Plugin soll als erste Lösung und dem Verständnis dienen. Dies kann selbstredend auf verschiedene Rollen oder Berechtigungsobjekte ausgedehnt werden, so dass man je nach Rolle verschiedene Typen von Dateien im System hoch laden kann - <a href="http://bueltge.de/search/current_user_can" title="Alle Artikel dazu in meinem Blog"><code>current_user_can()</code></a>.<br />
Wer sich für die aktuell erlaubten Typen interessiert, läßt sich das Array der ersten Funktion zurück geben oder schaut in die function <code>get_allowed_mime_types()</code> in <code>wp-includes/functions.php</code>.</p>
<p><a href="http://wpengineer.com/wp-content/uploads/restrict-mime-type-hint.png"><img src="http://wpengineer.com/wp-content/uploads/restrict-mime-type-hint-300x65.png" alt="Screenshot for Hint about allowed Mime Types" title="restrict-mime-type-hint" width="300" height="65" class="aligncenter size-medium wp-image-2371" /></a></p>
<pre><code>
&lt;?php
/**
 * Plugin Name: Restrict mime types
 * Plugin URI:  http://wpengineer.com/?p=2369
 * Description: Restrict list of allowed mime types and file extensions.
 * Version:     1.0.0
 * License:     GPLv3
 * Author:      Frank B&amp;uuml;ltge
 * Author URI:  http://bueltge.de/
 */

 // This file is not called from WordPress. We don't like that.
! defined( 'ABSPATH' ) and exit;

// If the function exists this file is called as upload_mimes.
// We don't do anything then.
if ( ! function_exists( 'fb_restrict_mime_types' ) ) {

	add_filter( 'upload_mimes', 'fb_restrict_mime_types' );
	/**
	 * Retrun allowed mime types
	 * 
	 * @see     function get_allowed_mime_types in wp-includes/functions.php
	 * @param   array Array of mime types
	 * @return  array Array of mime types keyed by the file extension regex corresponding to those types.
	 */
	function fb_restrict_mime_types( $mime_types ) {
	
		$mime_types = array(
			'pdf' =&gt; 'application/pdf',
			'doc|docx' =&gt; 'application/msword',
		);
		
		return $mime_types;
	}
}

// If the function exists this file is called as post-upload-ui.
// We don't do anything then.
if ( ! function_exists( 'fb_restrict_mime_types_hint' ) ) {
	// add to wp
	add_action( 'post-upload-ui', 'fb_restrict_mime_types_hint' );
	/**
	 * Get an Hint about the allowed mime types
	 * 
	 * @return  void
	 */
	function fb_restrict_mime_types_hint() {
		
		echo '&lt;br /&gt;';
		_e( 'Accepted MIME types: PDF, DOC/DOCX' );
	}
}
</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/einschraenken-der-daten-typen-im-wordpress-upload/1338/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/einschraenken-der-daten-typen-im-wordpress-upload/1338/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/restrict-mime-type-300x187.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/restrict-mime-type-300x187.png" medium="image">
			<media:title type="html">restrict-mime-type</media:title>
		</media:content>
		<media:content url="http://wpengineer.com/wp-content/uploads/restrict-mime-type-hint-300x65.png" medium="image">
			<media:title type="html">restrict-mime-type-hint</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>Einstellungen setzen bei WordPress Multisite</title>
		<link>http://bueltge.de/einstellungen-setzen-bei-wordpress-multisite/1331/</link>
		<comments>http://bueltge.de/einstellungen-setzen-bei-wordpress-multisite/1331/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 07:44:50 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1331</guid>
		<description><![CDATA[WordPress Plugin-Optionen sind wichtig, das Setzen unter Multisite  und der Single-Installation hat einige Besonderheiten die man wissen muss und schon ist ein Plugin schnell für beiden Formen vorbereitet.]]></description>
			<content:encoded><![CDATA[<p>Die Nutzung von WordPress für diverse Blogs im Netzwerk ist sinnvoll, kann diverse Schritte vereinfachen und wird immer beliebter. Sei es um klassische Scenarios des Bloghosting durchzuführen oder mehrsprachige Landschaften zu erstellen bis hin zu anders getrimmten Ideen. Daher ist es auch für Pluginentwickler wichtig, die Funktionen zu nutzen und eigene Plugins dafür zu erweitern oder speziell zu entwicklen.</p>
<p>Vielen ist gleich, aber nicht alles und in diesem kleinen Beitrag möchte ich kurz darstellen, wie man beim Aktivieren eines Plugins gesetzte Einstellungen in der Datenbank absetzt. <span id="more-1331"></span>Der optimale Fall dafür ist eine Funktion von WordPress, die beim Aktivieren eines Plugins getriggert wird <code>register_activation_hook()</code>. Diese Funktion wird üblicher weise beim init oder im Construktor des Plugins aufgerufen. In der damit aufgerufenen Funktion stecken die Funktionen um die Voreinstellungen in WordPress in der Tabelle options abzulegen - <code>add_option()</code>. In Multisite gibt es auch dafür eine Funktion - <code>add_site_option()</code>.</p>
<p>Nun gilt es nur noch zu trennen, ob das Plugin innerhalb des Network, in der Verwaltung der Multisite-Installation aktiviert wird, oder ob es lediglich in einer der Blogs des Netzwerkes oder einer Single-installation genutzt wird. Dafür gibt es aktuell keine Funktion, aber einen Wert, der übergeben wird. Das nachfolgenden Beispiel verdeutlicht es sicher.</p>
<pre><code>
register_activation_hook( __FILE__, 'fb_add_config' );
function fb_add_config() {

	$data = array( 
		'active' =&gt; 0, 
		'radio'  =&gt; 0,
		'link'   =&gt; 1, 
		'theme'  =&gt; 1, 
		'role'   =&gt; 'administrator', 
		'unit'   =&gt; 1, 
	);
	// if is active in network of multisite
	if ( is_multisite() &amp;&amp; isset($_GET['networkwide']) &amp;&amp; 1 == $_GET['networkwide'] ) {
		add_site_option( 'my_settings_id', $data );
	} else {
		add_option( 'my_settings_id', $data );
	}
}
</code></pre>
<p>Die Abfrage des Wertes in der globalen <code>GET</code> ist sicher schlüssig und die Abbildung dieser Abfrage kann sauber in die bereits vor geraumer Zeit <a href="http://wpengineer.com/2221/wordpress-multisite-plugins-and-activation/">angesprochene Lösung für Multisite</a> und Settings von Thomas integriert werden.<br />
Um weitere Abfragen im Umfeld Multisite zu lösen und die Einstellungen wieder zu entfernen, oder Menus im Network-Admin-Bereuch zu integrieren, ist die Funktion <code>is_plugin_active_for_network()</code> nützlich.</p>
<p>So lassen sich beispielsweise die Optionen wieder kontrolliert in Abhängigkeit der Installationsform von WordPress holen.</p>
<pre><code class="php">
if ( is_multisite() &amp;&amp; is_plugin_active_for_network( plugin_basename( __FILE__ ) ) )
	$values = get_site_option( 'my_settings_id' );
else
	$values = get_option( 'my_settings_id' );
</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/einstellungen-setzen-bei-wordpress-multisite/1331/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/einstellungen-setzen-bei-wordpress-multisite/1331/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Plugins automatisch aktivieren</title>
		<link>http://bueltge.de/wordpress-plugins-automatisch-aktivieren/1258/</link>
		<comments>http://bueltge.de/wordpress-plugins-automatisch-aktivieren/1258/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 09:18:24 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1258</guid>
		<description><![CDATA[WordPress Plugins über eine eigene Funktion aktivieren kann nützlich sein, ein kleiner Ansatz sorgt für eine Grundlösung.]]></description>
			<content:encoded><![CDATA[<p>WordPress speichert die aktiven Plugins in der Datenbank, Tabelle <code>options</code>, Feld <code>activate_plugins</code>; damit ist es ein leichtes diesen Wert zu verändern und so kann man sauber diverse Plugins von WordPress aktivieren lassen; sei es als Plugin-Lösung nach dem Einrichten einer neuen Installation oder weil eigene Plugins einge andere Plugins brauchen.<br />
<span id="more-1258"></span><br />
Im folgenden eine kleine Beispiel-Lösung, die die Ansätze liefert. Dabei ist wichtig, dass nicht die Plugin-Namen genutzt werden, sondern der String der Datei; der auch in diversen Hooks benötigt wird. Im Anschluss eine einfache Lösung um an diesen String im Backend zu kommen, nicht in die Funktion integriert und rein eine schnelle Hilfe; aber mehr soll der Beitrag auch nicht sein - Copy &#038; Paste ja, aber bedacht.</p>
<pre><code>
// only example; control about register_activation_hook() 
add_action( 'admin_init', 'fb_activate_plugins' );
function fb_activate_plugins() {
	
	if ( ! current_user_can('activate_plugins') )
		wp_die(__('You do not have sufficient permissions to activate plugins for this site.'));
	$plugins = FALSE;
	$plugins = get_option('active_plugins'); // get active plugins
	
	if ( $plugins ) {
		// plugins to active
		$pugins_to_active = array(
			'hello.php', // Hello Dolly
			'adminimize/adminimize.php', // Adminimize
			'akismet/akismet.php' // Akismet
		);
		
		foreach ( $pugins_to_active as $plugin ) {
			if ( ! in_array( $plugin, $plugins ) ) {
				array_push( $plugins, $plugin );
				update_option( 'active_plugins', $plugins );
			}
		}
		
	} // end if $plugins

}
</code></pre>
<p>Die nachstehende Funktion und dessen Hook sorgen für eine direkte Ausgabe auf der Plugin-Seite im Backend des Strings zur Plugin-Datei, also bitte nur zum schnellen Finden nutzen.</p>
<pre><code>
add_filter( 'plugin_row_meta', 'fb_get_plugin_string' , 10, 4 );
function fb_get_plugin_string( $plugin_meta, $plugin_file, $plugin_data, $status ) {
	// echo plugin file string
	echo '&lt;code&gt;' . $plugin_file . '&lt;/code&gt;&lt;br&gt;';
	return $plugin_meta;
}
</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-plugins-automatisch-aktivieren/1258/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-plugins-automatisch-aktivieren/1258/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Plugin für die Nutzung von Content-Bausteinen</title>
		<link>http://bueltge.de/wordpress-plugin-fuer-die-nutzung-von-content-bausteinen/1317/</link>
		<comments>http://bueltge.de/wordpress-plugin-fuer-die-nutzung-von-content-bausteinen/1317/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 20:45:59 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1317</guid>
		<description><![CDATA[Textbausteine, Code-Schnipesel, wiederkehrender Content kann mit Hilfe einer zentralen Verwaltung viel Ärger ersparen. Das Plugin Snippet ist für diese Aufgabe erstellt worden und soll hier kurz vorgestellt werden.]]></description>
			<content:encoded><![CDATA[<p><a href="http://wpplugins.com/plugin/281/snippets/" title="WP Pluign Snippet"><img class="alignright" src="http://bueltge.de/wp-content/images/wp/snippets-plugin.png" alt="Snippet Plugin" /></a><br />
Wer über den klassischen Content hinaus mit WordPress blogt bzw. jede erdenkliche Form von Inhalten publiziert, wird irgendwann an den Punkt kommen, wo wiederkehrende Inhalte benötigt werden, sei es im einfachsten Fall ein Bild bis hin zu komplexen Markup. Das Verbannen von lästigen Codeblöcken ist insbesondere dann interessant, wenn man diese Bausteine verschiedenen Usern zur Verfügung stellen will und wenn man sie zentral pflegen möchte. So können bestimmte Inhalte sicher gestellt werden, einmal an einer Stelle gepflegt werden und verschiedenen Anwendern zur Verfügung gestellt werden.<br />
<span id="more-1317"></span><br />
Für diese Anwendung ist das Plugin <a href="http://wpplugins.com/plugin/281/snippets/">Snippet</a> entstanden; es verwaltet Schnipsel in jeder erdenklicher Form und kann über verschiedene Mechanismen an unterschiedlicher Stelle eingesetzt werden. So kann via Shortcode, via PHP oder via Widget der Inhalt eingebunden werden. Der jeweilige Inhalt muss nicht eindeutig spezifiziert werden, es wird via ID auf den Inhalt zugegriffen. Der Shortcode und die ID werden direkt am Element dargestellt, so dass es keine Schwierigkeiten in der Nutzung geben sollte. </p>
<p><img src="http://bueltge.de/wp-content/images/snippet-meta-data.png" alt="" title="snippet-meta-data" width="285" height="179" class="aligncenter size-full wp-image-1318" /></p>
<p>Ebenso werden neue Berechtigungsobjekte angelegt, so dass man die Rechte der Schnipsel auf unterschiedliche Rollen verteilen kann. Über eine eigene Strukturierung mittels Taxonomie können die Schnipsel gefiltert werden.</p>
<p>Das Plugin ist mein erster Versuch im Bereich der Premiumplugins und gibt es schon länger, lediglich die Kurzvorstellung hier im Blog hat immer gefehlt und so hole ich dies mit diesem Artikel nach. Ideen und Hinweise sind sehr willkommen.</p>
<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-fuer-die-nutzung-von-content-bausteinen/1317/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-plugin-fuer-die-nutzung-von-content-bausteinen/1317/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/snippets-plugin.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/snippets-plugin.png" medium="image">
			<media:title type="html">Snippet Plugin</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/snippet-meta-data.png" medium="image">
			<media:title type="html">snippet-meta-data</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/snippet-meta-data-200x179.png" />
		</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 Custom Post Types in den Feed holen</title>
		<link>http://bueltge.de/wordpress-custom-post-types-in-den-feed-holen/1279/</link>
		<comments>http://bueltge.de/wordpress-custom-post-types-in-den-feed-holen/1279/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 09:54:31 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1279</guid>
		<description><![CDATA[Der Inhalt von Custom Post Types kann ebenso relevant sein und damit im Main-Feed gewollt sein, ein kleiner Schnipsel kann dies erledigen.]]></description>
			<content:encoded><![CDATA[<p>WordPress erstellt die Feed-Inhalte automatisch (optional in der Parameterübergabe der Funktion zu bestimmen) auch bei Verwendung der Custom Post Types; die sich recht stark in der Nutzung befinden.</p>
<p>Dabei werden aber die Inhalt nicht in den Standard-Feed geholt, sondern ein eigenständiger Feed entsteht. Um die Inhalte der CPT in den Haupt-Feed von WordPress zu holen, muss via Hook nur der CPT bekannt gegeben werden; am besten direkt im Plugin, welches sich um die CPT kümmert. Der folgenden kleine Schnipsel erledigt dies beispielsweise.<br />
Dabei werden in den Parametern nur einige Werte übergeben, die dafür sorgen, dass nur Artikel integriert werden, die öffentlich sind und die Recht von post haben; dies Parameter kann man natürlich anpassen; siehe Codex zur Funktion <a href="http://codex.wordpress.org/Function_Reference/get_post_types" title="Codex Doku"><code>get_post_types()</code></a>.<br />
<span id="more-1279"></span></p>
<pre><code>
// add custom post type to wp post-feed
add_action( 'request', 'fb_add_to_feed' );

// add to post-feed
function fb_add_to_feed ( $request ) {
	
	if ( isset( $request['feed'] ) &#038;& ! isset( $request['post_type'] ) ) {
		$request['post_type'] = get_post_types ( $args = array (
			'public'          =&gt; TRUE,
			'capability_type' =&gt; 'post'
		) );
	}
	
	return $request;
}
</code></pre>
<p>Damit werden dem Standard-Feed zu post die Daten übergeben; der Query dafür wird quasi verändert. Wenn es aber verschiedene CPTs gibt und man diese im Feed definieren will, dann muss der CPT übergeben werden, dazu Beispiel zwei ansehen.<br />
In diesem Schnipsel werden in einem Array die CPT definiert und damit an den Feed übergeben.</p>
<pre><code>
// add custom post type to wp post-feed
add_action( 'request', 'fb_add_to_feed' );

// add to feed
function fb_add_to_feed ( $request ) {
	
	if ( isset( $request['feed'] ) &#038;& ! isset( $request['post_type'] ) ) {
		$request['post_type'] = array( 
			'post', 'stippet', 'archive', 'movies'
		);
	}
	
	return $request;
}
</code></pre>
<p>Der obige Schnipsel ändert den Query dahingehend, dass die Post Typen definiert werden, die im Feed sein sollen, während im ersten beispiel alles zum Feed addiert wird.<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-in-den-feed-holen/1279/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-custom-post-types-in-den-feed-holen/1279/feed/</wfw:commentRss>
		<slash:comments>9</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>Unauffälliges Setzen von Pluginoptionen in WordPress</title>
		<link>http://bueltge.de/unauffaelliges-setzen-von-pluginoptionen-in-wordpress/1302/</link>
		<comments>http://bueltge.de/unauffaelliges-setzen-von-pluginoptionen-in-wordpress/1302/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 17:51:10 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1302</guid>
		<description><![CDATA[Nicht selten brauchen Plugins das einmalige Setzen von sehr wenig bis einer Option, warum nicht eine Alternative überdenken, die das Backend von WordPress nicht unnötig überfrachtet.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="https://lh5.googleusercontent.com/-mMfonpItBew/AAAAAAAAAAI/AAAAAAAAABg/Li9EqcdpYMA/photo.jpg?sz=120" alt="Avatar Renè Reimann" /></p>
<h4>Was mach ich hier eigentlich und warum?</h4>
<p>Ich wollte mich mal auf eine von mir, durchaus unübliche Art und Weise bei <a href="http://bueltge.de/impressum/">Frank</a> für seine stets hilfsbereite Art und für die vielen nützlichen Publikationen, in Form eines Gastbeitrages zu unserem Lieblings Thema - WordPress bedanken!.</p>
<p>Zwischen uns mögen Welten liegen, eigentlich sind es ca. 71km aber ich finde es immer wieder faszinierend wie ähnlich manche unserer Gedanken sind. Ok bevor ich abschweife, worum soll es denn jetzt gehen?<br />
<strong>Ich stand vor Kurzem vor der Aufgabe ein Plugin zu entwickeln, das mit sehr wenig Optionen daher kommt</strong><span id="more-1302"></span> - eigentlich war es nur eine Option! Aus meiner Sicht war es jetzt nicht wirklich sinnvoll, dafür eine extra Optionsseite anzulegen. Also hab ich mich auf die Suche nach einer Alternative gemacht. Die passende Idee hatte ich schnell. Ich platziere mein einzelnes Eingabefeld dort, wo es am ehesten gefunden wird. Wo das ist? Hm? Natürlich dort wo wir alle Plugins aktivieren, in der Plugin-Tabelle im Backend und zwar direkt unterhalb meines Plugins.</p>
<p>Nun stellt sich bei solchen Ideen folgende Frage:<br />
Gibt es da einen Hook? <em>"Klar mit Sicherheit!"</em><br />
Wie könnte dieser oder diese Hooks heißen? <em>"Hm keene ahnung!"</em></p>
<p>Diese beiden Fragen würde ich allerdings gerne mit euch auf dem WordCamp 2011, in der <a href="http://wordcamp.de/sessionvorschlag-hook-me/">Session "Hook Me"</a> diskutieren. Ich will hier nur das Ergebnis erläutern.</p>
<p>Zu erst werden wir einen weiteren Link zu den Standard Pluginoptionen, Deaktivieren und Bearbeiten hinzufügen.<br />
Hier für wird der Hook <code>plugin_action_links_{$plugin_file}</code> verwendet. Dieser Hook kann <strong>3</strong> Werte an die aufgerufene Funktion übergeben.<br />
Das wären <code>array_filter( $actions )</code>, <code>$plugin_file</code> und <code>$plugin_data</code>. Für unseren Zweck ist der Erste interessant. Mit <code>array_filter( $actions )</code> erhalten wir die Standard-Optionen in Form eines Arrays, dieses Array müssen wir nun nur noch um die neue Option erweiter.</p>
<pre><code class="php">
add_filter( 'plugin_action_links_plugin-options.php, 'po_plugin_action_links', 10, 3 );
function po_plugin_action_links( $array ) {
    $array['opdtions'] = '&lt;a href=&quot;#&quot; id=&quot;po_options_switch&quot;&gt;' . __( 'Einstellungen', 'my_textdomain' ) . '&lt;/a&gt;';
    return $array;
}
</code></pre>
<p>Jetzt hat unser Plugin eine weitere Option <em>Einstellungen</em> erhalten.<br />
Wo stecken wir denn nun das Eingabefeld hin?</p>
<p>Wenn wir uns die Stelle wo sich der Hook <code>"plugin_action_links_{$plugin_file}"</code> befindet näher anschauen, finden wir wenige Zeilen weiter unten folgenden Hook <code>"after_plugin_row_{$plugin_file}"</code>. Mit diesem Hook können wir uns eine eigene Zeile in der Tabelle unterhalb unseres Plugins erzeugen. Auch diesem Hook werden wieder verschiedene Werte übergeben, aber probiert es am besten selbst mal aus.</p>
<pre><code>
&lt;?php
add_filter( 'plugin_action_links_' . $plugin, 'po_plugin_action_links', 10, 3 );
add_filter( 'after_plugin_row_plugin-options.php', 'po_row_meta', 10, 3 );

function po_row_meta( $plugin_file, $plugin_data, $status ) {

    echo  '&lt;tr id=&quot;po_options_tr&quot; style=&quot;display: none;&quot;&gt;&lt;td colspan=&quot;4&quot;&gt;
          &lt;script&gt;
            jQuery(document).ready( function() {
                var po_options = jQuery( &quot;#po_options&quot; );
                var po_options_tr = jQuery( &quot;#po_options_tr&quot; );

                jQuery( &quot;#po_options_switch&quot; ).click( function(e){
                    e.preventDefault();
                    var display_r = po_options_tr.attr(&quot;style&quot;);

                    if( ! display_r ){
                        po_options.slideToggle( function () { po_options_tr.attr(&quot;style&quot;,&quot;display:none&quot; ); } );

                    } else {
                        po_options_tr.show();
                        po_options.slideToggle();
                    }
                });
            });
          &lt;/script&gt;
          &lt;div id=&quot;po_options&quot; style=&quot;display:none&quot;&gt;';

    var_dump( $plugin_file, $plugin_data, $status );
    echo '&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;';
}

function po_plugin_action_links( $array ) {
    $array['opdtions'] = '&lt;a href=&quot;#&quot; id=&quot;po_options_switch&quot;&gt;Einstellungen&lt;/a&gt;';
    return $array;
}
?&gt;
</code></pre>
<p>Das war es hier von mir, für euch!<br />
Wir sehen uns auf dem <a href="http://wordcamp.de/">WordCamp 2011</a>, <a href="http://www.die-pixler.de/">René Reimann</a>.</p>
<h5>Anmerkung des Bloginhabers Frank</h5>
<p>Eine Umsetzung dieser Form kann man in den Screenshots des Plugin <a href="http://wordpress.org/extend/plugins/wp-maintenance-mode/screenshots/">WP Maintenance Mode</a> sehen, so dass man sich ein Bild machen kann. Allerdings ist da diese Lösung mittlerweile zu überdenken, da die Optionen im Laufe der Nutzung umfangreicher geworden sind - dies ist durch Wünsche der Nutzer so entstanden; im ersten Ansatz gab es auch nur eine Option.<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/unauffaelliges-setzen-von-pluginoptionen-in-wordpress/1302/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/unauffaelliges-setzen-von-pluginoptionen-in-wordpress/1302/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:thumbnail url="http://bueltge.de//lh5.googleusercontent.com/-mMfonpItBew/AAAAAAAAAAI/AAAAAAAAABg/Li9EqcdpYMA/photo.jpg?sz=120" />
		<media:content url="http://bueltge.de//lh5.googleusercontent.com/-mMfonpItBew/AAAAAAAAAAI/AAAAAAAAABg/Li9EqcdpYMA/photo.jpg?sz=120" medium="image">
			<media:title type="html">Avatar Renè Reimann</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 Custom Post Types in den Loop holen</title>
		<link>http://bueltge.de/wordpress-custom-post-types-in-den-loop-holen/1277/</link>
		<comments>http://bueltge.de/wordpress-custom-post-types-in-den-loop-holen/1277/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 11:21:53 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1277</guid>
		<description><![CDATA[Custom Post Types von WordPress können über diverse Wege in den Loop geholt werden, einige möchte ich hier aufzeigen.]]></description>
			<content:encoded><![CDATA[<p>WordPress hat mit den Custom Post Types ein neues zeitalter für Entwickler im Umfeld WordPress eröffnet. Die Möglichkeiten sind vielfältig und in erster Linie vom Wissen des entwicklers abhängig. Trotzdem findet man im Netz immer wieder die gleichen Tutorial, die im Grunde nur das Einhängen eines Custom Post Types in WP erklären. Aber damit ist es nicht getan &#8211; zumindest nicht in den meisten Fällen und daher sind diverse weitere Schritte nötig um die Nutzung der CPT rund zu machen.<br />
Nein, es kommt nun kein komplettes Tutorial, wie man vorgeht und was zu tun ist; zum einen liegt dies an der fehlenden Zeit und zum anderen daran, dass die Anforderungen jeder Umsetzung sehr spezifisch sind und man damit Gefahr läuft, dass man eingehängt nach Lösungen sucht. Daher werde ich Lösungen nun ab und an hier im Blog veröffentlichen; je nach zeit und Muse, was mir so unterkommt oder was ich mit anderen schon diskutiert habe.</p>
<p>In diesem Artikel möchte ich kurz darstellen, wie man die Inhalte der Custom Post Types in den Loop von WordPress bekommt. Damit ist kein Anspruch auf Vollständigkeit erhoben und die Kommentare stehen euch offen um zu diskutieren, zu kritisieren oder zu ergänzen.<br />
<span id="more-1277"></span></p>
<p><img class="alignright" width="328" height="226" src="http://bueltge.de/wp-content/images/wp/cpt-example.png" alt="Custom Post Types Beispiele" /><br />
Der Screenshot ist ein Beispiel für die Nutzung der CPT, dabei sind die Plugins <a href="http://wordpress.org/extend/plugins/archive/" title="WordPress Plugin Archive">Archive</a> und <a href="http://wpplugins.com/plugin/281/snippets" title="WordPress Plugin Snippets">Snippets</a> entstanden, die unterschiedliche Aufgaben haben und mittels CPT recht gut abbildbar waren, insbesondere auf die Anforderungen zugeschnitten, dass man eine Oberfläche hat, die eigenständig berechtigt werden kann, je Objekt je Rolle und parallel die Nutzung von Anwendern erlaubt, die nur die Oberfläche von WP nutzen wollen bzw. kennen.</p>
<p>Im ersten Fall sei die Syntax dargestellt, wie man den Query nutzt und mittels Parameter den Typ des CPT übergibt. In einem Template des Themes sorgt dies dafür, dass nur dieser CPT ausgelesen wird. Alle anderen Parameter des Query bleiben unangetastet.</p>
<pre><code class="php">
query_posts( 'post_type=my_post_type' )
</code></pre>
<p>Eine weitere Lösung unterscheidet sich im Grunde nur im Stil und dass mehrere CPTs übergeben werden, die in einem Array stecken und damit beachtet werden.</p>
<pre><code class="php">
global $query_string;
parse_str( $query_string, $args );
$args['post_type'] = array( 'my_post_type', 'my_second_post_type' );
query_posts( $args );
</code></pre>
<p>Um den Loop von WP zu ergänzen und nicht einzuschränken, wird das Array um den Parameter des <code>post_type</code> ergänzt. Via <a href="http://php.net/manual/de/function.array-merge.php"><code>array_merge</code></a> werden also nur das Array um ein weiteres Array ergänzt.</p>
<pre><code class="php">
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' =&gt; 'my_post_type' ) );
query_posts( $args );
</code></pre>
<p>Im weiteren lassen sich eigene Queries definieren, insbesondere wenn dies in eigenen Variablen nutzen möchte, sei es im Theme oder in Plugins.</p>
<pre><code class="php">
$args = array(
	'post_type' => 'my_post_type',
	'post_status' => 'publish',
	'posts_per_page' => -1
);

$posts = new WP_Query( $args );
if ( $posts -> have_posts() ) {
	while ( $posts -> have_posts() ) {
...
	}
}
			
wp_reset_query();
</code></pre>
<p>Als letztes eine Lösung, die insbesondere den Scharm hat, dass man es sauber via Plugin steuern und damit auch bei Tests leicht abschalten kann. Ebenfalls ist die Anwendung in einem Plugin so einfach zu realisieren oder die Erweiterung eines bestehenden Themes via Child Theme oder Plugin. Über den Hook <code>pre_get_posts</code> kann man diverse Sachen des Query anpassen, so auch die CPTs.<br />
Im Beispiel habe ich via Conditional Tags noch diverse Bedingungen drin, so dass man sieht, wie auf die Ausgabe im Frontend reagiert werden kann.</p>
<pre><code class="php">
// $this? - example was used in class-structures
// add custom post type to wp loop
add_filter( 'pre_get_posts', array( $this, 'add_to_query') );

// ads to query
function add_to_query( $query ) {

	if ( is_admin() || is_preview() )
		return;
	
	if ( ! isset( $query -> query_vars['suppress_filters'] ) )
		$query -> query_vars['suppress_filters'] = FALSE;

	// conditional tags for restrictions
	if ( is_home() || is_front_page() &#038;& ( FALSE == $query -&gt; query_vars['suppress_filters'] ) ) 
		$query-&gt;set( 'post_type', array( 'post', 'my_post_type' ) );

	return $query;
}
</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-custom-post-types-in-den-loop-holen/1277/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-custom-post-types-in-den-loop-holen/1277/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/cpt-example.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/cpt-example.png" medium="image">
			<media:title type="html">Custom Post Types Beispiele</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 Menu-Einträge entfernen</title>
		<link>http://bueltge.de/wordpress-menu-eintraege-entfernen/1281/</link>
		<comments>http://bueltge.de/wordpress-menu-eintraege-entfernen/1281/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 02:40:37 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1281</guid>
		<description><![CDATA[Das WordPress Backend liefert diverse Menueinträge und nicht immer werden diese benötigt, mit WordPress 3.1 sorgen zwei Funktionen für das einfache Entfernen von nicht benötigten Einträgen.]]></description>
			<content:encoded><![CDATA[<p>WordPress bietet viele Funktionen und diese werden anhand ihrer Rechte dem User angezeigt. Trotzdem möchte man ab und an das Menu etwas erleichtern und explizit für den Kunden anpassen. Mit WordPress 3.1 wurde dies ein wenig einfacher und diverse Tutorials im Netz betrachten meiner Ansicht nach eine nicht empfohlene Lösung.<br />
<span id="more-1281"></span><br />
Mit WordPress Version 3.1 sind unter anderem zwei neue Funktionen hinzugekommen, die das Entfernen von Menu- und Submenu-Einträgen erleichtern. Diese Funktionen kümmern sich um das Entfernen von Einträge aus dem Menu-Baum <code>remove_menu_page</code> oder Einträge aus dem Submenu, Einträge die unter einem Menueintrag liegen - <code>remove_submenu_page</code>.</p>
<pre><code>
/**
 * Remove a top level admin menu
 *
 * @param string $menu_slug The slug of the menu
 * @return array|bool The removed menu on success, False if not found
 */
remove_menu_page( $menu_slug )

/**
 * Remove an admin submenu
 *
 * @param string $menu_slug The slug for the parent menu
 * @param string $submenu_slug The slug of the submenu
 * @return array|bool The removed submenu on success, False if not found
 */
remove_submenu_page( $menu_slug, $submenu_slug ) {
</code></pre>
<p>Damit ist es ein leichtes Menu-Einträge zu entfernen und das Auslesen der Arrays für <code>$menu</code> und <code>$submenu</code> kann entfallen. Bisher musste man die Einträge in diesm Array finden und den entsprechenden Eintrag via <code>unset()</code> aus dem Array nehmen. Alternative waren diverse Konstrukte um den Eintrag auf Grund eines Schlüssel zu finden und zu entfernen - die obigen neuen Funktionen machen dies überflüssig und als Parameterwert wird lediglich die "slug" übergeben, die man im Link bzw. in der URL der Backendseite findet. Ein kleines Beispiel, in dem die Einträge zu den Kommentaren und die Submenu-Seite Diskussion entfernt werden, soll es verdeutlichen.</p>
<pre><code>
function fb_remove_menu_entries () {
	// with WP 3.1 and higher
	if ( function_exists( 'remove_menu_page' ) ) {
		remove_menu_page( 'edit-comments.php' );
		remove_submenu_page( 'options-general.php', 'options-discussion.php' );
	} else {
		// unset comments
		unset( $GLOBALS['menu'][25] );
		// unset menuentry Discussion
		unset( $GLOBALS['submenu']['options-general.php'][25] );
	}
}
add_action( 'admin_menu', 'fb_remove_menu_entries' );
</code></pre>
<p>Der obige Code stellt eine einfache Lösung dar, entfernt die beiden Einträge und hat ebenso ein Fallback für WordPress, kleiner Version 3.1. Ebenso ist denkbar, dass man das Entfernen mit Rechteabfragen </p>
<pre><code>if ( function_exists( 'remove_menu_page' ) &#038;& ! current_user_can( 'manage_options' ) ) {</code></pre>
<p>verbindet und so explizit die Darstellung optimieren kann. Alternativ hilft das Plugin Adminimize und erleichtert diese Aufgabe via Oberfläche.<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-menu-eintraege-entfernen/1281/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-menu-eintraege-entfernen/1281/feed/</wfw:commentRss>
		<slash:comments>18</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>Kommentarfunktion von WordPress ganzheitlich abschalten</title>
		<link>http://bueltge.de/kommentarfunktion-von-wordpress-ganzheitlich-abschalten/1272/</link>
		<comments>http://bueltge.de/kommentarfunktion-von-wordpress-ganzheitlich-abschalten/1272/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 21:30:39 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1272</guid>
		<description><![CDATA[Die Oberfläche soll darstellen, was man braucht - Einfachheit ist Trumpf. Darum entferne ich die Bereiche, die nicht benötigt werden; im Beispiel der Kommentare stelle ich hier eine Lösung vor, die einfach aktiviert und genutzt werden kann.]]></description>
			<content:encoded><![CDATA[<p>Die Kommentarfunktion in WordPress ist ein essentieller Bestandteil von Blogs - nicht jedoch in jedem Fall beim Einsatz als klassisches CMS. In dem Fall werden Kommentare nicht benötigt.<br />
Sicher kann man diese beim Erstellen des Theme einfach weg lassen und auch die Option im Backend für den Standard deaktivieren - übersichtlich und logisch ist dies aber nicht für jeden Kunden. In so einem Fall, schalte ich die Kommentare komplett ab, sorge dafür, dass die Beiträge diese Möglichkeit nicht haben können - egal welcher Iststand der Installation - und entferne auch die Bereiche für die Kommentare aus dem Backend. Nur so hat der Nutzer nur das, was er benötigt. Mittlerweile habe ich dies so oft benötigt, dass ein kleines Plugin entstanden ist und ich damit adhoc die Bereiche und die Funktionen um die Kommentare &#8222;abschalte&#8220;. Liegen umfangreichere Anpassungen vor, so erstelle ich die ebenso via Plugin oder nutze das vorhandene Plugin <a href="http://wordpress.org/extend/plugins/adminimize/">Adminimize</a>.<br />
<span id="more-1272"></span><br />
Der eine oder andere wird eventuell Verbesserungen haben oder anderweitig Nutzen - gern, auf <a href="https://github.com/bueltge/Remove-Comments-Absolutely">github</a> zu finden und damit einfach zu forken und eventuell fließt etwas an mich zurück.<br />
Im folgenden Screenshot habe ich mal einige Bereiche markiert, die nun fehlen; im Bereich von Inhalten Schreiben - Artikel, Seiten oder anderen Post Types ist dies in meinem Plugin ebenso weg, also auch die Metaboxen für Kommentare, Diskussion und Trackback. Alles weitere sieht man beim Einsatz oder durch das Lesen des Code bzw. der schmalen Doku am Code bzw. habe ich im <a href="https://github.com/bueltge/Remove-Comments-Absolutely">Repository</a> weitere Screenshots abgelegt.</p>
<p><img src="http://wpengineer.com/wp-content/uploads/screenshot-11.png" alt="On Dashboard without comments" title="screenshot-1" width="598" height="605" /></p>
<pre><code>
&lt;?php
/**
 * Plugin Name: Remove Comments Absolutely
 * Plugin URI: http://bueltge.de/
 * Text Domain: remove_comments_absolute
 * Domain Path: /languages
 * Description: Deactivate comments functions and remove areas absolutely from the WordPress install
 * Author: Frank B&Atilde;&frac14;ltge
 * Version: 0.0.1
 * Licence: GPLv2
 * Author URI: http://bueltge.de
 * Upgrade Check: none
 * Last Change: 01.06.2011
 */

if ( ! class_exists( 'Remove_Comments_Absolute' ) ) {
	add_action( 'plugins_loaded', array( 'Remove_Comments_Absolute', 'get_object' ) );
	
	class Remove_Comments_Absolute {
		
		static private $classobj = NULL;
		
		/**
		 * Constructor, init on defined hooks of WP and include second class
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @uses    add_filter, add_action
		 * @return  void
		 */
		public function __construct () {
			
			add_filter( 'the_posts', array( $this, 'set_comment_status' ) );
			
			add_filter( 'comments_open', array( $this, 'close_comments'), 10, 2 );
			add_filter( 'pings_open', array( $this, 'close_comments' ), 10, 2 );
			
			add_action( 'admin_init', array( $this, 'remove_comments' ) );
			add_filter( 'add_menu_classes', array( $this, 'add_menu_classes' ) );
			
			add_action( 'admin_head', array( $this, 'remove_comments_areas' ) );
			
			add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar_render' ) );
		}
		
		/**
		 * Handler for the action 'init'. Instantiates this class.
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @return  object $classobj
		 */
		public function get_object () {
			
			if ( NULL === self :: $classobj ) {
				self :: $classobj = new self;
			}
			
			return self :: $classobj;
		}
		
		/**
		 * Set the status on posts and pages - is_singular ()
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @uses    is_singular
		 * @param   string $posts
		 * @return  string $posts
		 */
		public function set_comment_status ( $posts ) {
			
			if ( ! empty( $posts ) &amp;&amp; is_singular() ) {
				$posts[0]-&gt;comment_status = 'closed';
				$posts[0]-&gt;post_status = 'closed';
			}
			
			return $posts;
		}
		
		/**
		 * Close comments, if open
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @param   string | boolean $open
		 * @param   string | integer $post_id
		 * @return  string $posts
		 */
		public function close_comments ( $open, $post_id ) {
			// if not open, than back
			if ( ! $open )
				return $open;
			
			$post = get_post( $post_id );
			if ( $post -&gt; post_type ) // all post types
				return FALSE;
			
			return $open;
		}
		
		/**
		 * Change options for dont use comments
		 * Remove meta boxes on edit pages
		 * Remove support on all post types for comments
		 * Remove menu-entries
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @uses    update_option, get_post_types, remove_meta_box, remove_post_type_support
		 * @return  void
		 */
		public function remove_comments () {
			// int values
			foreach ( array( 'comments_notify', 'default_pingback_flag' ) as $option )
				update_option( $option, 0 );
			// string false
			foreach ( array( 'default_comment_status', 'default_ping_status' ) as $option )
				update_option( $option, 'false' );
			
			// all post types
			// alternative define an array( 'post', 'page' )
			foreach ( get_post_types() as $post_type ) {
				// comment status
				remove_meta_box( 'commentstatusdiv', $post_type, 'normal' );
				// remove trackbacks
				remove_meta_box( 'trackbacksdiv', $post_type, 'normal' );
				// remove all commnts from tabels
				remove_post_type_support( $post_type, 'comments' );
			}
			// remove dashboard meta box for recents comments
			remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );
			// unset comments
			unset( $GLOBALS['menu'][25] );
			// unset menuentry Discussion
			unset( $GLOBALS['submenu']['options-general.php'][25] );
		}
		
		/**
		 * Add class for last menu entry with no 20
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @param   array string $menu
		 * @return  array string $menu
		 */
		function add_menu_classes ( $menu ) {
			
			$menu[20][4] .= ' menu-top-last';
			
			return $menu;
		}
		
		/**
		 * Remove areas for comments in backend via JS
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @return  string with js
		 */
		public function remove_comments_areas () {
			?&gt;
			&lt;script type=&quot;text/javascript&quot;&gt;
			//&lt;![CDATA[
			jQuery(document).ready( function($) {
				$( '.table_discussion' ).remove();
			});
			//]]&gt;
			&lt;/script&gt;
			&lt;?php
		}
		
		/**
		 * Remove comment entry in Admin Bar
		 * 
		 * @access  public
		 * @since   0.0.1
		 * @uses    remove_menu
		 * @return  void
		 */
		public function admin_bar_render () {
			// remove entry in admin bar
			$GLOBALS['wp_admin_bar'] -&gt; remove_menu( 'comments' );
		}
		
	
	} // end class

} // end if class exists
?&gt;
</code></pre>
<p>Der obige Code ist eher zum Lesen, für die, die direkt am Code sehen wollen, was passiert. Der Download und Hinweise zum aktuellsten Code sind gut auf github zu bekommen bzw. abzulegen: <a href="https://github.com/bueltge/Remove-Comments-Absolutely">github.com/bueltge/Remove-Comments-Absolutely</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/kommentarfunktion-von-wordpress-ganzheitlich-abschalten/1272/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/kommentarfunktion-von-wordpress-ganzheitlich-abschalten/1272/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/screenshot-11.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/screenshot-11.png" medium="image">
			<media:title type="html">screenshot-1</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Admin Style Guide</title>
		<link>http://bueltge.de/wordpress-admin-style-guide/1244/</link>
		<comments>http://bueltge.de/wordpress-admin-style-guide/1244/#comments</comments>
		<pubDate>Fri, 27 May 2011 18:50:42 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CSS, xHTML, JS]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1244</guid>
		<description><![CDATA[Das Erstellen von Oberflächen im Backend von WordPress sollte man an den Standards von WordPress orientieren, um so wichtiger ist es, dass man die Möglichkeiten kennt - dieses kleine Plugin hilft dir dabei.]]></description>
			<content:encoded><![CDATA[<p>WordPress hat ein hohes Tempo in der Entwicklung - das gilt ebenso für das Design im Backend. Insofern ist es wichtig, dass man möglichst ohne eigene Styles im Adminbereich auskommt und Tags und Klassen von WordPress nutzt. Nur so kann man sich die Arbeit als Entwickler vereinfachen und muss nicht bei jedem Update alle Oberflächen testen.<br />
Leider gibt es recht umfangreiche Möglichkeiten im Backend um die Anforderungen umzusetzen. Dabei werden diverse Klassen und HTML-Strukturen verwendet. Damit man diese etwas einfacher nachschlagen kann, habe ich ein kleines Plugin entwickelt, welches in der Entwicklungsumgebung werkelt und mir bei Aufruf schnell die nötigen Elemente darstellt, Beiträge aktuell zu halten ist schwer, auch wenn <a href="http://bueltge.de/wordpress-25-plugin-style-guide/614/" title="WordPress 2.5 Plugin Style Guide">mein alter Beitrag zu dem Thema</a> noch immer passend ist, wenn auch unvollständig.<br />
<span id="more-1244"></span><br />
Anbei seht ihr in zwei Screenshots die Unterschiede zwischen Version 3.1 und 3.2 von WordPress und die aktuelle enthaltenen Elemente des Plugins.</p>
<p><a href="http://wpengineer.com/wp-content/uploads/screenshot-1.png"><img src="http://wpengineer.com/wp-content/uploads/screenshot-1-201x1024.png" alt="in WordPress 3.1" title="screenshot-1" width="201" height="1024" class="ob" /></a> <a href="http://wpengineer.com/wp-content/uploads/screenshot-2.png"><img src="http://wpengineer.com/wp-content/uploads/screenshot-2-204x1024.png" alt="in WordPress 3.2" title="screenshot-2" width="204" height="1024" class="ob" /></a></p>
<p>Das Plugin ist auf <a href="https://github.com/bueltge/WordPress-Admin-Style">Github</a> abgelegt und erwartet eurer Erweiterungen - also bitte Forken und neue Ideen und Möglichkeiten einbringen &#8211; <a href="https://github.com/bueltge/WordPress-Admin-Style">github.com/bueltge/WordPress-Admin-Style</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-admin-style-guide/1244/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-admin-style-guide/1244/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/screenshot-1-201x1024.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/screenshot-1-201x1024.png" medium="image">
			<media:title type="html">screenshot-1</media:title>
		</media:content>
		<media:content url="http://wpengineer.com/wp-content/uploads/screenshot-2-204x1024.png" medium="image">
			<media:title type="html">screenshot-2</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>php-Console mit Chrome und WordPress</title>
		<link>http://bueltge.de/php-console-mit-chrome-und-wordpress/1267/</link>
		<comments>http://bueltge.de/php-console-mit-chrome-und-wordpress/1267/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 17:43:41 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[Webküche]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1267</guid>
		<description><![CDATA[Das Chromium von Google wird immer populärer. Dies liegt auch an den verfügbaren Erweiterungen. Im Rahmen der PHP Entwicklung gibt es spannende Themen und die php-Console möchte ich kurz vorstellen.]]></description>
			<content:encoded><![CDATA[<p>Googles Browser <a href="http://www.google.com/chrome">Chrome</a> und dessen <a href="http://www.chromium.org/Home">Chromium</a> Projekt werden immer beliebter. War es anfangs in erster Linie die Geschwindigkeit, so sind auch die Erweiterungsmöglichkeiten weiterhin in den Fokus der Nutzer geraten und der Markt ist voll mit sinnvollen Erweiterungen.<br />
Natürlich gibt es auch im Rahmen der Webentwicklung viele Erweiterungen, die im Vorfeld dem <a href="http://www.mozilla-europe.org">Firefox</a> in Webentwicklerkreisen zu Bekanntheit verholfen haben.<br />
Im Bereich der PHP-Entwicklung habe ich mir immer wieder diverse Lösungen angeschaut, mit verschiedenen Möglichkeiten gespielt und am Ende sitze ich in erster Linie vor einem Browser, der IDE, XDebug und diverse eigene Erweiterungen. Unter Firefox habe ich FirePHP in bestimmten Bereichen gern genutzt, kleines Plugin dazu findet man im <a href="http://bueltge.de/firephp-und-wordpress/944/">zugehörigen Beitrag</a>. Alternativ habe auch die <a href="http://bueltge.de/debugconsole-mit-wordpress/1221/">debugConsole</a> vorgestellt. Daher lag es nahe sich im Umfeld Chromium nach einer Lösung umzuschauen und die Entwicklertools aktiv im Rahmen PHP zu nutzen. Dabei wird man in verschiedenen Themen fündig und ich möchte hier <a href="http://code.google.com/p/php-console/">php-console</a> vorstellen und eine kleine Integration für WordPress als Plugin aufzeigen.<br />
<span id="more-1267"></span></p>
<blockquote><p>PHP Console is extension for Lagger and class PhpConsole, that displays PHP errors/debug messages in Google Chrome console and in notification popups.</p></blockquote>
<p>Die Aussage trifft es im Grunde auch und bei der ersten Arbeit mit der Erweiterung für den Browser und nach Integration der Klasse sieht man die Ergebnisse sehr schön.<br />
Das Inkludieren der Klasse habe ich via Plugin gelöst, kann natürlich auch statisch in den notwendigen Stellen der entsprechenden Dateien erfolgen.<br />
Über alle Features der Erweiterung kann man sich umfassend auf der <a href="http://code.google.com/p/php-console/">Projektseite</a> umsehen; ebenfalls Dokumentationen und Download ist dort zu finden.</p>
<p>Im folgenden einige Einblicke in die Ausgabe und vielleicht macht es Lust auf einen ersten Test oder auch mehr.</p>
<p>Im ersten Screenshot seht ihr die Ausgabe der PHP-Fehler, die in der Console ausgegeben werden, diese kann man gleichzeitig nach dem Load der Seite als Popup bekommen, siehe letzer Screenshot. Dazu gibt es via Kontextmenu diverse Einstellungen der Erweiterung.<br />
<a href="http://bueltge.de/wp-content/images/wp/php-console-wp.png"><img class="centered" src="http://bueltge.de/wp-content/images/wp/php-console-wp-600.png" alt="PHP Console Error View" /></a></p>
<p>Alternativ eine Ausgabe im Log, welche ich via Plugin explizit als Beispiel erzeugt habe. So ist es möglich, dass ihr eure Ausgabe steuert.<br />
<a href="http://bueltge.de/wp-content/images/wp/php-console-wp-log.png"><img class="centered" src="http://bueltge.de/wp-content/images/wp/php-console-wp-log-600.png" alt="PHP Console Log View" /></a></p>
<p>Im letzten Screenshot ein Gesamtüberblick, inklusive der popups - man hat eine sehr schöne Ausgabe aller PHP Meldungen und sollte so beim Entwickeln nichts vergessen.<br />
<a href="http://bueltge.de/wp-content/images/wp/php-console-wp-frontend.png"><img class="centered" src="http://bueltge.de/wp-content/images/wp/php-console-wp-frontend-600.png" alt="PHP Console Log View" /></a></p>
<p>Im folgenden mein kleines Plugin (<a href="https://github.com/bueltge/php-Console-for-WordPress">alternativ bei Github</a> zum Download inkl. aller Dateien und Ordner), wobei ich die Klasse <code>PhpConsole.php</code> der php-Console im Ordner <code>inc</code> ablege. Die Ausgabe im Log der Konsole wird über die Funktion <code>debug()</code> gesteuert; dabei ist es möglich, dass man einen Namen mitgibt und so die Auswertung leichter lesen kann.</p>
<pre><code>
&lt;?php
/*
Plugin Name: php-console
Plugin URI: http://bueltge.de/
Text Domain: php-console
Domain Path: /languages
Description: &lt;a href=&quot;http://code.google.com/p/php-console/&quot;&gt;php-console&lt;/a&gt; - Google Chrome extension for displaying PHP errors/exceptions/debug messages in browser console or notification popups
Author: Frank B&amp;uuml;ltge
Version: 0.0.1
Author URI: http://bueltge.de/
Donate URI: http://bueltge.de/wunschliste/
License: GNU v3
Last change: 29.03.2011
*/ 

/* load php-console functionality */
require_once( 'inc/PhpConsole.php' );
PhpConsole::start( TRUE, TRUE, dirname(__FILE__) );

class Wp_Php_Console {
	
	public function __construct() {
		
		$this-&gt;messages();
		
		$this-&gt;get_contents( 'GNU GENERAL PUBLIC LICENSE' );
	}
	
	public function messages() {
		global $wpdb, $pagenow;
		
		debug( $pagenow, 'Var Pagenow' );
		$sql = &quot;SELECT * FROM $wpdb-&gt;options&quot;;
		debug( $sql, 'sql-options' );
	}
	
	public function get_contents( $string ) {
		
		$content = file_get_contents( '../license.txt', NULL, NULL, 0, 100 );
		$pos = strpos( $content, $string );
		
		debug( $pos , 'Position' );
		if ( ! $pos )
			debug( $content, 'Content' );
	}
}

new Wp_Php_Console();
?&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/php-console-mit-chrome-und-wordpress/1267/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/php-console-mit-chrome-und-wordpress/1267/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/php-console-wp-600.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/php-console-wp-600.png" medium="image">
			<media:title type="html">PHP Console Error View</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/php-console-wp-log-600.png" medium="image">
			<media:title type="html">PHP Console Log View</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/php-console-wp-frontend-600.png" medium="image">
			<media:title type="html">PHP Console Log View</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>Seiten-Erkennung im WordPress-Backend</title>
		<link>http://bueltge.de/seiten-erkennung-im-wordpress-backend/1246/</link>
		<comments>http://bueltge.de/seiten-erkennung-im-wordpress-backend/1246/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 01:39:43 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1246</guid>
		<description><![CDATA[Beim Arbeiten mit WordPress und Plugins ist es wichtig, dass man Inhalte nur lädt, wenn sie benötigt werden. Am Beispiel der Custom Post Types möchte ich zeigen, wie man über Variablen von WP dafür sorgt, dass nur inkludiert wird, wenn man sich auf den entsprechenden Seiten des Backend von WP befindet.]]></description>
			<content:encoded><![CDATA[<p>Wer Erweiterungen für WordPress schreibt und auf sauberes Coding achtet, dem ist unter anderem wichtig, dass Scripte, Stylesheets und anderes nur dann geladen wird, wenn man es benötigt. Nicht immer gibt es dafür einen Hook und WordPress stellt einige Variablen bereit, um zu erkennen, wo man sich innerhalb das Backends befindet. Auf Basis dieser Variablen habe ich einige kleine Code-Schnipsel zusammen getragen, die ich dafür nutze und die erst ab WordPress Version 3.0 genutzt werden sollten. Im Vorfeld wurde in WordPress mehr über die Variable <code>$pagenow</code> gearbeitet, die aber seit der Umstellung auf die Post Typen weniger zielführend ist. Die aufgezeigten Möglichkeiten sind insbesondere dann interessant, wenn man mit Custom Post Types arbeitet. Aber auch die Seiten- und Artikel-Seiten des Backend lassen schön darüber abfragen.<br />
<span id="more-1246"></span><br />
Im ersten Beispiel wird die Variable $post_type genutzt, die ausgelesen wird. Diese kann auch genutzt werden, wenn man mit Custom Post Types arbeitet und die zugehörigen Scripte nur dann laden, wenn diese Variable den richtigen Wert zurück gibt.</p>
<pre><code>
$post_type = 'my_example_post_type';
if ( get_query_var('post_type') === $post_type ) {
	// tue was, wenn wahr
}
</code></pre>
<p>Im weiteren ein etwas komplexeres Beispiel, wo ich mehrer Auswahlmöglichkeiten anbiete und damit abgleiche. Die Scripte werden nur geladen, wenn der Wert von <code>$pagehook</code> in <code>$pages</code> und <code>$post_type</code> korrekt sind.</p>
<pre><code class="php">
/**
 * Include my scripts
 *
 * $pagehook for check, if this the right page
 * $post_type for check, if this the right post type
 */
function fb_post_type_script($pagehook) {
	global $post_type;
	
	$pages = array( 'edit.php', 'post.php', 'post-new.php' );
	if ( in_array( $pagehook, $pages ) &amp;&amp; $post_type == 'my_post_type' ) {
		wp_enqueue_script( 'my_script_example_key', plugins_url( 'js/my_example_script.js', __FILE__ ), array( 'jquery', 'my_other_example_script_key' ), '1.0.0' );
	}
}
add_action( 'admin_enqueue_scripts', 'fb_post_type_script' );
</code></pre>
<p>Als Alternative kann man auch eine eigene Funktion im Plugin erstellen, die sich um das zurückgeben von Werten kümmert und so nur aufgerufen wird und der Rückgabewert dient als Prüfung für das Inkludieren auf den entsprechenden Seiten des Backends.<br />
Die Methode <code>get_post_type()</code> ist Bestandteil der Klasse des Plugins und wird im Anschluss in den weiteren Methoden genutzt, ein Beispiel im Anschluss dazu.<br />
Den Custom Post Type definiere in eingangs und frage so immer nur die Konstante <code>FB_POST_TYPE_1</code> dazu ab.</p>
<pre><code class="php">
/**
 * Return post type
 * 
 * @return string $post_type
 */
private function get_post_type() {
	
	if ( !function_exists('get_post_type_object') )
		return NULL;
		
	if ( isset($_GET['post']) )
		$post_id = (int) $_GET['post'];
	elseif ( isset($_POST['post_ID']) )
		$post_id = (int) $_POST['post_ID'];
	else
		$post_id = 0;
	
	$post = NULL;
	$post_type_object = NULL;
	$post_type = NULL;
	if ( $post_id ) {
		$post = get_post($post_id);
		if ( $post ) {
		$post_type_object = get_post_type_object($post-&gt;post_type);
			if ( $post_type_object ) {
				$post_type = $post-&gt;post_type;
				$current_screen-&gt;post_type = $post-&gt;post_type;
				$current_screen-&gt;id = $current_screen-&gt;post_type;
			}
		}
	} elseif ( isset($_POST['post_type']) ) {
		$post_type_object = get_post_type_object($_POST['post_type']);
		if ( $post_type_object ) {
			$post_type = $post_type_object-&gt;name;
			$current_screen-&gt;post_type = $post_type;
			$current_screen-&gt;id = $current_screen-&gt;post_type;
		}
	} elseif ( isset($_SERVER['QUERY_STRING']) ) {
		$post_type = esc_attr( $_SERVER['QUERY_STRING'] );
		$post_type = str_replace( 'post_type=', '', $post_type );
	}
	
	return $post_type;
}

public function example() {
	$post_type = $this-&gt;get_post_type();  
	
	// FB_POST_TYPE_1 is defined with my post type
	if ( FB_POST_TYPE_1 == $post_type ) {
		// tue etwas, wenn wahr
	}
}
</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/seiten-erkennung-im-wordpress-backend/1246/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/seiten-erkennung-im-wordpress-backend/1246/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>WordPress Admin Bar erweitern</title>
		<link>http://bueltge.de/wordpress-admin-bar-erweitern/1237/</link>
		<comments>http://bueltge.de/wordpress-admin-bar-erweitern/1237/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 00:17:43 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1237</guid>
		<description><![CDATA[Mit WordPress Version 3.1 kommt die Admin Bar und soll den Zugriff von Backend und Frontend auf Bereiche Des Backend erleichtern. Natürlich ist auch dieses neue Bedienelement von WordPress erweiterbar und kann daher an die Bedürfnisse der Nutzer angepasst werden. Wie das geht soll dieses Beispiel verdeutlichen.]]></description>
			<content:encoded><![CDATA[<p>Mit WordPress Version 3.1 kommt die Admin Bar und soll den Zugriff von Backend und Frontend auf Bereiche des Backend erleichtern. Natürlich ist auch dieses neue Bedienelement von WordPress erweiterbar und kann daher an die Bedürfnisse der Nutzer angepasst werden. Dies ist sicher nicht immer sinnvoll, in einigen Bereichen und bei diversen Anforderungen ist ein schneller Zugriff auf verschiedene Bereiche aber sicher interessant.</p>
<p><a href="http://wpengineer.com/wp-content/uploads/custom-admin-bar.png"><img src="http://wpengineer.com/wp-content/uploads/custom-admin-bar-300x71.png" alt="" title="custom-admin-bar" width="300" height="71" class="centered aligncenter" /></a></p>
<p>Die neu erzeugten Einträge lassen sich über die gewohnten Rechte-Objekte an die entsprechenden Rollen anpassen und insofern kann der Entwickler sich hier austoben. Ein kleines Beispiel soll die Integration aufzeigen.<br />
<span id="more-1237"></span><br />
Es lassen sich innerhalb der Admin Bar Hierarchien darstellen, die dann bei einem unveränderten Admin Bar mit einem MouseOver Effekt gekoppelt werden. Im folgenden Beispiel wird eine Suche im Codex von WordPress in die Admin bar integriert. Es gibt noch einiges in Sachen CSS zu tun, damit sie sich vollkommen sauber integriert, aber ich denke, das Beispiel zeigt einige Möglichkeiten auf und kann für eigene Ideen und Anforderungen genutzt werden.</p>
<pre><code>
function wp_codex_search_form() {
    global $wp_admin_bar, $wpdb;

    if ( !is_super_admin() || !is_admin_bar_showing() )
        return;

    $codex_search = '&lt;form target=&quot;_blank&quot; method=&quot;get&quot; action=&quot;http://wordpress.org/search/do-search.php&quot; style=&quot;margin:5px 0 0;&quot;&gt;
        &lt;input size=&quot;13&quot; type=&quot;text&quot; onblur=&quot;this.value=(this.value==\'\') ? \'' . __( 'Search the Codex', 'textdomain' ) . '\' : this.value;&quot; onfocus=&quot;this.value=(this.value==\'' . __( 'Search the Codex', 'textdomain' ) . '\') ? \'\' : this.value;&quot; maxlength=&quot;100&quot; value=&quot;' . __( 'Search the Codex', 'textdomain' ) . '&quot; name=&quot;search&quot; class=&quot;adminbar-input&quot;&gt;
        &lt;button type=&quot;submit&quot; class=&quot;adminbar-button&quot;&gt;
            &lt;span&gt;Go&lt;/span&gt;
        &lt;/button&gt;
    &lt;/form&gt;';

    /* Add the main siteadmin menu item */
    $wp_admin_bar-&gt;add_menu( array( 'id' =&gt; 'codex_search', 'title' =&gt; __( 'Search the Codex', 'textdomain' ), 'href' =&gt; FALSE ) );
    $wp_admin_bar-&gt;add_menu( array( 'parent' =&gt; 'codex_search', 'title' =&gt; $codex_search, 'href' =&gt; FALSE ) );
}
add_action( 'admin_bar_menu', 'wp_codex_search_form', 1000 );
</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-admin-bar-erweitern/1237/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-admin-bar-erweitern/1237/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/custom-admin-bar-300x71.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/custom-admin-bar-300x71.png" medium="image">
			<media:title type="html">custom-admin-bar</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>Eigene Felder in der Dateiverwaltung von WordPress</title>
		<link>http://bueltge.de/eigene-felder-dateiverwaltung-wordpress/1226/</link>
		<comments>http://bueltge.de/eigene-felder-dateiverwaltung-wordpress/1226/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 10:23:35 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[dateimanager]]></category>
		<category><![CDATA[Daten]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1226</guid>
		<description><![CDATA[Das Erweitern der Metadaten für ein Attachment in WordPress ist nicht kompliziert und man kann damit eine Menge an zusätzlichen Infos zur Datei ablegen und auch nutzen. Wie das geht soll das Beispiel im Artikel verdeutlichen.]]></description>
			<content:encoded><![CDATA[<p>Die Medienverwaltung ist bei WordPress in einigen Bereichen sicher nicht vollkommen, aber sie bietet mit einer übersichtlichen Bedienung tolle Möglichkeiten. Jedes Attachment kann diverse Metadaten erhalten und auch WordPress speichert einige Daten direkt beim Upload - zum Beispiel einen Teil der Exif-Daten eines Bildes.</p>
<p>Trotzdem kann es sein, dass es nicht ausreicht und man bei der Verwendung von WordPress eigene zusätzliche Daten zum Attachment benötigt, sei es um im Backend von WordPress zu steuern oder auch um im Frontend Daten zum Bild auszugeben. Daher hier ein kleines Tutorial, in dem ein zusätzliches Feld ergänzt wird und ebenso eine Lösung, die direkt eingesetzt werden kann und ein neues Feld mit Hilfe eines Plugins ergänzt.<br />
<span id="more-1226"></span><br />
Für das Auslesen stelle ich eine einfache Methode dar, die entsprechend angepasst werden muss. Für das Auslesen der Daten zum Attachment stellt WordPress sehr viele wunderbare Funktionen bereit und damit lassen sich viele tolle Sachen realisieren - immer eine Frage der Kenntnis und des Können des Entwicklers - wie der <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/">zugehörige Artikel</a> zeigt.</p>
<p><img src="http://bueltge.de/wp-content/images/aaf-wp.png" alt="" title="aaf-wp" width="482" height="668" class="aligncenter size-full wp-image-2077" /></p>
<p>Der obige Screenshoot stellt das Ziel dar, ein Zusatzfeld mit dem Namen <em>Example Custom Field</em>, das Inputfeld dazu und einen erläuterten Text unterhalb des Feldes.</p>
<h3>Feld hinzufügen</h3>
<p>Im ersten Schritt erstellen wir eine Funktion, die die 3 neuen Inhalte in den Bereich der Attachment bringt. Diese Felder werden einem Array übergeben und im Anschluss durch den entsprechenden Hook <code>attachment_fields_to_edit</code> in WordPress integriert.</p>
<pre><code class="php">
// Add a custom field to an attachment in WordPress
function fb_attachment_fields_edit($form_fields, $post) {
	
	$form_fields['custom_example']['label'] = __( 'Example Custom Field', FB_AAF_TEXTDOMAIN );
	$form_fields['custom_example']['value'] = get_post_meta($post-&gt;ID, '_custom_example', true);
	$form_fields['custom_example']['helps'] = __( 'A helpful text for this field.', FB_AAF_TEXTDOMAIN );
	
	return $form_fields;
}
</code></pre>
<h3>Feldinhalt speichern</h3>
<p>Da wir nun die Datenfelder ergänzt haben, müssen wir uns nur noch um das Speichern der Werte kümmern. Auch dazu stellt WordPress einen Hook <code>attachment_fields_to_save</code> bereit, so dass man in die Speicherfunktion nur einhaken muss.</p>
<pre><code class="php">
// save custom field to post_meta
function fb_attachment_fields_save($post, $attachment) {
	
	if ( isset($attachment['custom_example']) )
		update_post_meta($post['ID'], '_custom_example', $attachment['custom_example']);
	
	return $post;
}
</code></pre>
<h3>Einhaken in WordPress</h3>
<p>Die beiden Funktion, die im Vorfeld kurz erklärt wurden bringen und die nötigen Funktionen und nun integrieren wir sie in WordPress, wir hacken ein. Wer die Möglichkeit nicht so gut kennt, kurz die Erklärung anhand dieser beiden Filter-Hooks. In beiden Fällen übergeben unsere Funktionen <strong>zwei</strong> Parameter an die Hooks von WordPress und sie werden mit dem Standard-Wert der <strong>Priorität 10</strong> übergeben. Alles wirkt auf einen Filter von WordPress und daher das einhaken auf den jeweiligen <strong>Filter-Hook (<code>add_filter</code>)</strong> <code>attachment_fields_to_*</code>. Die Übergabe via Array <code>array(&amp;$this;, ...</code> findet hier nur statt, da alles im Anschluss innerhalb einer Klasse verwendet wird.</p>
<pre><code class="php">
add_filter( 'attachment_fields_to_edit', array(&amp;$this;, 'fb_attachment_fields_edit'), 10, 2);
add_filter( 'attachment_fields_to_save', array(&amp;$this;, 'fb_attachment_fields_save'), 10, 2);
</code></pre>
<h3>Das Beispiel Plugin</h3>
<p>Nun bauen wir die Funktionen und deren Hooks in ein Plugin und können so unkompliziert die Zusatzfunktionen innerhalb von WordPress verwendet werden. Die Trennung von Zusatzfunktionen in Theme und Plugin halte ich für sehr wichtig, da die Priorität der Integration unterschiedlich ist und da aus meiner Sicht Funktionserweiterungen im Theme nur dann sinnvoll sind, wenn sie eine reine Erweiterung des Theme darstellen und nicht der Funktionen von WordPress, unabhängig vom Frontend.<br />
Ebenso ist die Nutzung via Klasse sinnvoll, da so der Namensraum wesentlich sauberer gepflegt wird und man mehr Übersicht im Code bekommt. Aber Artikel über die Vorteile der Objektorientierten Programmierung und zumindest der Klassennutzung gibt es genug.</p>
<pre><code class="php">
&lt;?php
/**
 * @package Add Attachment Fields
 * @author Frank B&uuml;ltge
 */

/*
Plugin Name: Add Attachment Fields
Plugin URI: http://bueltge.de/
Text Domain: add_attachment_fields
Domain Path: /languages
Description: Example for add a custom field to an attachment in WordPress
Author: Frank B&uuml;ltge
Version: 0.0.1
Author URI: http://bueltge.de/
Donate URI: http://bueltge.de/wunschliste/
License: GPL
Last change: 24.11.2010 10:21:19
*/ 

/**
License:
==============================================================================
Copyright 2009/2010 Frank Bueltge  (email : frank@bueltge.de)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Requirements:
==============================================================================
This plugin requires WordPress &gt;= 2.7 and tested with PHP Interpreter &gt;= 5.2.9
*/

//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();
} elseif ( version_compare(phpversion(), '5.0.0', '&lt;') ) {
	$exit_msg = 'The plugin require PHP 5 or higher';
	header('Status: 403 Forbidden');
	header('HTTP/1.1 403 Forbidden');
	exit($exit_msg);
}


if ( !class_exists('add_attachment_fields') ) {
	
	//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_AAF_BASENAME', plugin_basename(__FILE__) );
	define( 'FB_AAF_BASEDIR', dirname( plugin_basename(__FILE__) ) );
	define( 'FB_AAF_TEXTDOMAIN', 'add_attachment_fields' );
	
	class add_attachment_fields {
		
		function __construct() {
			
			if ( !is_admin() )
				return FALSE;
				
			add_action( 'init', array(&amp;$this, 'text_domain') );
			add_filter( 'attachment_fields_to_edit', array(&amp;$this, 'fb_attachment_fields_edit'), 10, 2);
			add_filter( 'attachment_fields_to_save', array(&amp;$this, 'fb_attachment_fields_save'), 10, 2);
		}
		
		function text_domain() {
			
			load_plugin_textdomain( FB_AAF_TEXTDOMAIN, false, FB_AAF_BASEDIR . '/languages' );
		}
		
		// Add a custom field to an attachment in WordPress
		function fb_attachment_fields_edit($form_fields, $post) {
			
			$form_fields['custom_example']['label'] = __( 'Example Custom Field', FB_AAF_TEXTDOMAIN );
			$form_fields['custom_example']['value'] = get_post_meta($post-&gt;ID, '_custom_example', true);
			$form_fields['custom_example']['helps'] = __( 'A helpful text for this field.', FB_AAF_TEXTDOMAIN );
			
			return $form_fields;
		}
		
		// save custom field to post_meta
		function fb_attachment_fields_save($post, $attachment) {
			
			if ( isset($attachment['custom_example']) )
				update_post_meta($post['ID'], '_custom_example', $attachment['custom_example']);
			
			return $post;
		}
		
	}
	
	function add_attachment_fields_start() {
	
		new add_attachment_fields();
	}
	
	add_action( 'plugins_loaded', 'add_attachment_fields_start' );
}
</code></pre>
<h3>Ein Beispiel zum Auslesen der Werte in Example Frontend und Plugins</h3>
<p>Nach dem nun ein Plugin entstanden ist, nun noch eine kleine Lösung um die Meta Daten des Attachments auszugeben. Aber dazu ist der schon <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/">angesprochenen Artikel</a> zu empfehlen, da es dort weit aus mehr Hintergründe und Informationen gibt.</p>
<pre><code class="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 get_post_meta($attachment_id, '_custom_example', true);
}
</code></pre>
<p>Ein Praxisbeispiel – Fotograph und dessen URL – wurde neulich von Thomas Scholz auf <a href="http://wordpress.stackexchange.com/questions/3097/how-can-i-add-a-url-field-to-the-attachments-window/3108#3108">WordPress Answers</a> gepostet. Insofern also eine schöne Anwendung für diese Möglichkeit.<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/eigene-felder-dateiverwaltung-wordpress/1226/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/eigene-felder-dateiverwaltung-wordpress/1226/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/aaf-wp.png" />
		<media:content url="http://bueltge.de/wp-content/images/aaf-wp.png" medium="image">
			<media:title type="html">aaf-wp</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>debugConsole mit WordPress</title>
		<link>http://bueltge.de/debugconsole-mit-wordpress/1221/</link>
		<comments>http://bueltge.de/debugconsole-mit-wordpress/1221/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 12:56:06 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Webdeveloper]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1221</guid>
		<description><![CDATA[Das Debuggen von PHP hat unterschiedliche Ansätze und Möglichkeiten die debugConsole ist eine Möglichkeit, die man sich mal anschauen sollte.]]></description>
			<content:encoded><![CDATA[<p>Für das Debuggen innerhalb von WordPress gibt es verschieden Ansätze und Vorlieben. Ich mag <a href="http://www.xdebug.org/">xDebug</a> und in einigen Fällen nutze ich <a href="http://www.firephp.org/">FirePHP</a>. Nun ist ein weitere Möglichkeit in meinen Fokus gerückt und ich musste es zumindest mal testen - <a href="http://www.debugconsole.de/">debugConsole</a> - es gefällt mir.</p>
<blockquote><p>The debugConsole is a tool for debugging and tracing PHP5 applications on productive servers without compromising the live-traffic.</p></blockquote>
<p>Warum also nicht auch hier und darum hier eine kleiner Hinweis und ein kleines erstes Plugin zum spielen und testen der Konsole.<br />
<span id="more-1221"></span><br />
<img class="centered" src="http://bueltge.de/wp-content/images/debugconsole-backend.jpg" alt="debugConsole im WP Backend" /></p>
<p>Aktuell habe ich nur ein Demo-Plugin erstellt, was die Funktion zeigt. Es wird auch nicht gepflegt, kann aber hier herunter geladen werden. Als kleiner Start quasi und schneller Blick auf die Möglichkeiten. Ich habe dabei die Beispiele des Autors der <a href="http://www.debugconsole.de/">debugConsole</a> integriert.</p>
<p>Das Plugin hat folgenden Quellcode und ihr könnt an jeder URL aus der WP-Installation den String <code>?debug=true</code> anhängen, so dass das Popup mit den Informationen der Konsole aufgerufen wird. Aktuell ist dies für Frontend und Backend möglich.</p>
<pre><code>
&lt;?php
/*
Plugin Name: debugConsole
Plugin URI: http://bueltge.de/
Text Domain: debugconsole
Domain Path: /languages
Description: The &lt;a href=&quot;http://www.debugconsole.de/&quot;&gt;debugConsole&lt;/a&gt; is a tool for debugging and tracing PHP5 applications on productive servers without compromising the live-traffic. Add &lt;code&gt;?debug=true&lt;/code&gt; to the URL for see the Popup-Window with debugConsole
Author: Frank B&amp;uuml;ltge
Version: 0.1
Author URI: http://bueltge.de/
Donate URI: http://bueltge.de/wunschliste/
License: Apache License
Last change: 14.10.2010 11:30:51
*/ 

/**
License:
==============================================================================
Copyright 2010 Frank Bueltge  (email : frank@bueltge.de)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Requirements:
==============================================================================
This plugin requires WordPress &gt;= 2.7 and tested with PHP Interpreter &gt;= 5.2.9
*/
 
/* PHP5 required */
if (version_compare(PHP_VERSION, '5.0.0') &lt; 0) {
	die('The debugConsole requires PHP 5.x.x or greater.');
}

/* load debugConsole functionality */
require_once 'debugconsole-1.3.0/debugConsole.php';

// add ?debug=true to the URL
if ( isset($_GET['debug']) &amp;&amp; $_GET['debug'] == 'true') {
	add_action( 'wp_footer', 'wp_debug_console' );
	add_action( 'admin_footer', 'wp_debug_console' );
}

function wp_debug_console() {
	
	/**
	* debugConsole demonstration
	*
	* This script demonstrates each feature of the debugConsole. The
	* debugConsole is a PHP5 class using JavaScripts to show debug
	* information in a popup window. The popup has IP-based access
	* control. Configurate everything in debugConsole.config.php.
	* Additionally, PHP's default errorhandler is replaced.
	*
	* @author Andreas Demmer &lt;mail@andreas-demmer.de&gt;
	* @version 1.0.1
	* @package debugConsole_1.2.0
	*/
	
	/*
	Now you got an extended commandset:
	
	dc_watch()           watch variable changes in console
	dc_dump()            var_dump variables in console
	dc_here()            mark checkpoints in console
	dc_start_timer()     measure a timespan
	dc_stop_timer()      output timespan in console
	*/
	
	/* test watches */
	dc_watch('foo');
	
	declare (ticks = 1) {
		$foo = '1';
		$foo++;
		
		/* test checkpoints */
		dc_here('The interpreter passed through here!');
		
		/* test timer clock */
		$myTimer = dc_start_timer('Measure an one second sleep:');
		sleep(1);
		dc_stop_timer($myTimer);
		
		/* test variable debugging */
		$bar = 42.0;
		dc_dump($bar, '$bar tells us the meaning of life:');
		
		$foobar = array (
				'foo' =&gt; $foo,
				'bar' =&gt; $bar
		);
		
		dc_dump($foobar, '$foobar is a neat array!');
	
		/* test errorhandling */
		echo $notSet;
		fopen('not existing!', 'r');
	}
	
}
?&gt;
</code></pre>
<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>.<br />
Download als zip-Datei: <a href="http://bueltge.de/wp-content/download/wp/plugins/debugConsole.zip">debugConsole.zip</a> - 131 kByte<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/debugconsole-mit-wordpress/1221/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/debugconsole-mit-wordpress/1221/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/debugconsole-backend.jpg" />
		<media:content url="http://bueltge.de/wp-content/images/debugconsole-backend.jpg" medium="image">
			<media:title type="html">debugConsole im WP Backend</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>Kontrolle von Inhalt via Userrechten &amp; Zeit mit WordPress</title>
		<link>http://bueltge.de/kontrolle-inhalt-userrechten-zeit-wordpress/1177/</link>
		<comments>http://bueltge.de/kontrolle-inhalt-userrechten-zeit-wordpress/1177/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 14:22:19 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Shortcode]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1177</guid>
		<description><![CDATA[WordPress bringt eine eigene User-Verwaltung mit und so kann man auch auf Grund diverser Rollen und Objekte die Inhalte steuern. In einigen Fällen ist es eine typische Anforderung, dass man den kompletten Inhalt nur den registrierten Usern zugänglich macht. Gleiches gilt natürlich auch für Teile des Content. Es gibt sicher verschiedene Anwendungen - einige kleine Lösungsvorschläge möchte ich hier kurz vorstellen.]]></description>
			<content:encoded><![CDATA[<p>WordPress bringt eine eigene User-Verwaltung mit und so kann man auch auf Grund diverser Rollen und Objekte die Inhalte steuern. In einigen Fällen ist es eine typische Anforderung, dass man den kompletten Inhalt nur den registrierten Usern zugänglich macht. Gleiches gilt natürlich auch für Teile des Content. Es gibt sicher verschiedene Anwendungen - einige kleine Lösungsvorschläge möchte ich hier kurz vorstellen.<br />
<span id="more-1177"></span></p>
<h4>Rechte-Abfrage</h4>
<p>Eine einfache Möglichkeit ist die Abfrage der Rechte - die WordPress-Funktion <code>current_user_can()</code> erlaubt dies und kann einfach in Templates des Themes verwendet werden. Somit kann man steuern, dass nur geloggte User mit den entsprechenden Rechten den Inhalt sehen.<br />
Im einfachsten Fall könnte man dies wie folgt im Template einbauen:</p>
<pre><code class="php">
if ( current_user_can( 'manage_options' ) )
	the_content( the_title( '', '', false ) . ' ' . __( 'weiterlesen &raquo;', FB_BASIS_TEXTDOMAIN ) );
else
	_e( 'Nur für geloggte User zug&auml;nglich', FB_BASIS_TEXTDOMAIN );
</code></pre>
<p>Ohne die einzelnen Rechte abzufragen genügt die Abfrage mittels der Funktion <code>is_user_logged_in()</code>. Damit wird geprüft, ob der User geloggt ist.</p>
<p>Hier gibt es sicher diverse Ansätze und Möglichkeiten, die aber leicht nutzbar sind und trotzdem die unterschiedlichen Rollen und Objekte berücksichtigen. Die Objekte je Rolle sind übersichtlich im <a href="http://codex.wordpress.org/Roles_and_Capabilities">Codex</a> beschrieben.</p>
<h4>Prüfung auf Login via Funktion</h4>
<p>Nun ist die Integration im Template recht einfach, sorgt aber dafür dass man in der Regel jedes Template anpassen muss. Da WordPress mit Hooks arbeitet, kann man hier auch einhaken und zentral via Plugin oder <code>functions.php</code> im Theme eine Funktion dafür ablegen.</p>
<p>Die folgende Funktion ist so ein Beispiel und prüft in dem Fall unabhängig von den Rechten, sondern lediglich ob der User geloggt ist - wenn ja, dann darf der Inhalt gesehen werden. Über den Hook the_content wird hier zentral gesteuert - so dass die Ausgabe im Theme, welche via dem Template Tag <code>the_content()</code> kommt, nur dann den Content wieder gibt, wenn man als User geloggt ist.<br />
Parallel wurde hier auch explizit im Feed nur ausgegeben, wenn man geloggt ist - <code>!is_feed()</code>.</p>
<p>Als Alternative für nicht geloggte User wird ein Abschnitt des Content ausgegeben - dazu gibt es verschieden Ansätze, hier wurde explizit mit Zeichen gearbeitet. So entsteht quasi ein Teaser für den Leser.</p>
<pre><code class="php">
function content_only4logged_in($content) {
	
	// alle geloggten User
	if ( is_user_logged_in() &#038;& 
			!is_null($content) &#038;& 
			!is_feed() 
		 ) {
			
		return $content;
	} else {
		
		$content  = wp_html_excerpt( $content, 80 );
		$content .= ' &hellip;';
		$content .= __( '<br />Sorry, more of this content is only available for logged users.', FB_TEXTDOMAIN );
		return $content;
	}
}
add_action( 'the_content', 'content_only4logged_in' );
</code></pre>
<h4>Inhalte via Shortcode einschränken</h4>
<p>Eine weitere Alternative ist es, nur einen bestimmten Abschnitt des Content nur für geloggte User frei zu geben. Dies könnte man beispielsweise über die Shortcode-API von WordPress tun. Auch dazu ein Beispiel. Hier wird der Shortcode <code>[member]</code> eingesetzt. Alles innerhalb dieses Elementes ist nur für geloggte User sichtbar.<br />
Auch dieser Code gehört in ein Plugin oder die Schnittstelle des Themes für neue Funktionen.</p>
<pre><code class="php">
function fb_check_logged_in( $atts, $content = null ) {
	if ( is_user_logged_in() &#038;& 
		!is_null($content) &#038;& 
		!is_feed() 
		 ) {
			
		return $content;
	} else {
		
		return __( 'Sorry, this content is only available for logged users.', FB_TEXTDOMAIN );
	}
}
add_shortcode( 'member', 'fb_check_logged_in' );
</code></pre>
<h4>Zeitabhängig ausgeben</h4>
<p>Eine denkbare Alternative ist auch das Ausgeben von Inhalten nach einem bestimmten Zeitraum. Diese Möglichkeit kann sicher beliebig erweitert werden. So lohnt sicher die Erweiterung um eine <a href="http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/">Metabox</a> zur Eingabe eines Datums an den Beiträgen oder Erweiterung von Parametern um den Zeitrahmen in einem <a href="http://bueltge.de/tag/shortcode/">Shortcode</a> abzufragen.</p>
<pre><code class="php">
function content_only4time($content) {
	
	$date = strtotime( '01-10-2010' ); // day-month-year
	$now  = strtotime( date('d-m-Y') );
	echo $now . ' - ' . $date;
	if ( $date &#038;& ( $date < $now ) ) {
		
		return $content;
	} else {
		
		return __( '<br />Sorry, die Zeit ist noch nicht reif.', FB_TEXTDOMAIN );
	}
}
add_action( 'the_content', 'content_only4time' );
</code></pre>
<p>In diesem Zusammenhang kann das Plugin <a href="http://playground.ebiene.de/316/wpsleep-wordpress-plugin-zeitliche-steuerung-der-bestandteile-eines-artikels/">wpSleep</a> genutzt werden, welches via Shortcode und den Parametern der Zeit die Ausgabe steuert.</p>
<h4>Mehr</h4>
<p>Die Liste der Ansätze und vor allem der Möglichkeiten lässt sich beliebig fort führen - mit den Möglichkeiten kommt man eventuell auf eigene Ideen und kann die aufgezeigten Ansätze nutzen. Gern können weitere Ideen und Möglichkeiten in den Kommentaren untergebracht 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/kontrolle-inhalt-userrechten-zeit-wordpress/1177/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/kontrolle-inhalt-userrechten-zeit-wordpress/1177/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 Custom Post Type und Permalinks</title>
		<link>http://bueltge.de/wordpress-custom-post-type-permalinks/1194/</link>
		<comments>http://bueltge.de/wordpress-custom-post-type-permalinks/1194/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 09:42:46 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP3.0]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1194</guid>
		<description><![CDATA[Bei der Verwendung von Custom Post Types und aktiven Permalinks muss die neue Erzeugung der Permalinks beachtet werden! Die Rewrite Rules von WordPress müssen neu geschrieben werden.]]></description>
			<content:encoded><![CDATA[<p>Seit Version 3.0 von WordPress werden die <a href="http://wpengineer.com/impressions-of-custom-post-type/">Custom Post Types</a> unterstützt und man kann eigene Typen von Inhalten definieren - eher zu verstehen wie Seiten, nicht wie Artikel! Dabei kann automatisiert die Permalink-Struktur von WordPress unterstützt werden. Die bedeutet, wenn man einen eigenen Post Type anlegt, dann kann dieser bei aktiver Verwendung von Permalinks genutzt werden.</p>
<p>Aber die Permalinks klappen erst dann, wenn die Rewrite Rules von WordPress neu erzeugt wurden <span id="more-1194"></span>- vermutlich kommen da die vielen Fragen her. Wenn man einen neuen Post Type anlegt und damit spielt, kommt oft die Frage, warum der Aufruf des Custom Beitrags auf einen 404 führt - WordPress kennt die URL-Struktur in den Permalinks nicht und immer wieder vergisst man, dass man die Rewrite Rules neu erzeugen muss.<br />
Im einfachsten Fall speichert man das Setzen der Permalinks in den Einstellungen neu - alternativ kann man in sein Plugin oder das Theme die Funktion <code>flush_rewrite_rules()</code> integrieren. Diese bewirkt das erneute Setzen der Rewrite Rules.<br />
<strong>Wichtig</strong> ist, dies nur beim Aktivieren bzw. Deaktivieren des Plugins oder Themes zu tun; ansonsten wird man schnell in die Performance-Krenze laufen.</p>
<p>* Ich überlege, ob ich ein Plugin mit Verwendung der Custom Post Types bereit stelle, wobei ich verschiedene Erweiterungen integriert habe, die mir typisch in der Verwendung der Post Types erscheinen. Wie ist dazu die Meinung, oder ist dies eher Entwicklerwerkzeug und bei diesen Anwendern bekannt und damit für die Leser uninteressant oder zu viel 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/wordpress-custom-post-type-permalinks/1194/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-custom-post-type-permalinks/1194/feed/</wfw:commentRss>
		<slash:comments>27</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 Secure WordPress abgegeben</title>
		<link>http://bueltge.de/wordpress-plugin-secure-wordpress-abgegeben/1189/</link>
		<comments>http://bueltge.de/wordpress-plugin-secure-wordpress-abgegeben/1189/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 13:42:58 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1189</guid>
		<description><![CDATA[Das Plugin Secure WordPress wird von mir nicht mehr supportet, ich habe es an einen anderen Eigner übergeben. Für die Anwender bleibt trotzdem alles beim alten.]]></description>
			<content:encoded><![CDATA[<p>Das Plugin <a href="http://bueltge.de/wordpress-login-sicherheit-plugin/652/">Secure WordPress</a> verbindet einige Themen, um die WordPress Installation ein wenig sicherer zu machen. Das Plugin erfreut sich großer Beliebtheit und in einer der vergangenen Versionen habe ich den kostenlosen Scan eines Sicherheitsunternehmens integriert. Auch diese wird eifrig genutzt und das Bewusstsein zum Thema Sicherheit wird größer. Durch die Integration des externen Scans war ich häufig in Kontakt mit den Leuten dieses Unternehmens und ich habe im Zuge der Gespräche das Plugin an <a href="http://www.sitesecuritymonitor.com/secure-wordpress-plugin">Site Security Monitor</a> abgegeben. Damit übernehme ich keinen Support mehr.</p>
<p>Das Plugin ist weiterhin frei, Open Source und GPL. Für Anwender also kein Nachteil - für mich der Vorteil, dass ich eine Aufgabe weniger habe. Weitere Hinwiese gibt es von den neuen <a href="http://www.sitesecuritymonitor.com/blog/bid/43091/SSM-Takes-over-Leading-Wordpress-Security-Plugin">Entwicklern</a>. <span id="more-1189"></span><br />
Ich habe schon in der Vergangenheit Plugins abgegeben oder sterben lassen - dies ist immer eine Entscheidung des oder der Autoren. In diesem Fall ist wohl in beiden Nutzern gedient, denn der Backlink dieses Plugins ist sicher als hochwertig einzustufen und für Anwender bleibt das Plugin erhalten. Weitere Plugins von mir - die im SVN von WordPress gehostet sind, noch immer genug für den Abend, findet man über meinen <a href="http://wordpress.org/extend/plugins/profile/bueltge">User</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-plugin-secure-wordpress-abgegeben/1189/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-plugin-secure-wordpress-abgegeben/1189/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>Flattr Button für WordPress ohne Plugin</title>
		<link>http://bueltge.de/flattr-button-wordpress-ohne-plugin/1169/</link>
		<comments>http://bueltge.de/flattr-button-wordpress-ohne-plugin/1169/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 23:33:18 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1169</guid>
		<description><![CDATA[Aktuell ist Flattr in aller Munde und die Idee ist sicher einen Test wert, wie ich mich überzeugen lassen habe. Mal soll nur sein Urteil fällen, wenn man weiß, um was es geht und darum wollte auch ich Flattr testen und in das Blog integrieren. Allerdings sagt mit das Plugin nicht so zu und so ist eine kleine Funktion entstanden, die den Button integriert.]]></description>
			<content:encoded><![CDATA[<p><img class="alignrightob" src="http://bueltge.de/wp-content/images/flattr-logo-beta.png" alt="Flattr Logo" /><br />
Aktuell ist <a href="http://flattr.com/">Flattr</a> in aller Munde und die Idee ist sicher einen Test wert, wie ich mich überzeugen lassen habe. Mal soll nur sein Urteil fällen, wenn man weiß, um was es geht und darum wollte auch ich Flattr testen und in das Blog integrieren. Allerdings sagt mit das Plugin nicht so zu und so ist eine kleine Funktion entstanden, die den Button integriert.<br />
<span id="more-1169"></span></p>
<h4>Die Funktion</h4>
<p>Die folgenden kleine Funktion gehört in die <code>functions.php</code> des Themes oder auch in ein Plugin ausgelagert. Hier ist eurer Wissen gefragt - für mich ist es Theme-spezifisch und damit eine Funktion des Themes und damit in der <code>functions.php</code> des Themes.</p>
<pre><code>
/**
 * Flattr Button in WordPress Templates
 *
 * @author Frank Bültge
 * @link   Flattr API https://flattr.com/support/api
 * @param  integer  $uid   personal user ID
 * @param  string   $cat   Flattr category: text, images, video, audio, software or rest. 
 * @param  string   $btn   Type of Flattr button: '' or 'compact'
 * @param  integer  $hide  Use this to hide the thing from listings on flattr.com. The value 1 will hide the thing. 
 *
 */
function fb_flattr_link($uid = '', $cat = 'text', $btn = 'compact', $hide = 0) {
	
	$uid  = (int) $uid;
	$cat  = htmlspecialchars($cat);
	$btn  = htmlspecialchars($btn);
	$hide = (int) $hide;
	
	$noflattr = 0;
	$noflattr = (int) get_post_meta( get_the_ID(), 'noflattr', true );
	
	if ( !$uid )
		$uid = (int) get_post_meta( get_the_ID(), 'flattrid', true );
	
	if ( defined('WPLANG') )
		$locale = WPLANG;
	if ( empty($locale) )
		$locale = 'en_US';
		
	$ftag = '';
	$tags = get_the_tags( get_the_ID() );
	if ( $tags ) {
		foreach( $tags as $tag ) {
			$ftag .= $tag-&gt;name . ', ';
		}
		$ftag = substr( $ftag, 0, -2 );
	} else {
		$tag = '';
	}
	
	$dsc = htmlspecialchars( wp_strip_all_tags( trim( get_the_excerpt() ), TRUE ) );
	$dsc = str_replace( &quot;'&quot;, &quot;&quot;, $dsc );
	$dsc = str_replace( &quot;\n&quot;, &quot; &quot;, $dsc ); // maybe \r\n
	
	$tle = htmlspecialchars( strip_tags( get_the_title() ) );
	$tle = str_replace( &quot;'&quot;, &quot;&quot;, $tle );
	$tle = str_replace(":", "", $tle);

	$flattr = '
	&lt;span class=&quot;flattr&quot;&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			var flattr_uid  = \'' . $uid . '\';
			var flattr_url  = \'' . get_permalink() . '\';
			var flattr_tle  = \'' . $tle . '\';
			var flattr_dsc  = \'' . $dsc . '\';
			var flattr_cat  = \'' . $cat . '\';
			var flattr_lng  = \'' . $locale . '\';
			var flattr_tag  = \'' . $ftag . '\';
			var flattr_btn  = \'' . $btn . '\';
			var flattr_hide = ' . $hide . ';
		&lt;/script&gt;
		&lt;script src=&quot;http://api.flattr.com/button/load.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
	&lt;/span&gt;
	';
	
	if ( !$noflattr &amp;&amp; ( 0 != $uid ) )
		echo $flattr;
}
</code></pre>
<h4>Die Verwendung</h4>
<p>Innerhalb des Templates für die Beiträge, kommt dann die obige Funktion als Aufruf; in der Regel sollte der Aufruf in die <code>single.php</code> des Themes.</p>
<pre><code class="php">
&lt;?php if ( function_exists('fb_flattr_link') ) fb_flattr_link($uid = 'DEINE_UID'); ?&gt;
</code></pre>
<p>Es gibt im Code eine Abfrage, die ein benutzerdefiniertes Feld mit dem Namen <code>flattrid</code> abfragt. In diesem kann man eine ID mitgeben, so dass der Button in Abhängigkeit unterschiedlicher Autoren genutzt werden kann. Man muss dann die obige Funktion ohne die Übergabe des Parameters $uid nutzen, wie folgt:</p>
<pre><code class="php">
&lt;?php if ( function_exists('fb_flattr_link') ) fb_flattr_link(); ?&gt;
</code></pre>
<p>Eine Ausgabe erscheint dann nur, wenn eine ID zum Feld <code>flattrid</code> gepflegt ist und wenn das nachfolgende Feld <code>noflattr</code> ungleich 1 ist.</p>
<p>Ich habe noch ein benutzerdefiniertes Feld eingefügt - wenn man dies nutzt, als <code>noflattr</code> eingeben und als Wert <code>1</code>, dann wird der Button nicht ausgegeben. Ich denke, es gibt Beiträge, die brauchen keinen Flattr-Button, weil zum Beispiel der Content von anderen Leuten ist.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/noflattr.png" alt="benutzerdef. Feld in WordPress für die Deaktivierung des Flattr-Button" title="benutzerdef. Feld in WordPress für die Deaktivierung des Flattr-Button" /></p>
<p>Der Button wird innerhalb des span-Elementes mit der Klasse <code>flattr</code> ausgegeben und kann so via CSS angesprochen werden, kleines Beispiel.</p>
<pre><code class="css">
.flattr {
margin: 5px 0 0 5px;
}
</code></pre>
<p>Die Funktion kann in vielen Bereichen ausgebaut werden, zum Beispiel gibt es sicher die Überlegung, <del datetime="2010-06-10T12:16:28+00:00">dass man die ID mitgibt, so dass Blogs mit unterschiedlichen Autoren immer den Button zum jeweiligen Autor bekommen - eine beutzerdef. Feld für die ID kann da helfen</del> ist nun schon drin; die schönere Lösung wäre ein Profilfeld am Autor, welches dann in Abhängigkeit des Autors eines Beitrags gezogen wird - aber Flattr stellt ein Plugin, darum sollten die sich kümmern.</p>
<p>Ebenso könnte man alles in MetaBoxen auslagern (wie beispielsweise im Plugin <a href="http://bueltge.de/wordpress-plugin-flexibilitaet-schreiben/1086/">Different Type</a> gezeigt), damit benutzerfreundlicher machen und automatisiert vor den Content hängen oder in den Feed. Wobei der Feed ja so eine Sache ist, dient er doch dem Datentausch. Da Flattr aber eigene Plugins bereit stellt, wollte ich kein Plugin bauen und wer mag, nutzt die Funktion und erweitert sie sich entsprechend, wenn der jetzige Umfang nicht reicht.<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/flattr-button-wordpress-ohne-plugin/1169/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/flattr-button-wordpress-ohne-plugin/1169/feed/</wfw:commentRss>
		<slash:comments>62</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/flattr-logo-beta.png" />
		<media:content url="http://bueltge.de/wp-content/images/flattr-logo-beta.png" medium="image">
			<media:title type="html">Flattr Logo</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/noflattr.png" medium="image">
			<media:title type="html">benutzerdef. Feld in WordPress für die Deaktivierung des Flattr-Button</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>Traffic-Einblicke bei bueltge.de</title>
		<link>http://bueltge.de/traffic-einblicke-bei-bueltge-de/1167/</link>
		<comments>http://bueltge.de/traffic-einblicke-bei-bueltge-de/1167/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 10:13:21 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Webküche]]></category>
		<category><![CDATA[Linktipp]]></category>
		<category><![CDATA[Optimierung]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Statistik]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1167</guid>
		<description><![CDATA[Scheinbar ist man an Zahlen meines Blogs interessiert und immer wieder gibt es Fragen, mit welcher Technik ich arbeite. Ich bin kein Freak im Hinblick auf die Zahlen, habe nur wenige Vergleichszahlen und diese schwanken enorm. Insofern zeige ich mal die Werte des Monats März 2010 und ihr könnt ich selber einen Überblick verschaffen. Einige Punkt zur Technik werde ich gern im Anschluss verlieren.]]></description>
			<content:encoded><![CDATA[<p>Scheinbar ist man an Zahlen meines Blogs interessiert und immer wieder gibt es Fragen, mit welcher Technik ich arbeite. Ich bin kein Freak im Hinblick auf die Zahlen, habe nur wenige Vergleichszahlen und diese schwanken enorm. Insofern zeige ich mal die Werte des Monats März 2010 und ihr könnt ich selber einen Überblick verschaffen. Einige Punkt zur Technik werde ich gern im Anschluss verlieren.<br />
<span id="more-1167"></span><br />
Ich interessiere mich nicht sonderlich für Statistiken, fälsche auch keine und so glaube ich auch nur wenigen Auswertungen. Ich habe seit August 2009 <a href="http://www.haveamint.com/">Mint</a> als Statistik-Tool im Zugriff, weil ich mit <a href="http://piwik.org/">Piwik</a> - das kam vorher zum Einsatz - unzufrieden war. Liegt nicht an der Aufbereitung der Inhalte und der Entwicklung, sondern einfach daran, dass Piwik mit meinem Traffic Probleme hat und daher immer wieder unzuverlässig ist. Für externe Dienste bin ich nur schwer zu begeistern und so kam nach einigen Fragen bei Freunden das Tool Mint ins Haus. Der zweite und dritte Screenshot ist auch direkt von dort und es sollen nur zwei Bereiche aufgezeigt werden, für dich sich via Mail in der Regel am meisten interessiert wird.</p>
<h4>Hits &#038; Traffic</h4>
<p>Im ersten Screenshot seht ihr die Zahlen, die die <strong>Serverstatisik des Hosters</strong> ausspuckt.<br />
<img class="centered" src="http://bueltge.de/wp-content/images/traffic/traffic.png" alt="Traffic bei bueltge.de" /><br />
Ich meine, dass &asymp;4,4Millionen Hits pro Monat für ein One Man Show ganz gut sind; <a href="http://bueltge.de/probleme-fassen/965/">Probleme</a> hatte ich ja schon ausreichend und daher musste ich ja, da ich nicht den Provider wechseln wollte, auf einen eigenen Server wechseln. Dank <a href="http://wpseo.de/">Sergej von wpSEO</a> wird dieser auch ohne eigenes Zutun finanziert und so sind die Unkosten gleich null für mich persönlich - alternativ hatte ich überlegt, dass Blog anders zu fahren, da mir der Kostenaufwand für ein Freizeitprojekt recht hoch erschien.</p>
<h4>Besucherzahlen</h4>
<p>Der folgenden Screenshot zeigt euch die Monatsstatistik, die seit dem Einsatz von Mint gesammelt wurden. ich habe mal beispielhaft die Werte des <strong>Monats März</strong> hinzugefügt.<br />
<img class="centered" src="http://bueltge.de/wp-content/images/traffic/besucherzahlen.png" alt="Besucherzahlen bei bueltge.de" /></p>
<h4>Populäre Seiten</h4>
<p>Woher kommen die Leute und was wollen Sie - einen kleinen Einblick schafft der Blick auf den folgenden Screenshot. Hier ist nicht zu sehen, dass das Feed meines Blogs immer die Nummer 1 ist, dort kommen im Schnitt &asymp;250.000 Anfragen und 130.000 Besucher rein. Bei meinem Blog sind ganz klar die Feedleser die Masse; der Feed war es auch, der mir damals die meisten Probleme generierte. Die <strong>250.000 Anfragen</strong> auf dem Feed sorgen für eine Last von <strong>14.423.036 kByte</strong>.<br />
<img class="centered" src="http://bueltge.de/wp-content/images/traffic/postpopular.png" alt="Populärste Seiten bei bueltge.de" /></p>
<h3>Hinter den Kulissen</h3>
<p>Das Blog läuft mir WordPress und auch sonst nutze ich keine Zaubertricks - setze auf klassische Methoden, die ich verstehe und kontrollieren kann. Ich bin der Meinung, dass Cache toll ist - aber man sollte wissen was man tut. Nicht selten befolgen Sites die Tipps aus dem Netz, verstehen aber nicht, was sie da tun und laufen dann in einem Problemfall in weitere Probleme rein. Blindes cachen bringt Ärger. Gerade im Umfeld von PHP und mySQL gibt es viele sehr unterschiedliche Methoden und wichtig ist mir, dass ich die Methode verstehe und möglichst keine Wissenschaft betreibe.</p>
<p>Zum Einsatz kommen möglichst nur Erweiterungen in WordPress, die ich selber schreibe, oder die ich geprüft habe. Dazu nutze ich den Editor und eigene Plugins von mir zur Analyse. Mir ist wichtig, dass die Last nicht durch Plugins enorm erhöht wird. Ebenfalls schaue ich genau auf die Last im Backend von WordPress, denn bei der wenigen Zeit die ich habe, will ich nicht noch auf Inhalte warten. Insofern beginnt eine Optimierung also bei der Installation, beim Theme und den Plugins, vor allem bei den Content-Filtern und ich nutze bewusst keine Widgets! Hier ist exakte, wissende und kontrollierte Arbeitsweise wichtig. Vieles an "Standard-caches" steuere ich via .htaccess; einen Einblick davon kann man sich in der <a href="http://code.google.com/p/wp-basis-theme/source/browse/trunk/basis/wp-root-tipps/.htaccess">Beispieldatei</a> vom <a href="http://wpbasis.de/">WP Basis Theme</a> im SVN machen.</p>
<p><strong>Am Rande:</strong> die größten Probleme machte mir in der Vergangenheit den Code, den ich in den Beiträgen darstelle, zu filtern. Der wurde via Filter maskiert und via Geshi formatiert - das war das aus ab einer gewissen Zugriffszahl. Aktuell arbeite ich mit einer eigenen Lösung und hinterlasse nur maskierten Code im Content, es läuft kein Filter mehr. Ich kenne kein Plugin für WordPress, was ich daher empfehlen kann, jeder Filter kann auf lange Sicht zu Problemen führen und das Blog ist abhängig vom Plugin, denn bei Deaktivierung wird der Code dann nicht selten interpretiert.</p>
<p>Im weiteren kommt nach Spielereien mit dem <a href="http://eaccelerator.net/">eAccelerator</a> der <a href="http://pecl.php.net/package/APC">APC</a> zum Einsatz. Hier habe ich keine handhabe, ich habe das Modul vom Hoster installieren lassen und kann nicht daran drehen. Aber innerhalb von WordPress habe ich eine Erweiterung laufen, die den Standard-Cache von WP mit dem APC nutzt und parallel läuft das Plugin <a href="http://www.w3-edge.com/wordpress-plugins/w3-total-cache/">W3 Total Cache</a> - dies ist aus meiner Sicht aktuell eines der Plugins, die man sich ansehen sollte, wenn man dahingehend Bedarf hat! Auch hier gilt, kontrolliert nutzen - nicht blind einschalten. Das Plugin hat sehr viele Funktionen, so dass man sehr schön gezielt schalten kann.<br />
Ich kenne die Meinungen zu dem Auslagern auf statische Seiten, zum Beispiel via Plugin Super Cache, verliere damit aber eine gewissen Freiheit und muss mich wesentlich mehr um das Cachen kümmern. Daher bevorzuge ich eher andere Themen. Ebenfalls kommt hier kein CDN zum Einsatz; in einem anderen Projekt mit viel Grafik war dies wirklich ein Schachzug und hat extreme Geschwindigkeit gebracht.</p>
<p><strong>Um es kurz zu machen:</strong> einige Einblicke in die Zahlen habe ich gebracht, gern zeige ich mehr, wenn man mag. Den technischen Aspekt möchte ich ungern klar darstellen, da aus meiner Sicht das Thema nicht schwarz &#038; weiß ist, sondern bedacht eingesetzt werden sollte und immer in Abhängigkeit der Anforderungen steht. Schreibe Reviews für Kunden, dann schaue ich mir jedes Detail an, gebe Empfehlungen und immer wieder gibt es Unterschiede. Nicht jeder hat unbegrenzte Möglichkeiten, nutzt Server Load Balancing für eine Verteilung der Last. Es gilt, mit bedacht und kontrolliert an der Performance drehen.</p>
<p><strong>Ein letzter Hinweis:</strong> wer mehr über die Optimierung bei sehr hohem Traffic wissen möchte, der sollte sich den <a href="http://twitter.com/fholzhauer/status/15198165020">Vortrag von Florian Holzhauer</a> ansehen. Er <a href="http://www.lawblog.de/index.php/archives/2010/06/01/blick-unter-die-haube-des-law-blog/">administriert das Lawblog</a> und dies hat &asymp;8Millionen Hits im Monat - ich bin also recht klein in der Blogwelt.<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/traffic-einblicke-bei-bueltge-de/1167/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/traffic-einblicke-bei-bueltge-de/1167/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/traffic/traffic.png" />
		<media:content url="http://bueltge.de/wp-content/images/traffic/traffic.png" medium="image">
			<media:title type="html">Traffic bei bueltge.de</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/traffic/besucherzahlen.png" medium="image">
			<media:title type="html">Besucherzahlen bei bueltge.de</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/traffic/postpopular.png" medium="image">
			<media:title type="html">Populärste Seiten bei bueltge.de</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>WP Maintenance Mode &amp; MySQLDumper</title>
		<link>http://bueltge.de/wp-maintenance-mode-mysqldumper/1158/</link>
		<comments>http://bueltge.de/wp-maintenance-mode-mysqldumper/1158/#comments</comments>
		<pubDate>Mon, 10 May 2010 09:37:33 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Sicherung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1158</guid>
		<description><![CDATA[Wer große Datenbanken einspielen musste oder gern außerhalb von WordPress ein Backup fahren will, der kommt meist nicht am MySQLDumper vorbei. Ein sehr nützliches Tool mit vielen kleinen Details und stetiger Weiterentwicklung. Mein Plugin WP Maintenance Mode ist ebenso der stetigen Weiterentwicklung unterworfen und ist ebenso wie andere Plugins im Laufe der Zeit gewachsen. Dabei spielen Wünsche von Lesern und Nutzern eine sehr große Rolle. Ich informiere zwar selten, denke aber, dass man durch das automatische Update immer etwas mitbekommen kann. In diesem Fall ist es einen kleinen Beitrag wert.]]></description>
			<content:encoded><![CDATA[<p>Wer große Datenbanken einspielen musste, ein Tool dazu haben will, oder gern außerhalb von WordPress ein Backup fahren will, der kommt meist nicht am <a href="http://www.mysqldumper.net/">MySQLDumper</a> vorbei. Ein sehr nützliches Tool mit vielen kleinen Details und stetiger Weiterentwicklung. Mein Plugin <a href="http://bueltge.de/wp-wartungsmodus-plugin/101/">WP Maintenance Mode</a> ist ebenso der stetigen Weiterentwicklung unterworfen und ist ebenso wie andere Plugins im Laufe der Zeit gewachsen. Dabei spielen Wünsche von Lesern und Nutzern eine sehr große Rolle. Ich informiere zwar selten, denke aber, dass man durch das automatische Update immer etwas mitbekommen kann. In diesem Fall ist es einen kleinen Beitrag wert.<br />
<span id="more-1158"></span><br />
<img class="alignrightob" src="http://bueltge.de/wp-content/images/logo-truck.png" alt="MySQLDumper Logo" /><br />
<a href="http://www.beedy.de/">Stefan</a> ist Nutzer meines Plugins und ebenso aktiver Nutzer des MySQLDumpers und ihm lag es am Herzen, dass man bei einem Backup mit Hilfe des Dumpers das Blog automatisch in Wartungsmodus fährt. Nur so ist eine korrekte Sicherung der Datenbank sicher gestellt. Daher habe ich mich entschlossen, das Plugin dafür zu ändern und einen Datenbank-Eintrag anzulegen, der explizit nur die Aktivierung des Wartungsmodus speichert. Dadurch kann der MySQLDumper auf diesen Eintrag zugreifen und ihn von Außen setzen. Vorher war dies nicht möglich, da ich alle Einträge in der Datenbank serialisiert ablege und daher nur einen Eintrag benötige, Performance und Übersicht sind damit verbessert.</p>
<h3>Kurzanleitung</h3>
<p>Die folgenden zwei Einträge müssen an die eigene Datenbank angepasst werden; Datenbank und Präfix setzen und gehören in die Einstellungen des MySQLDumpers. Das Plugin WP Maintenace Mode muss im Blog aktiv sein, die bevorzugten Einstellungen setzen und den Aktiv-Status inaktiv lassen - dieser wird dann via MySQLDumper gesetzt.</p>
<h4>Blog in den Wartungsmodus via SQL</h4>
<p><code>UPDATE `wp-database`.`wp-prefix_options` SET `option_value` = '1' WHERE `wp-prefix_options`.`option_name` = 'wp-maintenance-mode-msqld';</code></p>
<h4>Ende des Wartungsmodus via SQL</h4>
<p><code>UPDATE `wp-database`.`wp-prefix_options` SET `option_value` = '0' WHERE `wp-prefix_options`.`option_name` = 'wp-maintenance-mode-msqld';</code></p>
<p>Mit der aktuellen Version des Plugins ist es nun also möglich, dass man den Eintrag setzt und der Wartungsmodus ist aktiv. Eine <a href="http://www.beedy.de/2010/05/09/automatisches-backup-der-wordpress-datenbank/">anschauliche Anleitung</a> gibt es bei Stefan, der sich an die Arbeit gemacht hat und ein <a href="http://www.beedy.de/2010/05/09/automatisches-backup-der-wordpress-datenbank/">bebildertes Tutorial</a> erstellt hat. Alternativ findet man auf der <a href="http://wordpress.org/extend/plugins/wp-maintenance-mode/">Seite zum Plugin</a> im offiziellen Verzeichnis eine Kurzanleitung; diese ist auch in der <code>readme.txt</code> des Plugins zu finden oder ebenso gibt es eine Anleitung auf den <a href="http://forum.mysqldumper.de/post41207.html#41207">Seiten des MySQLDumper</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-maintenance-mode-mysqldumper/1158/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wp-maintenance-mode-mysqldumper/1158/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/logo-truck.png" />
		<media:content url="http://bueltge.de/wp-content/images/logo-truck.png" medium="image">
			<media:title type="html">MySQLDumper 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>Post-Thumbnails in der Artikelansicht</title>
		<link>http://bueltge.de/post-thumbnails-in-der-artikelansicht/1099/</link>
		<comments>http://bueltge.de/post-thumbnails-in-der-artikelansicht/1099/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 09:11:27 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1099</guid>
		<description><![CDATA[Mit WordPress Version 2.9 wurde die Funktion der Post Thumbnail eingeführt. Über diese Funktion und dessen Randthemen wurde bereits hier und in anderen Blogs viel geschrieben. Von Vorteil empfinde ich es aber, wenn man direkt in der Übersicht der Artikel und Seiten das zugeordnete Thumbnail sieht, so dass man leicht die Verwendung zuordnen kann. Daher möchte ich einen kleinen Codeschnippsel vorstellen, der genau das macht.]]></description>
			<content:encoded><![CDATA[<p>Mit WordPress Version 2.9 wurde die Funktion der Post Thumbnail eingeführt. Über diese Funktion und dessen Randthemen wurde <a href="http://bueltge.de/wordpress-post-thumbnail-abwaertskompatibel/1079/">bereits hier</a> und in anderen Blogs viel geschrieben. Von Vorteil empfinde ich es aber, wenn man direkt in der Übersicht der Artikel und Seiten das zugeordnete Thumbnail sieht, so dass man leicht die Verwendung zuordnen kann. Daher möchte ich einen kleinen Codeschnippsel vorstellen, der genau das macht.<br />
<span id="more-1099"></span><br />
Die Funktion habe ich noch ein wenig ausgebaut, so dass nicht nur das Post Thumbnail gezogen wird, sondern wenn dieses nicht vergeben wurde, aber Bilder über die Upload-Funktion zum Post zugeordnet wurden, dann wird das erste Bild dieser Bilder gezogen. Dies ist vor allem dann interessant, wenn man vor WordPress 2.9 mit den Bildern aus der Mediathek das <a href="http://bueltge.de/wordpress-attachment-metadaten-nutzen/625/">gleiche Ziel erreicht hat</a>, wie mit der neuen Funktion des Post Thumbnail.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/post-thumbnail-edit.png" alt="Pos Thumbnail in der Übersicht der Beiträge" width="450" height="360" /></p>
<p>Der obige Screenshot sollte verdeutlichen, was die kleine Erweiterung macht. Der folgende Code muss lediglich in ein Plugin ausgelagert oder in die <code>functions.php</code> des Themes kopiert werden.</p>
<pre><code>
if ( !function_exists('fb_AddThumbColumn') &amp;&amp; function_exists('add_theme_support') ) {

	// for post and page
	add_theme_support('post-thumbnails', array( 'post', 'page' ) );

	function fb_AddThumbColumn($cols) {

		$cols['thumbnail'] = __('Thumbnail');

		return $cols;
	}

	function fb_AddThumbValue($column_name, $post_id) {

			$width = (int) 35;
			$height = (int) 35;

			if ( 'thumbnail' == $column_name ) {
				// thumbnail of WP 2.9
				$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
				// image from gallery
				$attachments = get_children( array('post_parent' =&gt; $post_id, 'post_type' =&gt; 'attachment', 'post_mime_type' =&gt; 'image') );
				if ($thumbnail_id)
					$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
				elseif ($attachments) {
					foreach ( $attachments as $attachment_id =&gt; $attachment ) {
						$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
					}
				}
					if ( isset($thumb) &amp;&amp; $thumb ) {
						echo $thumb;
					} else {
						echo __('None');
					}
			}
	}

	add_filter( 'manage_posts_columns', 'fb_AddThumbColumn' );
	add_action( 'manage_posts_custom_column', 'fb_AddThumbValue', 10, 2 );
}
</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/post-thumbnails-in-der-artikelansicht/1099/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/post-thumbnails-in-der-artikelansicht/1099/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/post-thumbnail-edit.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/post-thumbnail-edit.png" medium="image">
			<media:title type="html">Pos Thumbnail in der Übersicht der Beiträge</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>
	</channel>
</rss>

