<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yoda Condition &#187; Tipps&amp;Tricks</title>
	<atom:link href="http://yoda.neun12.de/artikel-tag/tippstricks/feed" rel="self" type="application/rss+xml" />
	<link>http://yoda.neun12.de</link>
	<description>Debuggen du musst</description>
	<lastBuildDate>Sun, 18 May 2014 13:49:01 +0000</lastBuildDate>
	<language>de-DE</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Login überall</title>
		<link>http://yoda.neun12.de/artikel-21</link>
		<comments>http://yoda.neun12.de/artikel-21#comments</comments>
		<pubDate>Sun, 06 Feb 2011 00:09:51 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Code-Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=21</guid>
		<description><![CDATA[Nicht wenige WordPress-Nutzer wünschen sich die Möglichkeit sich auch z.B. auf der Startseite einloggen zu können anstatt erst die Login-Seite aufrufen zu müssen. WordPress trägt dem Rechnung und stellt die Funktion wp_login_form zur Verfügung. Für einfacher gelagerte Fälle keine schlechte Lösung, jedoch für etwas anspruchsvollere Geister nicht unbedingt das was sie suchen. Denn im Fehlerfall, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nicht wenige WordPress-Nutzer wünschen sich die Möglichkeit sich auch z.B. auf der Startseite einloggen zu können anstatt erst die Login-Seite aufrufen zu müssen. WordPress trägt dem Rechnung und stellt die Funktion <a href="http://codex.wordpress.org/Function_Reference/wp_login_form">wp_login_form</a> zur Verfügung. Für einfacher gelagerte Fälle keine schlechte Lösung, jedoch für etwas anspruchsvollere Geister nicht unbedingt das was sie suchen. Denn im Fehlerfall, z.B. bei einem falschen Passwort, landet man doch wieder auf der Login-Seite.<br />
Schöner wäre es, würde der komplette Login-Prozess genau dort statt findet, wo das Login-Formular angezeigt wird. Wer sich nicht scheut ein Iframe zu benutzen, der kann folgende vergleichsweise einfache Lösung benutzen.</p>
<h3>Login im Iframe</h3>
<p>Im Grunde genommen kann man den ganzen Login-Prozess in einem Iframe ablaufen lassen. Man muss sich dabei lediglich vor Augen halten das ein Iframe mit einem neuen Tab im Browser vergleichbar ist. Dem Server ist es jedoch egal ob man den Login in einem neuen Tab oder Iframe vornimmt. Ob ein Benutzer eingeloggt ist oder nicht, wird in einem Cookie gespeichert. Dadurch ist der &#8220;Ort&#8221; wo man sich einloggt uninteressant, so lange er vom gleichen Server aus erfolgt.</p>
<p>Fangen wir also gleich damit an die <code>wp-login.php</code> in einem Iframe anzuzeigen. Damit dies ein wenig komfortabler wird, legen wir uns eine Funktion an die wir in der <code>functions.php</code> oder einem Plugin ablegen können.</p>
<pre class="brush:php">function my_login_form( $args ){

	extract( $args );

	if( !isset( $width ) ){
		$width = 300;
	}

	if( !isset( $height ) ){
		$height = 300;
	}

	if( !isset( $redirect ) ){
		$redirect = content_url() . '/themes/my_theme/logout.php';
	}

	echo '&lt;iframe src="http://www.example.com/wp-login.php?redirect_to=' . $redirect . '&amp;iframe_mode=true" width="' . $width . '" height="' . $height . '"&gt;';
}</pre>
<p>Diese Funktion macht eigentlich nichts anderes als ein Iframe anzuzeigen welches als Source die <code>wp-login.php</code> hat. Die Zeilen 3-16 dienen lediglich dazu ein paar Parameter an die Funktion zu übergeben. Im Beispiel oben sind das <code>width</code> (Breite des Iframe), <code>height</code> (Höhe des Iframe) und <code>redirect_to</code> (Ziel-URL zu der nach dem Login umgeleitet werden soll). Diese Parameter werden per Array übergeben:</p>
<pre class="brush:php">if( function_exists('my_login_form') ){
	$args = array( 'width'=&gt;300,
		       'height'=&gt;200,
			redirect_to=&gt; content_url().'/themes/my_theme/mylogin_redirect.php' );
	my_login_form( $args );
}</pre>
<p>Fügen wir obigen Code-Schnipsel in unser Blog ein, z.B. in der Sidebar, dann fügt die Funktion an dieser Stelle ein Iframe mit der Breite 300px und Höhe 200px ein. Bis hierhin nichts wirklich aufregendes, einzig der Parameter <code>redirect_to</code> tanzt ein wenig aus der Reihe.<br />
Wir erinnern uns, die Anzeige im Iframe ist mit einem neuen Tab vergleichbar. Die Situation ist nun folgende: Innerhalb des Blogs wird die <code>wp-login.php</code> angezeigt, beim Betätigen des  Submit-Buttons leitet die <code>wp-login.php</code>, sofern die Login-Daten korrekt sind, automatisch auf eine andere Seite um. Diese Seite wird dann ebenfalls im Iframe angezeigt! Normalerweise wird auf die Profil-Seite des Benutzers bzw. ins Dashboard umgelietet, in einem kleinen Iframe dargestellt sieht dies eher unbrauchbar aus. Diese Umleitung kann man jedoch beim Aufruf der <code>wp-login.php</code> mit dem Parameter <code>redirect_to</code> beeinflussen.<br />
Dies machen wir uns zu nutzen und zeigen einfach eine eigene Seite an deren Inhalt besser in das Iframe passt. Diese Datei hat noch eine weitere recht wichtige Aufgabe. Denn durch den Aufruf von <code>wp-login.php</code> würden wir eine weitere Instanz von WordPress erzeugen was zu unschönen Nebeneffekten führen könnte. Ich habe hier als Beispiel mal den Benutzernamen und einen Logout-Link ausgegeben. Wichtig ist, dass das Script mit einem <code>exit;</code> beendet wird:</p>
<pre class="brush:php">&lt;?php
global $current_user;

echo $current_user-&gt;user_name . '&lt;br /&gt;';
echo '&lt;a href="' . wp_logout_url( site_url().'/wp-login.php' ) . '" title="Logout"&gt;' . __('Logout') . '&lt;/a&gt;';
exit;
?&gt;
</pre>
<p>Durch die Angabe von <code>site_url . '/wp-login.php'</code> wird beim Betätigen des Logout-Links (innerhalb des Iframes) wieder auf die Login-Seite umgeleitet.</p>
<h3>Fehlende Optik</h3>
<p>Damit haben wir uns bis jetzt ein schönes Karussell gebastelt.  Im Iframe wird die <code>wp-login.php</code> angezeigt, nach einem erfolgreichen Login wird unsere eigene Seite angezeigt und nach dem Ausloggen wieder die <code>wp-login.php</code>.<br />
Jetzt bleibt noch ein kleines aber nicht unbedeutendes Problem übrig. Die <code>wp-login.php</code> würde im Iframe mit dem originalem Stylesheet angezeigt werden, dieses ist aber nicht auf Miniformate wie z.B. 300x200px ausgelegt. Zudem haben wir nun ein paar Elemente drin auf die wir gerne verzichten würden. Ein angepasstes Stylesheet muss also her. Wie man den Login-Screen optisch an seine eigenen Bedürfnisse anpasst, dazu finden sich im Internet massig Anleitungen. Zur Not einfach Bei <a href="http://bueltge.de/wordpress-login-seite-anpassen-3/1214/http://bueltge.de/wordpress-login-seite-anpassen-3/1214/">Frank Bültge</a> vorbei schauen, dort findet sich (fast) immer etwas passendes.<br />
Ein kleines Problem gibt es dabei allerdings. Bei Verwendung des Hooks würde ein Benutzer der die <code>wp-login.php</code> &#8220;normal&#8221; aufrufen würde (z.B. über ein Bookmark), ebenfalls das angepasste Stylesheet zu sehen bekommen. Es muss also ein Kriterium her anhand dessen man unterscheiden kann ob die <code>wp-login.php</code> im Iframe oder in einem normalen Fenster angezeigt wird. Im Script selber können wir das (leider) nicht überprüfen, deswegen geben wir diese Information beim Aufruf der <code>wp-login.php</code> als GET-Parameter mit: <code>&amp;iframe_mode=true</code> sorgt dafür das wir im Hook überprüfen können ob dieser Parameter gesetzt ist. Ist dem so, dann wird das angepasste Stylesheet geladen, ansonsten passiert nichts.</p>
<pre class="brush:php">function check_iframe_mode(){

	if( isset( $_REQUEST['iframe_mode'] ) &amp;&amp; true === $_REQUEST['iframe_mode'] ){
		echo '&lt;style type="text/css"&gt;
		@import url("' . site_url().'/themes/my_theme/my_login_style.css");
		&lt;/style&gt;';
	}

}

add_action( 'login_head', 'check_iframe_mode' );</pre>
<p>Das Stylesheet liegt in diesen Beispiel im Themes-Ordner &#8216;my_theme&#8217; und hat den Namen &#8216;my_login_style.css&#8217;. Man kann das CSS auch direkt ausgeben, jedoch lässt sich eine separate Datei leichter pflegen und anpassen.</p>
<h3>Fazit</h3>
<p>Mit diesem letzten Schritt wären wir nun am Ziel angekommen. Nun findet der Login-Prozess komplett im Iframe statt. Allerdings hat diese Methode auch ein paar Nachteile die ich hier nicht verschweigen möchte.<br />
Zum einen wird keine Rücksicht auf die Seite genommen in der das Iframe eingebettet ist. Sind hier Elemente vorhanden die vom Login abhängig sind, z.B. Anzeige des Benutzernamens, dann werden diese Elemente erst dann sichtbar bzw. aktualisiert wenn die Seite erneut geladen wird. Diesen Mangel kann man zur Not noch mit etwas zusätzlichem JavaScript beheben indem man einen Reload der Hauptseite erzwingt.<br />
Zum anderen geht diese Methode nicht sehr schonend mit den Resourcen um. Denn alleine durch die Anzeige der <code>wp-login.php</code> werden Datenbankverbindungen aufgebaut, Variablen angelegt und damit letztendlich auch Speicher verbraucht. Für Blogs mit hohen Besucheraufkommen sollte man deswegen besser auf andere Lösungen, sprich komplexere Plugins, zurück greifen.<br />
Für kleinere Blogs und den Hobby-Bastler jedoch eine Anregung für einen weiteren Ausbau. Ein Workaround könnte so aussehen, dass man nach dem Logout nicht direkt wieder auf die <code>wp-login.php</code> umleitet, sondern auf eine dritte &#8220;Zwischenseite&#8221; die einen Link zur <code>wp-login.php</code> enthält.</p>
<p>Ich hoffe dem einen oder anderem mit diesem Artikel ein paar Anregungen gegeben zu haben und freue mich über etwas Feedback in den Kommentaren.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-21/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress und die Localization</title>
		<link>http://yoda.neun12.de/artikel-6</link>
		<comments>http://yoda.neun12.de/artikel-6#comments</comments>
		<pubDate>Fri, 07 Jan 2011 00:09:56 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=6</guid>
		<description><![CDATA[Im Grunde genommen ist es eine feine Sache das man in WordPress Themes und Plugins mit relativ wenig Aufwand in eine andere Sprache übersetzen kann. Man muss lediglich darauf achten beim schreiben des Themes bzw. Plugins die Texte in einem bestimmten Format auszugeben und schon kann man unter zuhilfenahme von Programmen wie z.B. poEdit das [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Im Grunde genommen ist es eine feine Sache das man in WordPress Themes und Plugins mit relativ wenig Aufwand in eine andere Sprache übersetzen kann. Man muss lediglich darauf achten beim schreiben des Themes bzw. Plugins die Texte in einem bestimmten Format auszugeben und schon kann man unter zuhilfenahme von Programmen wie z.B. poEdit das Theme oder Plugin in eine andere Sprache übersetzen ohne es neu zu schreiben.</p>
<p>Im Grunde genommen bedeutet hier aber, dass es nur auf den ersten Blick so einfach zu sein scheint. Wer sich schon mal mit den Thema Übersetzung von Plugins oder Themes beschäftigt hat, der wird früher oder später die vielen kleinen Haken zu spüren bekommen. Einer dieser kleinen Haken ist der, dass WordPress einen grundlegenden Unterschied bei der Einbindung von Übersetzungen macht. <code>load_theme_textdomain()</code> ist, wie der Name vermuten lässt, für Themes zuständig, während <code>load_plugin_textdomain()</code> für Plugins zuständig ist. Es ist schon mal auffällig das es für die gleiche Aufgabe zwei verschiedene Funktionen gibt. Also schauen wir doch mal in die Core-Datei wo der Unterschied bei diesen beiden Funktionen liegt.</p>
<p>Beide Funktionen finden wir in <code>wp-includes/l10n.php</code>. Beide Funktionen erwarten bei ihren Aufruf die Übergabe einer Domain und eines Pfades. Im Falle von <code>load_plugin_textdomain()</code> können sogar zwei verschiedenen Arten von Pfaden angegeben werden, wobei der absolute relative Pfad veraltet ist und nicht mehr verwendet werden sollte.<br />
Bei genauerer Betrachtung fällt aber auf, dass <code>load_theme_textdomain()</code> bei der Pfadangabe deutlich toleranter ist als <code>load_plugin_textdomain()</code>. Ist kein Pafd angegeben, so verwendet <code>load_theme_textdomain()</code> das Verzeichnis des aktuellen Templates als Pfad. Ansonsten könnte man den Pfad auch sonstwohin zeigen lassen, es würde noch funktionieren.<br />
<code>load_plugin_textdomain()</code> ist da etwas strikter. Egal ob man einen Pfad angibt oder nicht, es wird auf jeden Fall <code>WP_PLUGIN_DIR</code>, also der Pfad zum Plugin-Verzeichnis, im Pfad eingefügt.<br />
Mit <code>load_theme_textdomain()</code> könnte man also auch eine Sprachdatei benutzen die in <code>wp-content</code> steht. Mit <code>load_plugin_textdomain()</code> wäre dies unmöglich.</p>
<p>Nun sind Pfadangaben in WordPress eine Sache für sich an die man sich gewöhnen und mit denen man umzugehen lernen kann. Deutlich mehr Kopfschmerzen bereitete mir in der Vergangenheit ein Umstand, den ich irgendwie nicht verstehe. Und zwar das Format nach dem die Sprachdateien benannt werden müssen.<br />
<code>load_theme_textdomain()</code> erwartet das die Sprachdatei lediglich aus der Locale und der Endung .mo besteht. Also z.B. de_DE.mo oder en_EN.mo. <code>load_plugin_textdomain()</code> hingegen erwartet zu der Locale noch zusätzlich die Domaine als Teil des Dateinamens. Die Datei muss also das Format domain-locale.mo haben.<br />
Für mich recht unverständlich und letzten Endes kann dies auch zu Problemen führen. Denn ändert sich im Plugin die Domaine, z.B. nach einem Update, dann können auch die (alten) Sprachdateien nicht mehr geladen werden. Man müsste also entweder alle Domainen im Plugin ändern oder alle Sprachdateien umbennenen.</p>
<p>Aber man sollte auch immer die Vorteile im Auge behalten. Durch die Verwendung der Domaine im Dateinamen der Sprachdatei kann man auf recht einfache Weise z.B. zwischen der Du- und der Sie-Form wechseln. Etwas was für deutsche Übersetzungen ja nicht ganz unerheblich ist.<br />
Dazu legt man einfach z.B. eine Sprachdatei mit den Namen <code>pluginname_du_form-de_DE.mo</code> und eine mit den Dateinamen <code>pluginname_sie_form-de_DE.mo</code> an. Im Plugin selber kann man mittels <code>define('MeinePluginDomain', 'plugin_xx_form');</code> eine Konstante definieren die dann in den Übersetzungsfunktionen verwendet wird (z.B. <code>__('This example text', MeinePluginDomain)</code>). Je nachdem ob xx nun &#8216;du&#8217; oder &#8216;sie&#8217; ist, schaltet man zwischen Du- und Sie-Form um.</p>
<p>Jetzt hat man aber ein Problem mit Sprachen die nicht zwischen Du und Sie unterscheiden. Mit Englisch zum Beispiel. Denn man müsste nun für jede Sprache zwei Sprachdateien anfertigen. Einmal <code>plugin_du_form-en_EN.mo</code> und einmal <code>plugin_sie_form-en_EN.mo</code>.<br />
Das ganze gestaltet sich an diesen Punkt als etwas zu aufwendig um schön zu sein. Es gibt aber auch eine Lösung für das Problem. Wir benötigen ja eigentlich nur eine Funktion die in einem Verzeichnis nachschaut ob es eine Sprachdatei nach dem Format domaine-locale.mo gibt und diese lädt. Gibt es eine solche Sprachdatei nicht, wird halt eine Sprachdatei nach den Format locale.mo geladen. Gibt es diese auch nicht, wird halt nichts übersetzt.<br />
Nebenbei erledigt sich mit solch einer Funktion das leidige Pfad-Problem. Die Sprachdateien können nun quasi an einen beliebigen Ort abgelegt werden. Ob dies Sinn macht, sei an dieser Stelle mal dahin gestellt.</p>
<p>Hier erst einmal die Funktion:</p>
<pre class="brush:php">function flexible_loadtextdomain( $path = false, $domain = 'default' ){

  if( ! $path || ! is_dir( $path ) )

    return false;

  global $l10n;

  $local = get_locale();

  $mofile = $path . $domain . '-' . $local . '.mo';

  // try to find a matching translation

  // first try domain-locale.mo

    if( ! file_exists( $mofile ) ){

    // if not found, try only locale.mo

    $mofile = str_replace( $domain . '-', '', $mofile );

      if( ! file_exists( $mofile ) ){

        // if even this failed, throw an error or do something wired

        return false;

      }

    }

  load_textdomain( $domain, $mofile );

  return isset( $l10n[ $domain ] );

}</pre>
<p>Die Funktion erwartet zwei Parameter. Zum einen eine Pfadangabe und zum anderen den Namen der Domain. Die erste If-Abfrage sorgt dafür das überhaupt ein Pfad übergeben wird und das es auch ein Verzeichnis ist. Anstatt einfach nur false zurück zu geben, kann man hier natürlich noch weitere Spielereien unter bringen indem man z.B. einen Pfad vorgibt (<code>WP_PLUGIN_DIR</code> oder <code>get_template_directory</code>).<br />
Der Rest ist das was ich oben schon beschrieben habe. Erst domain-locale.mo suchen, wenn nicht gefunden locale.mo suchen, wenn das auch nicht gefunden irgendwas verrücktes machen, zum Beispiel false zurück geben.<br />
In der letzten Zeile wird dann noch geprüft ob die Domain erfolgreich geladen wurde. Ab WP 3.0 kann man dies durch <code>return load_textdomain(...)</code> abkürzen. In älteren Versionen muss man diesen kleinen Umweg gehen da <code>load_textdomain</code> keine Erfolgsmeldung zurück gibt.</p>
<p>Der Code der Funktion ist ein wenig abgespeckt. Will man es ganz sauber programmieren, dann würde man noch ein paar Sachen anders machen, z.B. nicht <code>$locale = get_locale();</code> verwenden, sondern <code>$locale = apply_filters( 'xyz', get_locale(), $domain );</code> (xyz = theme_locale oder plugin_locale, je nachdem ob man die Funktion in einem Theme oder Plugin verwendet).</p>
<p>Vielleicht ist dieser Beitrag ja eine kleine Anregung für alle die Themes oder Plugins schreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-6/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Eigenes Menü im Backend anpassen</title>
		<link>http://yoda.neun12.de/artikel-5</link>
		<comments>http://yoda.neun12.de/artikel-5#comments</comments>
		<pubDate>Fri, 07 Jan 2011 00:08:44 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=5</guid>
		<description><![CDATA[Eigene Menüs im Backend anlegen ist nicht schwer, WordPress stellt hierzu ausreichend Funktionen zur Verfügung. Jedoch haben diese Menüs einen meiner Ansicht nach unschönen Nachteil. Im Menü selber hat der erste Menüpunkt den gleichen Titel wie das Menü selber. Legt man nun also ein Menü Test an, so steht ganz oben als erster Menüpunkt auch [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Eigene Menüs im Backend anlegen ist nicht schwer, WordPress stellt hierzu ausreichend Funktionen zur Verfügung. Jedoch haben diese Menüs einen meiner Ansicht nach unschönen Nachteil. Im Menü selber hat der erste Menüpunkt den gleichen Titel wie das Menü selber. Legt man nun also ein Menü <em>Test</em> an, so steht ganz oben als erster Menüpunkt auch <em>Test</em> (siehe Grafik). Das sieht nicht nur unschön, sondern auch unprofessionell aus. Schöner wäre es, könnte man den ersten Menüpunkt anders benennen. Bei den von WordPress vorgegebene Menüs ist es schließlich genauso.</p>
<p><img src="http://media.tumblr.com/tumblr_le7vyn7zGX1qf49cl.jpg" alt="" align="right" />Der Codex schweigt sich allerdings ein wenig darüber aus wie man es hin bekommt den ersten Menüpunkt anders zu benennen. Anscheinend gibt es auch keinen &#8220;offiziellen&#8221; Weg um dies zu bewerkstelligen. Mit einen kleinen Kniff geht es dennoch.<br />
Dazu muss man die Variable <code>$submenu</code> global verfügbar machen und kann dann darüber seine Menüpunkte beeinflussen:</p>
<pre class="brush:php"><code>global $submenu;
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, [...] );
$submenu[$menu_slug][0][0] = 'My first Menuoption';</code></pre>
<p>$submenu ist ein Array in dem verschiedene Informationen über das Menü gespeichert sind. Es lohnt sich dieses Array mal ausgeben zu lassen und zu schauen welche Informationen man darin findet.</p>
<p>In Bezug auf die Menüs ist <code>$menu</code> ein weiteres interessantes Array. Bei der Masse an Plugins die im Umlauf sind, kommt es nicht selten vor das auch dementsprechend viele Plugins ein zusätzliches Menü einrichten. Da möchte man vielleicht sein eigenes Menü ein wenig von den anderen abgrenzen. Nichts leichter als das, sogar mit Zusatzwert. Man fügt einfach einen Menü-Seperator ein:</p>
<pre class="brush:php"><code>global $menu;
$menu[] = array( '', 'read', '', '', 'wp-menu-separator' );</code></pre>
<p>Damit wird ein Seperator eingefügt mit dem man die Menüleiste auf- und zuklappen kann. Steht der Code vor <code>add_menu_page()</code>, wird der Seperator vor dem eigenen Menü eingefügt. Steht er dahinter, wird der Seperator dementsprechend dahinter eingefügt.<br />
Mit <code>count($menü)</code> lässt sich recht einfach feststellen wie viele Menüs bereits existieren und ggf. ein Seperator einfügen. Allerdings werden auch sämtliche bereits vorhandenen Seperatoren mitgezählt, dies sollte man beachten und diese ggf. raus rechnen.<br />
Mit <code>'wp-menu-separator-last'</code> erzeugt man übrigens einen &#8220;leeren&#8221; Seperator, also einen Seperator ohne Pfeil wie am Ende des Standard-Menüs von WordPress zu finden ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
