<?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; WP</title>
	<atom:link href="http://bueltge.de/tag/wp/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>Minimum WordPress als Framework</title>
		<link>http://bueltge.de/minimum-wordpress-als-framework/1360/</link>
		<comments>http://bueltge.de/minimum-wordpress-als-framework/1360/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 12:20:26 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1360</guid>
		<description><![CDATA[Schlanker, schneller, einfacher - via Konstanten den WordPress Core entschlacken.]]></description>
			<content:encoded><![CDATA[<p>Ein kleiner Beitrag, für all diejenigen, die WordPress als Backend, Framework oder ähnliches einsetzen. Die Anwendungen, gerade im B2B Bereich, werden immer mehr, ebenso die Fragen dazu.</p>
<p>Bisher habe ich immer gern <a href="http://backpress.org/">BackPress</a> empfohlen, darauf verwiesen. Aber auch ein gepflegter Standard mit all seinen Vorteilen im Rahmen der Update-Philosophie ist machbar. WordPress reduziert das Initialisieren auf einem Minimum, wenn eine die Konstante <code>SHORTINIT</code> gesetzt ist.<br />
<span id="more-1360"></span><br />
Die <code>wp-settings.php</code> von WordPress ist der Schlüssel.</p>
<pre><code class="php">
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
	return false;
</code></pre>
<p>Damit ist der Ladeprozess um einiges schlanker und Dateien, die danach geladen werden, müssen via Plugin oder Theme integriert werden, sollte Funktionen daraus gebraucht werden. Die Möglichkeit lohnt. Nicht selten ist der Anteil WordPress in einigen Projekten so klein gegenüber den eigenen Entwicklungen, dass diese Überlegung und der Test die Zeit wert ist.</p>
<p>Die Aktivierung in der <code>wp-config.php</code> via <code>define( 'SHORTINIT', TRUE );</code> ist schnell erledigt und der Test kann starten.<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/minimum-wordpress-als-framework/1360/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/minimum-wordpress-als-framework/1360/feed/</wfw:commentRss>
		<slash:comments>15</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>Erste und letzte Seite in Seiten-Strukturen von WordPress erkennen</title>
		<link>http://bueltge.de/erste-und-letzte-seite-in-seiten-strukturen-von-wordpress-erkennen/1349/</link>
		<comments>http://bueltge.de/erste-und-letzte-seite-in-seiten-strukturen-von-wordpress-erkennen/1349/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 09:02:29 +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[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1349</guid>
		<description><![CDATA[Die erste und die letzte Seite in einer Struktur von Seiten kann nützlich sein, die kleinen Schnipsel tun genau dies; ausbauen und nutzen.]]></description>
			<content:encoded><![CDATA[<p>Ab und an sind kleines Schnipsel nützlich, sie sind einfach und trotzdem ist ein Denkanstoß hilfreich. Die folgenden kleinen Snippets sind solcher Natur.<br />
Für einen Fix in einem Premium-Theme der besonderen <img src='http://bueltge.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Art brauchte ich eine Auswertung, wo ich mich in der Seitenstruktur befinde und mit wenig Aufwand konnte ich so die Klassen erweitern und mittels CSS reagieren.</p>
<p>Der folgenden Code zeigt die Grundlage dafür und <code>get_pages()</code> ist der Schlüssel aus dem Core von WordPress um diese Resultate zu herzielen. Diese Funktion bringt das nötige Resultat mittels Parameter und die Ausgabe über den Parameter <code>sort_order</code> sorgt für die Reihenfolge und Identifizierung der jeweils ersten page, die dann entweder die erste oder die letzte Seite in dieser Struktur ist.<br />
<span id="more-1349"></span><br />
Vielleicht braucht es jemand, ansonsten dient es mir - wie immer - als öffentliche Ablage.</p>
<pre><code>
// First post in structure
// simple, but usefull <img src='http://bueltge.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> 
global $post;

$page_childs = get_pages( 'child_of=' . $post-&gt;post_parent . '&amp;sort_order=ASC' );
$first_child = $page_childs[0];

if ( get_the_ID() === (int) $first_child-&gt;ID )
 echo 'First Child';
</code></pre>
<pre><code>
// Last post in structure
global $post;

$page_childs = get_pages( 'child_of=' . $post-&gt;post_parent . '&amp;sort_order=DESC' );
$last_child  = $page_childs[0];

if ( get_the_ID() === (int) $last_child-&gt;ID )
 echo 'Last Child';
</code></pre>
<p>Vielleicht gelingt es mir auch wieder mehr Zeit für neue Beiträge zu finden und die Frequenz zu erhöhen, diverse Artikel zu publizieren und Freude dabei zu haben; nicht nur in Arbeit unter zu gehen.<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/erste-und-letzte-seite-in-seiten-strukturen-von-wordpress-erkennen/1349/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/erste-und-letzte-seite-in-seiten-strukturen-von-wordpress-erkennen/1349/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>Slides: WordPress Entwicklung</title>
		<link>http://bueltge.de/slides-wordpress-entwicklung/1350/</link>
		<comments>http://bueltge.de/slides-wordpress-entwicklung/1350/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 11:05:32 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[schulung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1350</guid>
		<description><![CDATA[WordPress Schulungen können verschieden Zielgruppen abholen; meine Slides zum Thema Entwicklung stehen nun online zur Verfügung.]]></description>
			<content:encoded><![CDATA[<p>Ich schule auf spezifische Anforderungen in Unternehmen das Thema WordPress; bisher immer Entwicklung und einige Kollegen aus dem <a href="http://edupress.de" title="EduPress  - WordPress-Schulungen und -Training">Inpsyde Team, unsere WordPress Agentur</a> übernehmen Schulungen im Umfeld Autoren, Redakteure und Backend Allgemein. In diesem Zusammenhang ist seit einigen Tagen die Plattform EduPress online und informiert.</p>
<p>Ich gehe bei meinen Schulungen speziell auf die Anforderungen der Zielgruppe ein und trotzdem gibt es immer einen grundlegenden Einstieg, den ich fast immer nutzen kann. In diesem Zusammenhang habe ich meine Folien für diese Themen nun aktualisiert und wer mag, kann diese unter der URL <a href="http://bueltge.de/wordpress-entwicklung/" title="Folien zur WordPress Entwicklungs-Schulung">bueltge.de/wordpress-entwicklung/</a> einsehen.<br />
Sollte es Hinweise, Korrekturen oder anderen Tipps geben - gern an mich.<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/slides-wordpress-entwicklung/1350/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/slides-wordpress-entwicklung/1350/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 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>Trenne Logik von der Ausgabe, mittels Hooks in WordPress</title>
		<link>http://bueltge.de/trenne-logik-von-der-ausgabe-mittels-hooks-in-wordpress/1335/</link>
		<comments>http://bueltge.de/trenne-logik-von-der-ausgabe-mittels-hooks-in-wordpress/1335/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 08:19:14 +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[MVC]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1335</guid>
		<description><![CDATA[MVC im Bezug auf WordPress und der Umgang mit Filtern um dem Ansatz von MVC zu folgen; ein kleiner Ausblick und Lösungsansatz zum Nachdenken.]]></description>
			<content:encoded><![CDATA[<p>Sobald innerhalb einer Funktion HTML für die Ausgabe definiert wird, muss das HTML von der Logik getrennt werden! In diesem Fall wird die Funktion doppelt definiert. Eine Funktion enthält ausschließlich Logiken und gibt Werten nur als return zurück. Die zweite Funktion enthält dann HTML, Prüflogik, Schleifen oder Hooks und gibt Werte als echo aus. Ok die Schlaueren werden jetzt sagen ey <a href="http://de.wikipedia.org/wiki/Model_View_Controller">MVC</a>, ich sage völlig richtig, aber WordPress verfolgt kein Konsequentes MVC-Pattern!<br />
<span id="more-1335"></span></p>
<h4>Warum WordPress kein MVC-Pattern konsequent verfolgt?</h4>
<p>Betrachteten wir WordPress auf eine beschränkte Sichtweise, kann man ein MVC-Pattern erkennen. Durch die Trennung der Themes (view) vom Core (Model) wird der Eindruck erweckt WordPress verfolgt ein MVC-Pattern. Aber dieses Muster ist nur im Fontend zu finden. Schauen wir allerdings etwas genauer hin sehen wir das es keine solche Logik für den Adminbereich gibt. Also muss die View für den Adminbereich irgendwo im Core verankert sein. Wir können auch feststellen das im Core selbst lose SQL-Query innerhalb von PHP zu finden ist. Gut, eine allgemeine Trennung von Ansicht und Logik ist nicht gleich MVC. Ein MVC-Pattern geht prinzipiell von einer Art objektorientierten Programmier-Paradigma aus, in WordPress sind diese auch vereinzelt zu finden, aber wir finden viel mehr prozedurale Programmier-Paradigmen als objektorientierte. Fazit WordPress selbst verfolgt kein MVC-Pattern, aber es ist durchaus möglich MVC-Prinziepien, wie im folgernden an zuwenden. </p>
<pre><code class="php">
function get_some_foo() {
	$my_foo = 'This is Foo!';
	return $my_foo;
}
 
function some_foo() {
	$foo = get_some_foo();
	echo $foo;
}
</code></pre>
<p>Warum ist das Sinnvoll? Wir wollen das die Funktion <code>some_foo()</code> eine vordefinierte Ausgaben zurückliefert. In einem anderen Template wollen wir aber das vordefinierte Verhalten der Funktion <code>some_foo()</code> verändern. Um nun beiden Anforderungen effektiv abzubilden, werden zwei Funktionen definiert. Die erste Funktion besteht einzig aus der elementaren Logik und gibt nur Werte als return zurück, ihr wird immer ein <code>get_…</code> vorangestellt. Die zweite Funktion enthält vordefinierte Darstellungsinformationen, das wiederum können HTML, Prüflogik, Schleifen oder ein Hook sein.</p>
<pre><code class="php">
function get_some_foo() {
	$foo_bar_array = array( 'Foo', 'Bar', 'FooBar', 'BarFoo' );
	$foo_bar_array = apply_filters( 'some_foo_array', $foo_bar_array );

	return $foo_bar_array ;
}
 
function some_foo() {
    $foo_list = '&lt;ul&gt;'; 
        
    foreach( get_some_foo() as $foo_key =&gt; $foo_value ){
		$foo_list .= '&lt;li&gt;' . $foo_value . '&lt;/li&gt;';        
    }
 
    $foo_list .= '&lt;/ul&gt;';
	
    echo apply_filters( 'some_foo', $foo_list );
}
</code></pre>
<p>Im vorherigen Beispiel wird in jeder der beiden Funktionen mit der Funktion <a href="http://codex.wordpress.org/Function_Reference/apply_filter"><code>apply_filters()</code></a> die möglichkeiten geschaffen, zurückgeliferte Werte später beliebig zu verändern. Eine Manipulation kann dann über die so definierten Hooks <code>some_foo_arra</code> oder <code>some_foo</code> erfolgen. Hier noch ein Beispiel, wie eine möglich Manipulation mit den beiden defineirten Hooks aussehen kann. </p>
<p>Im nächsten Code-Beispiel werden wir ein Array <code>$foo_bar_array</code> und das HTML von der Ausgbe Verändern. Dazu werden die beiden Hooks <code>some_foo_array</code> und <code>some_foo</code>, die mit <code>apply_filters( 'some_foo' ...</code> festgelegt wurden genutzt. Mit der Funktion <a href="http://codex.wordpress.org/Function_Reference/add_filter"><code>add_filter()</code></a> werden Filterfunktionen zur Weiterverarbeitung in der globalen Variable <code>$wp_filter</code> registriert.</p>
<pre><code class="php">
function get_my_some_foo( $foo_bar_array ) {
	$foo_bar_array[ count( $foo_bar_array ) + 1 ] = 'FuuBoo';
	
	return $foo_bar_array ;
}
 
function my_some_foo( $foo_list ) {
    $foo_list = str_replace( 'ul', 'ol', $foo_list ); 
	
    return $foo_list;
}
 
add_filter( 'some_foo_array', 'get_my_some_foo');
add_filter( 'some_foo', 'my_some_foo');
 
// do not forget, call some_foo()
some_foo();
</code></pre>
<p>Schauen wir uns noch kurz an was das ganze nun bewirkt. Was <code>some_foo()</code> ohne Manipulieren ausgibt sehen wir im folgenden Beispiel.</p>
<pre><code class="php">
function get_some_foo() {
	$foo_bar_array = array( 'Foo', 'Bar', 'FooBar', 'BarFoo' );
	$foo_bar_array = apply_filters( 'some_foo_array', $foo_bar_array );
	
	return $foo_bar_array ;
}
 
function some_foo() {
    $foo_list = '&lt;ul&gt;'; 
        
    foreach(get_some_foo() as $foo_key =&gt; $foo_value){
		$foo_list .= '&lt;li&gt;' . $foo_value . '&lt;/li&gt;';        
    }
 
    $foo_list .= '&lt;/ul&gt;';
	
    echo apply_filters( 'some_foo', $foo_list );
}
?&gt; 
 
//Ausgabe
&lt;ul&gt;
	&lt;li&gt;Foo&lt;/li&gt;
	&lt;li&gt;Bar&lt;/li&gt;
	&lt;li&gt;FooBar&lt;/li&gt;
	&lt;li&gt;BarFoo&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<p>Im nächsten Beispiel nutzen wir die in den Funktionen definierten Hooks <code>some_foo_array</code> und <code>some_foo</code> um dem Array ein weiteres Element hinzuzufügen und aus der ungeordneten Liste eine geordnete Liste zu machen.</p>
<pre><code class="php">
function get_my_some_foo( $foo_bar_array ) {
	$foo_bar_array[ count( $foo_bar_array ) + 1 ] = 'FuuBoo';
	
	return $foo_bar_array ;
}
 
function my_some_foo( $foo_list ) {
    $foo_list = str_replace( 'ul', 'ol', $foo_list ); 
	
    return $foo_list;
}
 
// register Hooks in the stack ($wp_filter)
add_filter( 'some_foo_array', 'get_my_some_foo');
add_filter( 'some_foo', 'my_some_foo');
?&gt;
 
//output
&lt;ol&gt;
	&lt;li&gt;Foo&lt;/li&gt;
	&lt;li&gt;Bar&lt;/li&gt;
	&lt;li&gt;FooBar&lt;/li&gt;
	&lt;li&gt;BarFoo&lt;/li&gt;
	&lt;li&gt;FuuBoo&lt;/li&gt;
&lt;/ol&gt;
</code></pre>
<p>Wie Läuft das jetzt mit dem <code>add_filter</code> und <code>apply_filters</code> im Programmfluss ab?<br />
Jeder Hook der ausgeführt werden soll wird mit <code>add_filter</code> oder <code>add_action</code> in der globalen Variable $<code>wp_filter</code> registriert. Wird nun im Programmablauf die Funktion <code>apply_filters()</code> aufgerufen wird anhand der übergeben Parameter die passende Filter-Funktion in der <code>$wp_filter</code> gesucht, wenn dieser mit <code>add_filter</code> dort registiert ist, wird die passende Funktion ausgeführt. Jetzt werden Werte Manipuliert und dann zurück an <code>apply_filters</code> übergeben.</p>
<p>Nehmen wir unser Beispiel von oben, dann sieht das wie folgt aus.</p>
<pre><code class="php">
&lt;?php
// the default function
function get_some_foo() {
	$foo_bar_array = array( 'Foo', 'Bar', 'FooBar', 'BarFoo' );
	$foo_bar_array = apply_filters( 'some_foo_array', $foo_bar_array );
 
	return $foo_bar_array ;
}
 
// the filter function
function get_my_some_foo( $foo_bar_array ) {
	$foo_bar_array[ count( $foo_bar_array ) + 1 ] = 'FuuBoo';
 
	return $foo_bar_array ;
}
 
// register function in $wp_filter
add_filter( 'some_foo_array', 'get_my_some_foo' );
?&gt; 
</code></pre>
<p>Ohne Hook-Funktionalität würde das Ganze wie folgt aussehen. Wir haben hier zwar wesentlich weniger Code aber dieser ist dafür nicht flexibel oder wiederverwendbar.</p>
<pre><code class="php">
&lt;?php
//Das ist unsere default Funktion
function get_some_foo() {
	$foo_bar_array = array( 'Foo', 'Bar', 'FooBar', 'BarFoo' );
	$foo_bar_array[ count( $foo_bar_array ) + 1 ] = 'FuuBoo';
  
	return $foo_bar_array ;
}
?&gt;
</code></pre>
<div class="contentdiv">
<h4>Gastbeitrag</h4>
<p><img src="http://wpengineer.com/wp-content/uploads/rene-reimann-150x150.jpg" alt="Rene Reimann Avatar" width="73" height="73" class="alignleft" /><br />
Dieser Beitrag ist aus der Feder von Renè Reimann - <a href="http://www.die-pixler.de/">die-pixler.de</a> und ist ein Beitrag zum Adventskalender auf <a href="http://www.die-pixler.de/">wpengineer.com</a> zum Thema WordPress.</p>
<p>Vielen Dank auch hier nochmal von meiner Seite an <a href="https://plus.google.com/u/0/116520935691953756105/about" title="Renes G+ Profile">Renè</a>.
</div>
<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/trenne-logik-von-der-ausgabe-mittels-hooks-in-wordpress/1335/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/trenne-logik-von-der-ausgabe-mittels-hooks-in-wordpress/1335/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/rene-reimann-150x150.jpg" />
		<media:content url="http://wpengineer.com/wp-content/uploads/rene-reimann-150x150.jpg" medium="image">
			<media:title type="html">Rene Reimann Avatar</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>Optionen aus WordPress an JavaScripts übergeben #1</title>
		<link>http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/</link>
		<comments>http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 09:19:50 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1329</guid>
		<description><![CDATA[Von PHP auf Werte in der DB zugreifen und an JavaScript übergeben, das JSON Objekt ist eine Möglichkeit dies zu tun und dieses Beispiel soll es verdeutlichen.]]></description>
			<content:encoded><![CDATA[<p>Auch in WordPress bleibt man nicht konstant in der PHP-Welt und so müssen Einstellungen, Daten aus der Datenbank an Scripte übergeben werden. In vielen Plugins findet man Lösungen in dem die <code>wp-load.php</code> geladen wird und damit der Zugriff auf alle Funktionen von WordPress. Vor geraumer Zeit hat <a href="http://ottopress.com/2010/dont-include-wp-load-please/">Otto (Samuel Wood)</a> auf diesen Umstand schon aufmerksam gemacht und der Artikel zeigt Lösungsansätze. Noch immer kommen dazu Fragen auf und noch immer erscheinen Plugins, die die wp-load.php genau auf Grund solcher Probleme laden.</p>
<p>Eine ähnliche Problematik stellt sich, wenn man den Source der Scripte nicht einfach in den Footer-Bereich von WordPress schreibt, sondern sauber in eine Datei auslagert und via <code>wp_enqueue_script()</code> inkludiert. Nur so kann WordPress diese Scripte mit verwalten, packen und optimiert ausliefern. Daher möchte ich in zwie Beispielen aufzeigen, wie man Daten von PHP an JS übergibt.<br />
<span id="more-1329"></span><br />
Die ersten Schnipsel nutzen die Übergabe von Werten via JSON; wobei ich die Werte aus der Datenbank mit den gängigen Mitteln in PHP hole und das Script direkt im head der Seite die Werte als Objekt ablegt.</p>
<pre><code>
add_action( 'admin_enqueue_scripts', 'fb_print_scripts' );

function fb_print_scripts() {
	global $current_screen;
	
	if ( isset( $current_screen -&gt; id ) &amp;&amp; ! in_array( $current_screen -&gt; id, array( 'post', 'page' ) ) )
		return;
	
	if ( is_plugin_active_for_network( plugin_basename( __FILE__ ) ) )
		$options = get_site_option( 'my_options_id' );
	else
		$options = get_option( 'my_options_id' );
	
	if ( ! $options )
		return;
	?&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		var my_json_object = &lt;?php echo htmlspecialchars( json_encode( $options ) ); ?&gt;;
	&lt;/script&gt;
	&lt;?php
}
</code></pre>
<p>Die obige Funktion gibt nun die Werte aus der Datenbank als JSON-Objekt in den head im Backend, da im ersten Schritt der Funktion die Seite abgefragt wird. Mittes <code>$current_screen</code> wird geprüft, so dass nur ausgeliefert wird, wenn man auf der definierten Seiten (post, page) ist.</p>
<p>Der folgende Schritt ist üblich und best practice in WordPress um Scripte einzubringen. Dabei inkludiere ich das JS-File, welches dann auf das JSON-Objekt zugreift.</p>
<pre><code>
add_action( 'admin_enqueue_scripts', 'fb_admin_enqueue_scripts' );

function fb_admin_enqueue_scripts( $where ) {
	
	if ( ! in_array( $where, array( 'post.php', 'post-new.php', ) )
		return;
	
	$suffix = defined('SCRIPT_DEBUG') &amp;&amp; SCRIPT_DEBUG ? '.dev' : '';
	
	wp_enqueue_script(
		self :: get_textdomain() . '_script', 
		plugins_url( '/js/my_script' . $suffix. '.js', __FILE__ ), 	
		array( 'jquery', 'my_other_script' ),
		'',
		TRUE
	);
	
}
</code></pre>
<p>Im Script wird dann direkt auf das Objekt zugegriffen, welches verarbeitet wird.</p>
<pre><code class="javascript">
jQuery( document ).ready( function( $ ) {
	
	if ( typeof my_json_object == 'undefined' )
		return;

// debug in console of Browser
console.dir( my_json_object ); 

});
</code></pre>
<p>Eine weitere Lösung soll im Folgebeitrag der diesjährigen Serie vorgestellt werden; der Link folgt. - hier nun <a href="http://bueltge.de/daten-aus-wordpress-an-javascript-uebergeben-2/1334/">der Link</a>, nach dem der <a href="http://bueltge.de/daten-aus-wordpress-an-javascript-uebergeben-2/1334/" title="Daten aus WordPress an JavaScript übergeben #2">Artikel</a> online ist.<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/optionen-aus-wordpress-an-javascripts-uebergeben/1329/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/optionen-aus-wordpress-an-javascripts-uebergeben/1329/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress, WPCron und die richtige Zeit</title>
		<link>http://bueltge.de/wordpress-wpcron-und-die-richtige-zeit/1333/</link>
		<comments>http://bueltge.de/wordpress-wpcron-und-die-richtige-zeit/1333/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 08:38:59 +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[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1333</guid>
		<description><![CDATA[Probleme mit dem WordPress Cron und der richtigen Zeit muss man wissen, dann lassen sie sich einfach umgehen.]]></description>
			<content:encoded><![CDATA[<p>WordPress bietet eine Pseudo-Cronjob-Funktionalität, welche es dem Entwickler erlaubt zeitgesteuerte Events auszuführen. Zum Beispiel funktioniert die komplette Update-Notification darüber. In diesen sogenannten <em>Scheduled Events</em> kann man auch selbst eigene Jobs definieren. Dabei sollte man aber auf eine wichtige Sache achten: Die Zeit.<br />
<span id="more-1333"></span><br />
Die <code>wp-cron.php</code> arbeit etwas abseits vom Core und lädt nur die wichtigsten Sachen und lässt sämtliche Einstellungen von WordPress offen. Die in <em>Settings -> General</em> eingestellte Timezone wird dabei nicht berücksichtigt. <code>wp-cron.php</code> läuft also definitiv und unveränderlich auf UTC.</p>
<p>Das heisst also folgendes: Sind wir in der Zeitzone Berlin ist die lokale Zeit UTC+1. Tragen wir ein Scheduled Event ein, hängt er immer eine Stunde nach. Um das zu ändern hilft folgende Funktion:</p>
<pre><code>
function get_offset_to_gmt_in_seconds() {

	$current_timezone_offset = get_option( 'gmt_offset' );
	$offset = $current_timezone_offset * 3600;

	return $offset;
}
</code></pre>
<div class="contentdiv">
<h4>Gastbeitrag</h4>
<p><img src="http://wpengineer.com/wp-content/uploads/dasllama-150x150.png" alt="Thomas Herzog Avatar" title="twitter_bigger" width="73" height="73" class="alignleft size-full wp-image-2132" /><br />
Dieser Beitrag ist aus der Feder von Thomas Herzog - <a href="http://hughwillfayle.de/">hughwillfayle.de</a> und ist ein Beitrag zum Adventskalender auf <a href="http://wpengineer.com/">wpengineer.com</a> zum Thema WordPress.<br />
Thomas Herzog ist Webentwickler im Team der <a href="http://inpsyde.com/">WordPress Agentur - Inpsyde GmbH</a>.</p>
<p>Vielen Dank auch hier nochmal von meiner Seite an <a href="http://profiles.wordpress.org/users/hughwillfayle/">Thomas</a>.
</div>
<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-wpcron-und-die-richtige-zeit/1333/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-wpcron-und-die-richtige-zeit/1333/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:thumbnail url="http://wpengineer.com/wp-content/uploads/dasllama-150x150.png" />
		<media:content url="http://wpengineer.com/wp-content/uploads/dasllama-150x150.png" medium="image">
			<media:title type="html">twitter_bigger</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>XML zu Array mit PHP</title>
		<link>http://bueltge.de/xml-zu-array-mit-php/1330/</link>
		<comments>http://bueltge.de/xml-zu-array-mit-php/1330/#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[WP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1330</guid>
		<description><![CDATA[Das Auslesen von XML ist mit PHP 5 extrem vereinfacht worden, hier eine Lösung um nach dem Auslesen einfach ein Array in PHP zur Verfügung zu haben.]]></description>
			<content:encoded><![CDATA[<p>Im Bezug auf das Importieren von Daten wird nicht selten auf XML gesetzt und im Anschluss muss ein Array an WordPress übergeben werden, welches in die Datenbank übergibt. Im Umfeld von Optionen in WordPress ist das gern genutzt.<br />
Um nach dem Parsen von XML ein Array in PHP zu bekommen, findet man immer wieder diverse Threads und Fragen. Im folgenden daher ein einfache und schnelle Lösung, die seit PHP 5 wunderbar funktioniert.<br />
<span id="more-1330"></span></p>
<pre><code class="php">
// only for errors an parse
$filename = preg_replace( 
    &quot;/\&lt;\!\[CDATA\[(.*?)\]\]\&gt;/ies&quot;,
    &quot;'[CDATA]' . base64_encode('$1') . '[/CDATA]'&quot;,
    $filename
);
// load cml file
$xml      = simplexml_load_string( $filename );
$json     = json_encode( $xml );
$options  = json_decode( $json,TRUE );
// see result
var_dump( $options );

// update in WordPress
update_option( 'my_settings_id', $options );
</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/xml-zu-array-mit-php/1330/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/xml-zu-array-mit-php/1330/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>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>Scripte von WordPress debuggen</title>
		<link>http://bueltge.de/scripte-von-wordpress-debuggen/1301/</link>
		<comments>http://bueltge.de/scripte-von-wordpress-debuggen/1301/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 08:18:41 +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[CSS]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1301</guid>
		<description><![CDATA[Die Ausgabe der verwalteten Scripte und Stylesheets kann mit der kleinen Funktion recht schnell gesichtet werden, eine kleine Lösung um Debuggen zu vereinfachen.]]></description>
			<content:encoded><![CDATA[<p>WordPress kann sich komfortabel um das verwalten von Scripten und Stylesheets kümmern, Vorraussetzung ist die Nutzung der Möglichkeiten rund um <code>wp_enqueue_script()</code> und <code>wp_enqueue_style()</code>. Will man sich um die darin übergeben Dateien kümmern, so kann eine kleine Funktion helfen und die integrierten Scripte und Styles zurück geben.<br />
<span id="more-1301"></span></p>
<h4>Einige Hintergründe</h4>
<p>Scripte und Stylesheets kann man in WordPress auf verschieden Art in die Ausgabe einbringen, das gilt für Backend und Frontend. Dabei ist das klassiche Verfahren eines meta-Elementes im head oder footer-Bereich nicht zu empfehlen, denn WordPress kann seit Version 2.1 die Verwaltung der Scripte und Stylesheets übernehmen - Vorraussetzung ist die Nutzung der Möglichkeiten rund um <code>wp_enqueue_script()</code> und <code>wp_enqueue_style()</code>. Damit werden diverse Vorteile direkt duch den WordPress-Kern übernommen; komprimieren und gemeinsames Ausliefern in jeweils einer Datei alle Scripte und Stylesheets. Ebenso kümmert sich WordPress darum, dass jedes Script nur einmal in der Auslieferung vorhanden ist; also nicht ein bekanntes Problem wie die mehrfache Verwendung von jQuery zulassen.<br />
Aktuell gibt es dazu immer wieder ähnliche Ansätze mit diversen JS-Lösungen. WordPress kann sich darum kümmern und optimiert ausliefern, jedes Script nur einmal und einfach via ID auf die Scripte zugreifen. </p>
<p>Um nun aber die includierten Scripte und Stylesheets sauber auszuwerten, bedarf es einiger Zugriffe oder die kleine folgende Lösung und schon sind alle eingebundenen Dateien in einer Liste. Die folgenden Funktion kippt die Adressen  einfach in den Footer von WordPress, Frontend - <code>wp_footer</code> und Backend - <code>admin_footer</code>, dies kann via Hook natürlich angepasst werden; dies soll nur eine Idee sein und einen Ansatz liefern.<br />
Parallel habe ich es im Plugin <a href="http://wordpress.org/extend/plugins/debug-objects/">Debug Objects</a> integriert und die neue Version sollte in den weihnachtlichen Tagen online gehen.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/wp-scripts-styles.png" alt="Beispiel für Script und Stylesheet Listings" width="450" height="598" /></p>
<pre><code>
// view on frontend footer
add_action( 'wp_footer', 'fb_urls_of_enqueued_stuff' );
// view on backend footer
add_action( 'admin_footer', 'fb_urls_of_enqueued_stuff' );
// get engueued scripts and style urls
function fb_urls_of_enqueued_stuff( $handles = array() ) {
	global $wp_scripts, $wp_styles;
	
	// scripts
	foreach ( $wp_scripts -&gt; registered as $registered )
		$script_urls[ $registered -&gt; handle ] = $registered -&gt; src;
	// styles
	foreach ( $wp_styles -&gt; registered as $registered )
		$style_urls[ $registered -&gt; handle ] = $registered -&gt; src;
	
	if ( empty( $handles ) ) {
		$handles = array_merge( $wp_scripts -&gt; queue, $wp_styles -&gt; queue );
		array_values( $handles );
	}
	$output = '';
	foreach ( $handles as $handle ) {
		if ( ! empty( $script_urls[ $handle ] ) )
			$output .= $script_urls[ $handle ] . '&lt;br&gt;';
		if ( ! empty( $style_urls[ $handle ] ) )
			$output .= $style_urls[ $handle ] . '&lt;br&gt;';
	}
	
	echo $output;
}
</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/scripte-von-wordpress-debuggen/1301/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/scripte-von-wordpress-debuggen/1301/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/wp-scripts-styles.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/wp-scripts-styles.png" medium="image">
			<media:title type="html">Beispiel für Script und Stylesheet Listings</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>unserialize() Error at offset... Einige Ansätze</title>
		<link>http://bueltge.de/unserialize-error-at-offset-einige-ansaetze/1332/</link>
		<comments>http://bueltge.de/unserialize-error-at-offset-einige-ansaetze/1332/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 01:16:10 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Adventskalender]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1332</guid>
		<description><![CDATA[Nicht immer ist das Problem offensichtlich und dazu gehört eine Fehlerausgabe im Bezug auf die Funktion unserialize(). In diesem Umfeld kommt es auf Grund unsauberer Daten im übergebenen Wert ab und an zu Problemen. Schaut man sich im Netz dazu um, findet man unzählige Hilfesuche und wenige Antworten, da meist das Problem in Quelle liegt, [...]]]></description>
			<content:encoded><![CDATA[<p>Nicht immer ist das Problem offensichtlich und dazu gehört eine Fehlerausgabe im Bezug auf die Funktion <code>unserialize()</code>. In diesem Umfeld kommt es auf Grund unsauberer Daten im übergebenen Wert ab und an zu Problemen. Schaut man sich im Netz dazu um, findet man unzählige Hilfesuche und wenige Antworten, da meist das Problem in Quelle liegt, im Wert der übergeben wird. Aber nicht immer hat man darauf Einfluss, insbesondere bei Debugginghelfern kommen da unterschiedliche Inhalte.</p>
<p>Um einigen Hilfesuchenden zu helfen, hier einige Lösungsvorschläge, die man abarbeiten kann. Einige sind nur im Zusammenhang mit WordPress zu nutzen, da die Funktion aus dem Core kommt. Ähnliche Sachen gibt es natürlich auch ohne WP.<br />
<span id="more-1332"></span><br />
Die Erste Lösung ist direkt in den Kommentaren von <a href="http://www.php.net/manual/de/function.unserialize.php#71270">PHP.net</a> zur Funktion hinterlegt. </p>
<pre><code class="php">
$object = preg_replace( '!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $object );
</code></pre>
<p>Ähnlich geht der folgende Ansatz:</p>
<pre><code class="php">
$object = preg_replace( '/;n;/', ';N;', $object );
</code></pre>
<p>Alternativ schwören <a href="http://ryanbosinger.com/blog/2009/php-unserialize-error-at-offset-simple-solution/">andere</a> auf die Verwendung von <code>trim()</code></p>
<pre><code class="php">
$object = trim( $object );
</code></pre>
<p>Aber auch mit diesen Lösungen kommt man nicht immer ans Ziel und die Abfrage, ob es sich um serialisierte Daten handelt muss her. Normalerweise kümmert sich <code>unserialize()</code> darum, aber wie gesagt; nicht immer hilft dies. WordPress stellt eigene Funktionen dafür zur Verfügung.</p>
<ul>
<li><code>is_serialized( $data )</code></li>
<li><code>is_serialized_string( $data )</code></li>
</ul>
<p>Mit diesen beiden Funktion kann sauber abgefragt werden.<br />
Aber auch da kann man mit einem einfachen Snippet ran; eventuell nicht der Weisheit letzter Schluss, daher lieber die Funktionen nutzen oder außerhalb von WP eine eigene Funktion, siehe <a href="https://gist.github.com/1415653" title="gist.github.com/1415653">Gist 1415653</a>.</p>
<pre><code class="php">
$is_serialized = preg_match( "/^(O:|a:)/", $object );
</code></pre>
<p>Vielleicht hilft es dem einen oder anderen, ansonsten nutze ich es als Gedächtnisstütze.<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/unserialize-error-at-offset-einige-ansaetze/1332/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/unserialize-error-at-offset-einige-ansaetze/1332/feed/</wfw:commentRss>
		<slash:comments>4</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>WP Feature Pointer in WordPress 3.3</title>
		<link>http://bueltge.de/wp-feature-pointer-in-wordpress-3-3/1308/</link>
		<comments>http://bueltge.de/wp-feature-pointer-in-wordpress-3-3/1308/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 10:51:36 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1308</guid>
		<description><![CDATA[WordPress Version 3.3 bringt Hinweise via Feature Pointer, kleine Hinweis-Boxen, und will so mehr Verständnis für die neuen Features erreichen. Diese kann man auf diverse Wege nutzen bzw. in bestimmten Situationen nicht wollen, dazu hier erste Infos.]]></description>
			<content:encoded><![CDATA[<p>Mit WordPress 3.3 wird ein mit dem Feature Pointer eine bekannte Idee aus anderen Tools übernommen. So kennt man beispielsweise aus Google Mail oder Doc die Hinweise zu neuen Umsetzungen in der Oberfläche, in dem man mit Bubbles auf diese neuen Möglichkeiten hinweist. In WordPress 3.3 wurde die Admin Bar überarbeitet &#8211; gelungen, wie ich finde &#8211; und darauf wird erstmalig mittels der Feature Pointer hingewiesen. <span id="more-1308"></span><br />
<a href="http://bueltge.de/wp-content/images//wp-pointer.png"><img src="http://bueltge.de/wp-content/images//wp-pointer-450x111.png" alt="" title="wp-pointer" width="450" height="111" class="aligncenter size-medium wp-image-1309" /></a><br />
Ist man im Umfeld von Kunden, kann es sein, dass dies nicht gewollt ist - verschieden Scenarios sind hier denkbar. Aber auch hier setzt WordPress auf die Hooks und so kann man auf verschiedene Art und Weise eingreifen. Eine Idee ist, die Nutzereinstellungen der User anzupassen, da die Feature Points mittels Javascript eine Option in der Tabelle ablegen, so dass man die gelesen Hinweise nicht nochmals sieht. Alternativ kann man sie deaktivieren via Hook; folgende kleine Lösung in ein Plugin oder die functions.php des Themes (wobei Zweites eher ungeeignet) kann helfen.</p>
<pre><code>
add_filter( 'show_wp_pointer_admin_bar', '__return_false' );
</code></pre>
<p>Hat man als Anwender die Admin Bar nicht aktiv bzw. sie ist global deaktiviert, dann werden auch keine Feature Points dazu angezeigt.</p>
<p>Ebenfalls kann man die Hooks nutzen und eigene Feature Points einsetzen. Ohne Anpassung im Design und Position ist damit folgendes einfaches beispiel denkbar. Soll die Position verändert werden, so genügt die Anpassung im Script-Abschnitt zu JS-Funktion <code>pointer()</code> in der PHP-Funktion <code>get_content_in_wp_pointer()</code>. Die Funktion <code>pointer()</code> kann mittels verschiedener Parameter (<code>content, position, arrow, close</code>) gesteuert werden.</p>
<pre><code>
function get_content_in_wp_pointer() {
	$pointer_content  = '&lt;h3&gt;' . __( 'WP Pointer with version 3.3.', 'my_textdomain' ) . '&lt;/h3&gt;';
	$pointer_content .= '&lt;p&gt;' . __( 'Add your own informations to WP Pointer.', 'my_textdomain' ) . '&lt;/p&gt;';

?&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
jQuery(document).ready( function($) {
	$('#wpadminbar').pointer({
		content: '&lt;?php echo $pointer_content; ?&gt;',
		position: {
			my: 'left top',
			at: 'center bottom',
			offset: '-25 0'
		},
		close: function() {
			setUserSetting( 'p1', '1' );
		}
	}).pointer('open');
});
//]]&gt;
&lt;/script&gt;
&lt;?php
}

function fb_enqueue_wp_pointer( $hook_suffix ) {
	$enqueue = FALSE;
	
	$admin_bar = get_user_setting( 'p1', 0 ); // check settings on user
	// check if admin bar is active and default filter for wp pointer is true
	if ( ! $admin_bar &amp;&amp; apply_filters( 'show_wp_pointer_admin_bar', TRUE ) ) {
		$enqueue = TRUE;
		add_action( 'admin_print_footer_scripts', 'get_content_in_wp_pointer' );
	}
	// in true, include the scripts
	if ( $enqueue ) {
		wp_enqueue_style( 'wp-pointer' );
		wp_enqueue_script( 'wp-pointer' );
		wp_enqueue_script( 'utils' ); // for user settings
	}
}
add_action( 'admin_enqueue_scripts', 'fb_enqueue_wp_pointer' );
</code></pre>
<p><a href="http://bueltge.de/wp-content/images//wp-pointer-2.png"><img src="http://bueltge.de/wp-content/images//wp-pointer-2-450x144.png" alt="" title="wp-pointer-2" width="450" height="144" class="aligncenter size-medium wp-image-1310" /></a></p>
<p><strong>Bitte beachten:</strong> die Umsetzung basiert auf einer Nightly Build von WordPress, nicht das Release 3.3 und damit kann sich noch etwas ändern oder es sind andere Lösungen möglich. Daher bitte je nach Version von WordPress die Lösung validieren. Als Tipp sollte es ausreichen - alles andere ist Kreativität und Können.<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-feature-pointer-in-wordpress-3-3/1308/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wp-feature-pointer-in-wordpress-3-3/1308/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp-pointer-200x149.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp-pointer.png" medium="image">
			<media:title type="html">wp-pointer</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/wp-pointer-200x149.png" />
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp-pointer-2.png" medium="image">
			<media:title type="html">wp-pointer-2</media:title>
			<media:thumbnail url="http://bueltge.de/wp-content/images/wp-pointer-2-200x192.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>p-Tag bei Bilden in WordPress ersetzen</title>
		<link>http://bueltge.de/p-tag-bei-bilden-in-wordpress-ersetzen/1306/</link>
		<comments>http://bueltge.de/p-tag-bei-bilden-in-wordpress-ersetzen/1306/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 10:51:44 +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[html5]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1306</guid>
		<description><![CDATA[Nicht immer sollen Bilder innerhalb des Content in p-Tags eingebettet werden. In  meinem Fall war die Semantik des figure-Tag gefragt und so blieb nur eine Lösung via Filter auf den Content, den ich hier kurz vorstellen möchte.]]></description>
			<content:encoded><![CDATA[<p>Die Nutzung von HTML5 halte ich persönlich für sinnvoll und ich mag die neuen Möglichkeiten, auch im Bereich der Semantik.</p>
<p>WordPress hat eine Besonderheit beim Ausliefern von Inhalten, die aus dem Editor kommen &#8211; das Setzen von Breaks und Absätzen. Historisch bedingt kümmert sich WordPress darum und nicht der TinyMCE; gleiches gilt bei der Integration von Bildern oder anderen Elementen dieser Art.</p>
<p>Um die Nutzung von HTML5 sauber abzubilden musste in einem Projekt der p-Tag durch den <a href="http://dev.w3.org/html5/markup/figure.html" title="figure with optional caption">figure</a>-Tag ersetzt werden und so ist folgender kleiner Filter entstanden.<br />
<span id="more-1306"></span><br />
Als kleiner Hintergrund zum figure-Tag lasse ich das folgenden Zitat stehen oder ihr nutzt das Web mit seinen vielfältigen Antwortformen.</p>
<blockquote><p>
<strong>HTML5 &lt;figure&gt; Tag</strong><br />
Viele Medien können nicht von Suchmaschinen oder behinderten Menschen erfasst werden. Um diese Medien textlich zugänglich zu machen, kann man sie per &lt;figure&gt; Tag an eine Beschreibung binden.<br />
<cite><a href="http://scriptshit.de/blog/show/HTML5-Tag-bersicht-und-Dokumentaufbau">Robert Agthe</a></cite></p></blockquote>
<p>Ich bin nicht sonderlich begabt bei Regex-Ausdrücken und würde mich freuen, wenn es Verbesserungen und Ideen zur Lösung gibt, da diese Art des öfteren genutzt wird und die Nutzung von HTML5 geht voran. Inwieweit WordPress darauf reagiert, ist aktuell nicht abzusehen und an dieser Stelle konnte ich auch keinen Filter erkennen, so dass man ohne einen Regex an diese Stelle kommt und die Vorgabe von WordPress ändert. In diesem Zusammenhang gibt es einige Themen, die einer Überarbeitung von WordPress bedarf um den Editor sauber mittels HTML5 zu nutzen; im <a href="http://wpbasis.de" title="WP Basis Projektsite">Basis Theme</a> habe ich in der <a href="http://code.google.com/p/wp-basis-theme/source/browse/trunk/basis-html5/functions.php" title="die functions.php des HTML5 Basis Theme">HTML5 Version</a> schon einige Sachen integriert.</p>
<pre><code>
// unautop for images
function fb_unautop_4_img( $content ) {
    
    $content = preg_replace( 
        '/&lt;p&gt;\\s*?(&lt;a rel=\&quot;attachment.*?&gt;&lt;img.*?&gt;&lt;\\/a&gt;|&lt;img.*?&gt;)?\\s*&lt;\\/p&gt;/s',
        '&lt;figure&gt;$1&lt;/figure&gt;',
        $content
    );
    
    return $content;
}
add_filter( 'the_content', 'fb_unautop_4_img', 99 );
</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/p-tag-bei-bilden-in-wordpress-ersetzen/1306/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/p-tag-bei-bilden-in-wordpress-ersetzen/1306/feed/</wfw:commentRss>
		<slash:comments>26</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 Plugin &amp; Theme-Editor via Konstante deaktivieren</title>
		<link>http://bueltge.de/wordpress-plugin-theme-editor-via-konstante-deaktivieren/1300/</link>
		<comments>http://bueltge.de/wordpress-plugin-theme-editor-via-konstante-deaktivieren/1300/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 09:54:36 +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[backend]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1300</guid>
		<description><![CDATA[Es kann sehr riskant sein, den Editor für Plugins und Themes aktiv zu lassen; eine einfache Lösung diese zu deaktivieren stellt die Nutzung von Konstanten dar, die von WordPress vorgegeben werden.]]></description>
			<content:encoded><![CDATA[<p>WordPress ist bekannt dafür, dass diverse Konstanten im Core schlummern und oft schnelle Lösungen schaffen. Im Zusammenhang des Editors im Backend von WordPress oder dem Updaten des Systems gib es ebenso solche Konstanten, die mir neulich bei Arbeiten an dieser Stelle des Core untergekommen sind. Daher zwei kleine Strings, die schnell ein Lösung herbei schaffen können. So weit mir bekannt, sind alle hier genannten Konstanten seit Version 3.0 im System.<br />
<span id="more-1300"></span><br />
Die erste Konstante nimmt die Editoren aus dem Backend und verbietet den Zugang dahin. Damit ist das Editieren von Theme und Plugin-Dateien aus dem Backend mit Standard-Lösungen nicht möglich.</p>
<pre><code class="php">
// for enabling/disabling theme/plugin editor
define( 'DISALLOW_FILE_EDIT', TRUE );
</code></pre>
<p>Die zweite hier vorgestellte Konstante verbietet das Editieren, Modifizieren bzw. Ändern von Dateien aus dem Core, Plugins oder Themes. In dem Zusammenhang sind auch die Menueinträge im Backend nicht sichtbar bzw. nutzbar. Damit ist auch das Update nicht so einfach machbar und Kunden und nicht authentifizierte User sind schnell geblockt.</p>
<pre><code class="php">
// Disallow anything that creates, deletes, or edits core, plugin, or theme files.
// Files in uploads are excepted.
define( 'DISALLOW_FILE_MODS', TRUE );
</code></pre>
<p>In dem Zusammenhang gibt es zwei weitere Konstanten, die ab und an nützlich sind.<br />
Die erste ist immer mal wieder in den <a href="https://plus.google.com/110569673423509816572/posts/EoprewRMWa6">Schlagzeilen</a>, da damit diverse Abfragen konsolidieren. IN diversen Umfeldern ist es aber sehr nützlich, dass alle User der Installation die Möglichkeit haben: ungefiltertes HTML zu schreiben, in allen Aspekten und dies kann ebenso einfach via Konstante realisiert werden.</p>
<pre><code class="php">
// Disallow unfiltered_html for all users, even admins and super admins
DISALLOW_UNFILTERED_HTML
</code></pre>
<p>Ähnliches gibt es im Umfeld der Uploads.</p>
<pre><code class="php">
// Allow uploads of filtered file types to users with administrator role
ALLOW_UNFILTERED_UPLOADS
</code></pre>
<p>Die Konstanten gehören in die <code>wp-config.php</code> der Installation.</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-plugin-theme-editor-via-konstante-deaktivieren/1300/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-plugin-theme-editor-via-konstante-deaktivieren/1300/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>WordPress Such-URL ändern</title>
		<link>http://bueltge.de/wordpress-such-url-aendern/1293/</link>
		<comments>http://bueltge.de/wordpress-such-url-aendern/1293/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 06:48:00 +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[SEO]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1293</guid>
		<description><![CDATA[Die WordPress interne Suche kann ebenso mit schönen URLs arbeiten, eine einfache Funktion erlaubt die Anpassung und schon kann die URL einfach uns leserlich genutzt werden.]]></description>
			<content:encoded><![CDATA[<p>WordPress sorgt dafür, wenn aktiviert, dass &#8222;schöne&#8220; lesbare URLs genutzt werden. Lediglich die Suche ist davon bisher nicht betroffen; sie kommt mit der bekannten Syntax <code>?s</code> im Standard aus. Aber auch hier kann man ansetzen und  die URL seinen Bedürfnissen entsprechend anpassen.</p>
<p>Das folgenden Beispiel soll es verdeutlichen. Im Standard von WordPress, trotz aktiver Permalinks, sieht die URL zu den beiden Suchbegriffen <em>wordpress</em> und <em>beratung</em> wie folgt aus: <code>bueltge.de/?s=wordpress+beratung&#038;submit=Search</code>. Mit Hilfe einer kleinen Funktion, die den Redirect anspricht, kann die URL angepasst werden. In meinem Fall, mit der zugehörigen nachfolgenden Funktion sieht die URL zu diesen beiden Suchbegriffen dann wie folgt aus: <code>bueltge.de/search/wordpress+beratung</code>.<br />
<span id="more-1293"></span><br />
Die Funktion, die ich einsetze, seht im folgenden Abschnitt. Innerhalb der WP-Funktion <code>wp_redirct</code> lege ich die Ausgabe fest, in dem ich den Begriff <em>search</em> zur <em>home-url</em> der Installation addiere und im Anschluss die Suchbegriffe ergänze. Dies kann man beliebig gestallten und je nach Anforderung so dass beste Ergebnis erziehlen.</p>
<pre><code>
function fb_change_search_url_rewrite() {
	if ( is_search() &amp;&amp; ! empty( $_GET['s'] ) ) {
		wp_redirect( home_url( &quot;/search/&quot; ) . urlencode( get_query_var( 's' ) ) );
		exit();
	}	
}
add_action( 'template_redirect', 'fb_change_search_url_rewrite' );
</code></pre>
<p>Die Funktion legt man im besten Falle in einem Plugin ab oder alternativ in der <code>functions.php</code> des Themes. Schöne und verbesserte Lösungen sind wie immer willkommen und das Kommentarfeld steht dazu bereit.</p>
<p><strong>Update</strong><br />
Aus den Kommentaren und Diskussionen ist ebenso eine Lösung entstanden, die explizit eine Lösung via Hook anspricht und so eine frei Benennung ohne Probleme zulässt; nicht desto trotz sollte man sich die Lösung via .htaccess überlegen.</p>
<pre><code>
function custom_search_url( $search_rewrite ) {

	if( ! is_array( $search_rewrite ) ) 
		return $search_rewrite;
	
	$new_array = array();
	foreach( $search_rewrite as $pattern =&gt; $s_query_string ) {
		$new_array[ str_replace( 'search/', 'my-search-url/', $pattern ) ] = $s_query_string;
	}
	$search_rewrite = $new_array;
	unset( $new_array );
	
	return $search_rewrite;
}
add_filter( 'search_rewrite_rules', 'custom_search_url' );
</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-such-url-aendern/1293/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-such-url-aendern/1293/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>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>Suche in WordPress Nav Menu</title>
		<link>http://bueltge.de/suche-in-wordpress-nav-menu/1291/</link>
		<comments>http://bueltge.de/suche-in-wordpress-nav-menu/1291/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 19:40: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[Entwicklung]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1291</guid>
		<description><![CDATA[Das WordPress Nav Menu und die Integration des Suchfeld bedarf nur weniger Zeilen Code und etwas Anpassung via Stylesheet, eine Lösung möchte ich hier vorstellen.]]></description>
			<content:encoded><![CDATA[<p>Seit der Einführung des <a href="http://codex.wordpress.org/Function_Reference/wp_nav_menu" title="Doku im Codex">WP Nav Menu</a>, lieben Kunden die Funktion um ihre Navigationen selbst mit Inhalten zu versorgen und Anpassungen recht einfach vorzunehmen. Dabei steht auch das Suchfeld ab und an auf der Wunschliste. In diesem Zusammenhang sind mir bei einigen Reviews von WordPress Installation die unmöglichsten Lösungen untergekommen, die eher Sorgen als Freude bereiten.</p>
<p>Daher hier ein einfache und doch sinnvolle Lösung, um das Suchformular in die Navigation zu holen. <span id="more-1291"></span><br />
Dabei wird die Standard-Funktion von WordPress für die Suche genutzt - <code>get_search_form()</code>. Sollte dies also auch anderweitig genutzt werden, so gilt auf das Stylesheet zu achten. Ansonsten genügt das folgende Snippet und das Suchformular ist in der Navigation.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/search-wp-nav-menu.png" alt="Suche im  WordPress Nav Menu" /></p>
<p>Die Funktion und der Aufruf gehört in die <code>functions.php</code> des Themes und die Anpassung des Stylesheet in die jeweilige Datei des Themes, oft die <code>style.css</code>.</p>
<pre><code>
function fb_add_search_box ( $items, $args ) {
	
	// only on primary menu
	if( 'primary' === $args -&gt; theme_location )
		$items .= '&lt;li class=&quot;menu-item menu-item-search&quot;&gt;' . get_search_form( FALSE ) . '&lt;/li&gt;';
	
	return $items;
}
add_filter( 'wp_nav_menu_items', 'fb_add_search_box', 10, 2 );
</code></pre>
<p>Möchte man das Suchformular nur in einer bestimmen Navigation einfügen; insofern man diverse Nav Menus zulässt, dann genügt die Abfrage des Eintrags <code>theme_location</code> aus dem Argumenten-Array. Wenn es sich um das Menu handelt mit dem String n, dann ... - ein Beispiel:<br />
<code>if( 'primary' === $args -&gt; theme_location )</code></p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp/search-wp-nav-menu2.png" alt="Suche im  WordPress Nav Menu" /></p>
<p>Der Schlüssel für die Abfrage ist im Theme definiert, daher auch gut im Backend zu erkennen, wie der obige Screenshot darstellt. Viel Spaß beim Nutzen und Anpassen.<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/suche-in-wordpress-nav-menu/1291/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/suche-in-wordpress-nav-menu/1291/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp/search-wp-nav-menu.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp/search-wp-nav-menu.png" medium="image">
			<media:title type="html">Suche im  WordPress Nav Menu</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/images/wp/search-wp-nav-menu2.png" medium="image">
			<media:title type="html">Suche im  WordPress Nav Menu</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>Custom Post Types Rückgabe Funktion</title>
		<link>http://bueltge.de/custom-post-types-rueckgabe-funktion/1294/</link>
		<comments>http://bueltge.de/custom-post-types-rueckgabe-funktion/1294/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 15:42:15 +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[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1294</guid>
		<description><![CDATA[Das Auslesen der Inhalt von Custom Post Types in WordPress einfach via kleiner Hilfsfunktion.]]></description>
			<content:encoded><![CDATA[<p>Die Nutzung der Custom Post Types kann via Core recht leicht umgesetzt werden, einen kleine Funktion, die ich nutze um an bestimmter Stelle die Inhalte von dort zu holen möchte ich hier kurz ablegen. Nicht immer braucht man CPT für das Frontend oder im Query der Templates, darum nutze ich die folgende kleine Funktion um die Inhalte zu holen und an geeigneter Stelle zu verwerten. Dabei ist noch einiges an Potential für die Erweiterung offen, aber sie ist nutzbar.<br />
<span id="more-1294"></span><br />
Die Funktion als Plugin oder im Zugriff des Themes ablegen und darauf zugreifen. Dabei muss der String des Custom Post Type mitgegeben werden.<br />
Alternativ können Werte für die Custom Fields übergeben werden; bei einem Wert reicht die Übergabe als String</p>
<pre><code class="php">
get_custom_post_type_items( 'my_cpt', 'my_meta_key' );
</code></pre>
<p>oder via Array, wenn es sich um mehrere Werte handelt. </p>
<pre><code class="php">
get_custom_post_type_items( 'my_cpt', array( 'my_meta_key', 'my_meta_key2' ) );
</code></pre>
<p>Die Funktion gibt ein Array zurück, in dem sich alle Inhalte befinden.<br />
Parallel können über den Filter Hook <code>wp_basis_get_cpt_items</code> die Argumente verändert werden, so dass der folgende WordPress Query nach euren Bedürfnissen abläuft.</p>
<pre><code>
function get_custom_post_type_items( $custom_post_type, $meta_data_key = FALSE, $args = FALSE ) {
	
	if ( ! $custom_post_type )
		return NULL;
	
	$defaults = array(
		'post_type'      =&gt; $custom_post_type,
		'post_status'    =&gt; 'publish',
		'posts_per_page' =&gt; -1,
		'orderby'        =&gt; 'post_date',
		'order'          =&gt; 'DESC'
	);
	
	$args = wp_parse_args( $args, apply_filters( 'wp_basis_get_cpt_items', $defaults ) );
	
	$posts  = new WP_Query($args);
	$return = array();

	if ( $posts -&gt; have_posts() ) {
		while ( $posts -&gt; have_posts() ) {
			$posts -&gt; the_post();
			$post_id  = get_the_ID();
			$sub_post = new stdClass();
			$sub_post -&gt; post_id   = $post_id;
			$sub_post -&gt; title     = get_the_title();
			$sub_post -&gt; permalink = get_permalink($post_id);
			$sub_post -&gt; content   = apply_filters( 'the_content', get_the_content() );
			if ( $meta_data_key &amp;&amp; is_string($meta_data_key) ) {
				$meta_value = get_post_meta( $post_id, $meta_data_key, TRUE );
				if ( ! empty($meta_value) )
					$sub_post -&gt; meta_data = $meta_value;
			} elseif ( is_array($meta_data_key) ) {
				foreach ( $meta_data_key as $key ) {
					if ( ! empty($key) ) {
						$meta_value = get_post_meta( $post_id, $key, TRUE );
						if ( ! empty($meta_value) )
							$sub_post -&gt; meta_data[$key] = $meta_value;
					}
				}
			}
			
			$return[] = $sub_post;
		}
	}

	wp_reset_query();

	return $return;
}
</code></pre>
<p>Viel Freude beim Nutzen oder Erweitern.<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/custom-post-types-rueckgabe-funktion/1294/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/custom-post-types-rueckgabe-funktion/1294/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>
	</channel>
</rss>

