<?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; Plugin</title>
	<atom:link href="http://yoda.neun12.de/artikel-tag/plugin/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-Name des Autoren verschlüsseln</title>
		<link>http://yoda.neun12.de/artikel-29</link>
		<comments>http://yoda.neun12.de/artikel-29#comments</comments>
		<pubDate>Fri, 11 Mar 2011 14:38:02 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Code-Snippets]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=29</guid>
		<description><![CDATA[Klaus stört es das der Login-Name des Autors bei den Post-Metadaten im Link erscheint. Das ist jetzt etwas schwurbelig ausgedrückt, für eine genauere Erklärung einfach beim Klaus nachlesen was er meint. Manchmal bin ich pingelig und mich stört so etwas auch. Logindaten egal welcher Art haben in Links und anderen öffentlich zugänglichen Bereichen einfach nichts [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a title="Login-Name in den Post-Metadaten" href="http://webdesign-passau.com/wordpress/wp-3-sicherheitsluecke-ausgabe-loginname/" target="_blank">Klaus</a> stört es das der Login-Name des Autors bei den Post-Metadaten im Link erscheint. Das ist jetzt etwas schwurbelig ausgedrückt, für eine genauere Erklärung einfach beim Klaus nachlesen was er meint.</p>
<p>Manchmal bin ich pingelig und mich stört so etwas auch. Logindaten egal welcher Art haben in Links und anderen öffentlich zugänglichen Bereichen einfach nichts zu suchen. Das widerspricht auch der Idee das man neben den Login-Namen auch noch zwei andere Namen in seinem Profil angeben kann und auswählen kann welchen Namen man gerne öffentlich verwenden möchte.</p>
<h3>Der Workaround</h3>
<p>Um das Problem zu lösen gibt es einen Workaround und eine Möglichkeit mit Filtern zu arbeiten. Zuerst der Workaround. WordPress bietet nämlich die Möglichkeit für jeden Autoren eine eigene Autoren-Seite anzulegen. Dieses Template wird zuerst gezogen bevor das allgemeine Template für alle anderen Autoren verwendet wird. Anders ausgedrückt: Existiert für den Autor X ein spezielles Template, wird dieses verwendet. Existiert kein solches Template, dann wird das allgemeine Template verwendet.<br />
Dabei sucht WordPress in folgender Reihenfolge nach einem passenden Template:</p>
<ol>
<li><code>author-{autor-name}.php</code></li>
<li><code>author-{autor-ID}.php</code></li>
<li><code>author.php</code></li>
</ol>
<p>Ist der Login-Name des Autoren z.B. &#8220;Klaus&#8221; und existiert ein Template <code>author-klaus.php</code>, wird zuerst dieses Template verwendet. Dies hilft uns in diesem Fall jedoch nicht weiter, da weiterhin der Login-Name verwendet wird.<br />
Jedoch kann man auch die ID des Autoren verwenden. Existiert ein Template author-12.php und hat der Autor &#8220;Klaus&#8221; die ID 12, dann wird dieses Template verwendet. Ändert noch nichts daran das im Link immer noch der Login-Name erscheint.<br />
Um dies zu ändern, greift man in das Template ein in dem die Funktion get_author_posts_url() verwendet wird. Das ist von Theme zu Theme leider immer etwas unterschiedlich, je nach dem wo die Metadaten zum Post ausgegeben werden. Diesen Funktionsaufruf ersetzt man nun mit diesem Monster:</p>
<pre class="brush:php">str_replace(
  get_the_author_meta( 'user_nicename' ),
  get_the_author_meta( 'ID' ),
  get_author_posts_url( get_the_author_meta( 'ID' ) )
)</pre>
<p>Damit ersetzt man den Login-Namen (user_nicename) durch die ID des Autoren. Nun benötigt man noch ein Template <code>author-xy.php</code> wobei <code>xy</code> die jeweilige ID des Autoren ist.</p>
<p>Das ganze ist ein Workaround der nur sehr begrenzt einsatzfähig ist. Man muss jedes mal am Theme rumfummeln, die ganze Sache ist nicht wirklich übersichtlich und am Ende benötigt man auch noch für jeden Autoren ein eigenes Template. Eignet sich also normalerweise nur für Blogs in denen es 1-2 Autoren gibt und die eher selten ihr Theme wechseln.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-29/feed</wfw:commentRss>
		<slash:comments>2</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>
