<?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; PHP</title>
	<atom:link href="http://bueltge.de/category/code/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://bueltge.de</link>
	<description>Frank Bültge schreibt auf bueltge.de zu den Themen Webentwicklung &#38; design, WordPress, Literatur und andere Themen bezüglich Internet und Development</description>
	<lastBuildDate>Wed, 09 May 2012 15:13:47 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>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>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 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>5</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>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>6</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/favicon.ico" />
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>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/">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>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 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>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>
		<item>
		<title>WordPress Content zeitversetzt darstellen</title>
		<link>http://bueltge.de/wordpress-content-zeitversetzt-darstellen/1282/</link>
		<comments>http://bueltge.de/wordpress-content-zeitversetzt-darstellen/1282/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 20:09:07 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1282</guid>
		<description><![CDATA[Das zeitversetzte Befüllen von Inhalten mit WordPress ist immer wieder Thema, eine kleine und einfache Lösung möchte ich hier aufzeigen.]]></description>
			<content:encoded><![CDATA[<p>Das Befüllen des Feeds um eine gewissen Verzögerung habe ich bereits vor langer Zeit <a href="http://bueltge.de/wordpress-feed-zeitversetzt-befuellen/806/" title="WordPress Feed zeitversetzt befüllen">erläutert</a>, wobei im Grunde nur das SQL-Statement erweitert wird und um einen gewissen Zeitraum kann dann später im Feed publiziert werden und so bleibt Raum zu korrigieren.<br />
Natürlich kann man diese Form der Spielereien beliebig betreiben und auch das Frontend später befüllen. Damit wird der Inhalt dem Leser erst nach einer gewissen Zeitspanne dargestellt. Ein kleines Scriptbeispiel soll zeigen, wie das geht. <span id="more-1282"></span></p>
<p>Die Funktion kann beliebig erweitert werden, so zum Beispiel mit Abfragen zu Rechten der geloggten User abfragen oder vielfältige andere Anforderungen.</p>
<p>Im ersten Snippet wird die Ausgabe auf dem Frontend immer gefiltert, nur im Backend <code>is_admin()</code> und im Feed <code>is_feed()</code> bleibt alles unangetastet. Der Filter ist im Beispiel auf 15 Minuten gesetzt und diese Werden mit der Einstellung von WordPress abgeglichen, damit die Zeitzone beachtet wird. Die 15 Minuten werden in Sekunden umgerechnet und vom Wert abgezogen.</p>
<pre><code>
function publish_later_on_frontend( $where ) {
	
	if ( is_admin() || is_preview() || is_feed() )
		return $where;
	
	$offset =  15; // minutes
	$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 60 ); // gmt offset of WP options minus custom time
	$where .= &quot; AND post_date &lt; '&quot; . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . &quot;'&quot;;
	
	return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
</code></pre>
<p>Ein weiteres kurzes Beispiel erlaubt es allen geloggten Usern, die minimal die Rechte zum Lesen <code>current_user_can('read')</code> haben - also Abonnenten, die Inhalte zu lesen. Alle anderen Besucher bekommen die Inhalte 10 Tage später dargestellt.</p>
<pre><code>
function publish_later_on_frontend( $where ) {
	
	if ( is_admin() || is_preview() || is_feed() || current_user_can('read') )
		return $where;
	
	$offset =  10; // days
	$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 24 * 60 * 60 ); // gmt offset of WP options minus custom time
	$where .= &quot; AND post_date &lt; '&quot; . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . &quot;'&quot;;
	
	return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
</code></pre>
<p>Na - andere Ideen mit der Konstellation? Dann gern in die Kommentare oder via Link hierher verweisen. Ebenso freue ich mich, wenn es Verbesserungen am Code gibt; gerade im Bereich Rechnen mit Zeit gibt es ja viel Spielraum.<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-content-zeitversetzt-darstellen/1282/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-content-zeitversetzt-darstellen/1282/feed/</wfw:commentRss>
		<slash:comments>40</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 Menu-Einträge entfernen</title>
		<link>http://bueltge.de/wordpress-menu-eintraege-entfernen/1281/</link>
		<comments>http://bueltge.de/wordpress-menu-eintraege-entfernen/1281/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 02:40:37 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WP]]></category>

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

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

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

		<guid isPermaLink="false">http://bueltge.de/?p=1259</guid>
		<description><![CDATA[Nicht jeder mag die WordPress Admin Bar, eingeführt mit WordPress 3.1, am oberen Rand des Browsers. Mit ein wenig CSS lässt sich das ändern.]]></description>
			<content:encoded><![CDATA[<p>Nicht jeder mag die WordPress Admin Bar, eingeführt mit WordPress 3.1, am oberen Rand des Browsers. Mit ein wenig CSS lässt sich das ändern. Die folgende kleine Funktion bringt etwas CSS direkt in den Footer von Backend und Frontend ein und sorgt dafrü, dass die Admin Bar an den unteren Rand verschoben wird.<br />
<span id="more-1259"></span><br />
Der Code läßt sicher viel Raum für Erweiterungen, wie das implementieren mit Hilfe eines externen CSS-Stylesheets um es in den "Komprimierer" von WordPress zu bekommen und ebenso könnte man Optionen für die Anwender vorsehen. In meiner Anforderung half der folgende kleine Schnipsel, abgelegt in einem Plugin oder notdürftig auch in der <code>functions.php</code> des Themes.</p>
<pre><code>
function fb_move_admin_bar() {
    echo '
    &lt;style type=&quot;text/css&quot;&gt;
    body { 
    margin-top: -28px;
    padding-bottom: 28px;
    }
    body.admin-bar #wphead {
       padding-top: 0;
    }
    body.admin-bar #footer {
       padding-bottom: 28px;
    }
    #wpadminbar {
        top: auto !important;
        bottom: 0;
    }
    #wpadminbar .quicklinks .menupop ul {
        bottom: 28px;
    }
    &lt;/style&gt;';
}
// on backend area
add_action( 'admin_head', 'fb_move_admin_bar' );
// on frontend area
add_action( 'wp_head', 'fb_move_admin_bar' );
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-admin-bar-nach-unten-verschieben/1259/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-admin-bar-nach-unten-verschieben/1259/feed/</wfw:commentRss>
		<slash:comments>30</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>Blog ID in WordPress Multisite darstellen</title>
		<link>http://bueltge.de/blog-id-in-wordpress-multisite-darstellen/1262/</link>
		<comments>http://bueltge.de/blog-id-in-wordpress-multisite-darstellen/1262/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 21:51:55 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[MultiSite]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WP]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1262</guid>
		<description><![CDATA[Wer viel mit WordPress Mutlisite arbeitet und die Blogs in diversen Realisierungen benötigt, der braucht die IDs für diverse Funktionen oder Plugins - diese kann man sich mit wenigen Zeilen in die tabellarische Sicht holen, wie ich kurz aufzeige.]]></description>
			<content:encoded><![CDATA[<p>Wer viel mit WordPress Mutlisite arbeitet und die Blogs in diversen Realisierungen benötigt, der braucht die IDs für diverse Funktionen oder Plugins. Im einfachsten Fall erhält man diese über den Hover-Effekt mit der Mouse oder man nutzt eine kleine Erweiterung um die tabellarische Sicht im die ID zum Blog zu erweitern.</p>
<p><img class="centered" src="http://bueltge.de/wp-content/images/wp31/wp-blog-id.png" alt="WordPress Multisite Blog ID" /><br />
<span id="more-1262"></span><br />
Der folgende Code gehört in ein Plugin und am besten im den Ordner mu-plugins abgelegt, damit die ID in der Sicht adhoc bereit steht.</p>
<pre><code>
class Add_Blog_ID {
	
	public static function init() {
		$class = __CLASS__ ;

		if ( empty( $GLOBALS[ $class ] ) )
			$GLOBALS[ $class ] = new $class;
	}
	
	public function __construct() {
		
		add_filter( 'wpmu_blogs_columns', array( $this, 'get_id' ) );
		add_action( 'manage_sites_custom_column', array( $this, 'add_columns' ), 10, 2 );
		add_action( 'manage_blogs_custom_column', array( $this, 'add_columns' ), 10, 2 );
		add_action( 'admin_footer', array( $this, 'add_style' ) );
	}
	
	public function add_columns( $column_name, $blog_id ) {
		
		if ( 'blog_id' === $column_name )
			echo $blog_id;
		
		return $column_name;
	}

	// Add in a column header
	public function get_id( $columns ) {
		
		$columns['blog_id'] = __('ID');
		
		return $columns;
	}
	
	public function add_style() {
		
		echo '&lt;style type="text/css" &gt;#blog_id { width:7%; }&lt;/style&gt;';
	}
}
add_action( 'init', array( 'Add_Blog_ID', 'init' ) );
</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/blog-id-in-wordpress-multisite-darstellen/1262/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/blog-id-in-wordpress-multisite-darstellen/1262/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp31/wp-blog-id.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp31/wp-blog-id.png" medium="image">
			<media:title type="html">WordPress Multisite Blog ID</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
		<item>
		<title>WordPress Admin Bar um Papierkorb erweitern</title>
		<link>http://bueltge.de/wordpress-admin-bar-um-papierkorb-erweitern/1257/</link>
		<comments>http://bueltge.de/wordpress-admin-bar-um-papierkorb-erweitern/1257/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 11:56:49 +0000</pubDate>
		<dc:creator>Frank Bültge</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Admin Bar]]></category>
		<category><![CDATA[WP]]></category>
		<category><![CDATA[WP3.1]]></category>

		<guid isPermaLink="false">http://bueltge.de/?p=1257</guid>
		<description><![CDATA[Nun ist Version 3.1 von WordPress erschienen und die User lernen die Admin Bar kennen. Erste Fragen treten auf und so kam es auch dazu, dass man zum Beitrag, zur Seite oder einem Custom Post Type den Button möchte, der das "löschen" - Verschieben in den Papierkorb - erleichtert. Ich möchte dies als Beispiel nutzen um aufzuzeigen, wie man sich die Admin Bar im Hinblick auf die Standard-Möglichkeiten an Beitrag oder Seite ermöglicht und damit eine kleine Erweiterung zu dem <a href="http://bueltge.de/wordpress-admin-bar-erweitern/1237/">vorhergehenden Beitrag</a>, der die Admin Bar um eine Suche erweitert, ergänzen.]]></description>
			<content:encoded><![CDATA[<p>Nun ist Version 3.1 von WordPress erschienen und die User lernen die Admin Bar kennen. Erste Fragen treten auf und so kam es auch dazu, dass man zum Beitrag, zur Seite oder einem Custom Post Type den Button möchte, der das "löschen" - Verschieben in den Papierkorb - erleichtert. Ich möchte dies als Beispiel nutzen um aufzuzeigen, wie man sich die Admin Bar im Hinblick auf die Standard-Möglichkeiten an Beitrag oder Seite ermöglicht und damit eine kleine Erweiterung zu dem <a href="http://bueltge.de/wordpress-admin-bar-erweitern/1237/">vorhergehenden Beitrag</a>, der die Admin Bar um eine Suche erweitert, ergänzen.<br />
<span id="more-1257"></span></p>
<p>Die folgende kleine Funktion legt man in ein Plugin oder alternativ in die <code>functions.php</code> des Themes ab und wenn es sich um eine singulare Sicht handelt, dann erscheint der zusätzliche Button in der Admin Bar. Der Title des Button ist statisch vergeben, da das WP Object dies nicht enthält. Andere Einträge wie "Edit post" o.ä. sind in dem Array enthalten und können daher genutzt werden; alles zu finden im Array <code>$post_type_object->labels</code>.</p>
<p><img src="http://bueltge.de/wp-content/images/wp31/wp-admin-bar-trash.png" alt="WP Admin Bar mit Trash Link" title="wp-admin-bar-trash" width="578" height="76" /></p>
<p>Via <code>add_action</code> übergebe ich die Funktion an den Hook, der sich um die Auswertung der Inhalt kümmert, dabei vergebe ich den Wert 35 als Priorität, der die Reihenfolge in der Admin Bar definiert. Mittels <code>$current_object</code> wissen wir, wo in wir un auf der Oberfläche befinden und können so die ID des Posts zuordnen und die Rechte des jeweiligen Users prüfen.<br />
Das eigentliche Löschen des Beitrags, Seite oder Custom Post Types erfolgt dann via Link, der mittels der Funktion <code>get_delete_post_link()</code> erzeugt wird. In diesem Zusammenhang gibt es weitere Funktionen, die es erleichtern, den Link für eine Aktion zu erzeugen. Alle Infos dazu findet man in <code>wp-includes/link-template.php</code>.</p>
<pre><code>
function fb_add_admin_bar_trash_menu() {
  global $wp_admin_bar;

  if ( !is_super_admin() || !is_admin_bar_showing() )
      return;

  $current_object = get_queried_object();

  if ( empty($current_object) )
      return;

  if ( !empty( $current_object-&gt;post_type ) &amp;&amp; 
     ( $post_type_object = get_post_type_object( $current_object-&gt;post_type ) ) &amp;&amp; 
     current_user_can( $post_type_object-&gt;cap-&gt;edit_post, $current_object-&gt;ID ) 
  ) {
    $wp_admin_bar-&gt;add_menu( 
        array( 'id' =&gt; 'delete', 
            'title' =&gt; __('Move to Trash'), // alternative for other titles is the $post_type_object->labels
            'href' =&gt; get_delete_post_link($current_object-&gt;term_id) 
        ) 
    );
  }
}
add_action( 'admin_bar_menu', 'fb_add_admin_bar_trash_menu', 35 );
</code></pre>
<p>Alternativ können auch Einträge in der Admin Bar entfernt werden, dazu muss in der Funktion die ID des Eintrags mitgegeben werden. Im folgenden Beispiel wird der Eintrags zu der Kommentarsicht entfernt. Die ID kann man auch finden, wenn man sich das Markup in der Ausgabe anschaut, dabei ist am List-Element die Klasse als letzter String damit erweitert; Bsp. zum obigen Eintrag delete: <code>&lt;li class="ab-delete "&gt;</code> oder eben auch die Kommentare <code>&lt;li class="ab-comments "&gt;</code></p>
<pre><code>
function fb_admin_bar_render() {
	global $wp_admin_bar;

	$wp_admin_bar-&gt;remove_menu('comments');
}
add_action( 'wp_before_admin_bar_render', 'fb_admin_bar_render' );
</code></pre>
<hr />
<p><img src="http://bueltge.de/favicon.ico" alt="bueltge.de Favicon"/> <small>&copy; <a href="http://bueltge.de/">Frank B&uuml;ltge</a>, All rights reserved / Alle Rechte vorbehalten. (ID: 6e8b33de4342c4f2ca76b245199aeee8)</small></p>
<p><a href="http://bueltge.de/feed/"><img style="border: medium none ; float: left; margin-right: 10px;" src="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" alt="Feed Icon" width="34" height="34" /></a>Danke für das Abonnieren meines <strong><a href="http://bueltge.de/feed/">Feed</a></strong>! Inhalt gefällt? <a href="http://bueltge.de/wunschliste/" title="Wunschliste">Danke sagen</a> &middot; <a href="http://bueltge.de/wordpress-admin-bar-um-papierkorb-erweitern/1257/#writecomment" title="zu den Kommentaren dieses Artikels">Kommentieren</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bueltge.de/wordpress-admin-bar-um-papierkorb-erweitern/1257/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
	
		<media:thumbnail url="http://bueltge.de/wp-content/images/wp31/wp-admin-bar-trash.png" />
		<media:content url="http://bueltge.de/wp-content/images/wp31/wp-admin-bar-trash.png" medium="image">
			<media:title type="html">wp-admin-bar-trash</media:title>
		</media:content>
		<media:content url="http://bueltge.de/favicon.ico" medium="image">
			<media:title type="html">bueltge.de Favicon</media:title>
		</media:content>
		<media:content url="http://bueltge.de/wp-content/themes/black_label/images/rss.gif" medium="image">
			<media:title type="html">Feed Icon</media:title>
		</media:content>
	</item>
	</channel>
</rss>

