<?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>toscho.design&#187; WordPress</title>
	<atom:link href="http://toscho.de/thema/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://toscho.de</link>
	<description>Redaktion und schwer geprüftes Webdesign aus Halle (Saale)</description>
	<lastBuildDate>Sat, 07 Jan 2012 14:55:02 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>4</sy:updateFrequency>
	
		<item>
		<title>Das Fefe-Theme</title>
		<link>http://toscho.de/2011/fefe-theme/</link>
		<comments>http://toscho.de/2011/fefe-theme/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 19:33:03 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1816</guid>
		<description><![CDATA[Ihr wart hoffentlich alle hübsch unartig? Dann habe ich das passende Geschenk: Ein WordPress-Theme zu Ehren <a href="http://blog.fefe.de">Fefes Blogs</a>.]]></description>
			<content:encoded><![CDATA[<p><a href="http://toscho.de/wp-content/uploads/2011/12/screenshot.png"><img src="http://toscho.de/wp-content/uploads/2011/12/screenshot-150x150.png" alt="" width="150" height="150" class="alignright size-thumbnail wp-image-1817" /></a>Ihr wart hoffentlich alle hübsch unartig? Dann habe ich das passende Geschenk: Ein WordPress-Theme zu Ehren <a href="http://blog.fefe.de">Fefes Blogs</a>. Ich weiß zwar, was er von WordPress hält, aber das ist mir egal. Ich hatte mal Lust auf CSS-Verzicht.</p>
<p>Das Theme verwendet kein Stylesheet, keine Tags oder Kategorien, keine Post-Titel, und mit Bildern kann man auch nicht viel anfangen. Es gibt zwei Widgetflächen – oben und unten – da kann man Text hineinsetzen, wenn man möchte. Einen Shortcode für den Einbau des Suchformulars habe ich auch erstellt: <code>[searchform]</code>. Damit kann man die Maske auf einer beliebigen Seite mitten im Text plazieren.</p>
<div id="attachment_1818" class="wp-caption alignnone" style="width: 460px"><img src="http://toscho.de/wp-content/uploads/2011/12/vergleich-fefe.png" alt="" width="450" height="400" class="size-full wp-image-1818" /><p class="wp-caption-text">Vergleich Original und Theme</p></div>
<p>Die Sprache ist Englisch, es liegt aber eine deutsche Sprachdatei bei, und <a href="http://www.rarst.net">Andrey Savchenko</a>, den einige sicher als <a href="http://wordpress.stackexchange.com/users/847/rarst">Rarst von WordPress Answers</a> kennen, hat die Übersetzung ins Russische besorgt. Cool.</p>
<p>Das Repository liegt natürlich auf GitHub: <a href="https://github.com/toscho/Fefe-Tribute-Theme">https://github.com/toscho/Fefe-Tribute-Theme</a></p>
<p>Die <a href="https://github.com/downloads/toscho/Fefe-Tribute-Theme/fefe-theme.1.0.zip">Version 1.0 herunterladen</a> könnt ihr dort auch.</p>
<p>Verbesserungsvorschläge und Feature-Requests packt bitte in den <a href="https://github.com/toscho/Fefe-Tribute-Theme/issues">Issue-Tracker</a>, damit ich den Überblick behalte. Danke!</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/fefe-theme/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WordCamp Köln 2011</title>
		<link>http://toscho.de/2011/wordcamp-koeln-2011/</link>
		<comments>http://toscho.de/2011/wordcamp-koeln-2011/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 17:28:51 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Kunterlei]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1808</guid>
		<description><![CDATA[Notizen einer kleinen Reise nach Köln.]]></description>
			<content:encoded><![CDATA[<h2>Freitag</h2>
<p>Nach einer furchtbaren Nacht ohne Kater kurz nach 5 aus dem Bett. 11 Uhr kommen <a href="http://stil-etage.de/">Nick</a> und <a href="http://dynamicinternet.eu/">Micha</a> und wir brausen los.<br />
Da Nick Zoff mit der Dame im Navigationsgerät hat, kommen wir erst gegen 17:30 Uhr im <a href="http://www.meininger-hotels.com/hotel-hostel/hotelsuche/koeln/">Hotel Meininger</a> an. Von dort gleich weiter zur <a href="http://www.frueh.de/">Brauerei Früh</a>, wo schon 50 andere sitzen. Drinnen ist es laut und voll; statt Bier gibt es <em>Kölsch</em>, eine Art teure Pisse. Ich bestelle eine Bockwurst, von der ich so lange esse, bis der Kotzdrang den Hunger aussticht. </p>
<p><a href="http://toscho.de/wp-content/uploads/2011/09/brauerei-frueh.jpg"><img src="http://toscho.de/wp-content/uploads/2011/09/brauerei-frueh-300x200.jpg" alt="Brauerei Früh" width="300" height="200" class="aligncenter size-medium wp-image-1809" /></a></p>
<p>Flucht mit <a href="http://mobile.twitter.com/cbuchler">@cbuchler</a> zum Starbucks, einen großen Kaffee fassen, dann ins Hotel. Rückzug nach innen in der Lobby, Mails abrufen, Code schreiben. 12 Uhr ins Bett. Die Inpsydetruppe feiert bis 4. Wir stehen alle 7 Uhr auf, ich bin sogar wach.</p>
<h2>Köln</h2>
<p>Köln ist 1970 eingefroren. Der Lohn ist ewig gutes Wetter, die Strafe Kölsch. Vermutlich hat Köln selbst dann gutes Wetter, wenn es Scheiße regnet. Weil die Leute es nicht merken. Weil sie Kölsch trinken.</p>
<p>Jeder duzt jeden. Im Hotel, in der Kneipe, bei Starbucks und im Taxi. Ich fühle mich ganz kurz etwas jünger, bis mir aufgeht, daß das Duzen hier einfach nichts mit dem Alter zu tun hat.</p>
<h2>Samstag</h2>
<p>Frühstück im Hotel. Ich verdicke die Kaffeeparodie mit Milch. Erster Anflug von Heimweh.</p>
<p>Bei gutem Wetter schlendern wir gegen 8 zur Universität. Verkachelte Wände, der Kaffeeautomat spuckt eine Brühe in den Pappbecher, die sicher nicht zum ersten Mal eine Niere sieht. Namensschilder und T-Shirts werden verteilt, Räume gesucht. <a href="http://bueltge.de/">Frank</a> und <a href="https://plus.google.com/106682881083587476194/about">Olaf</a> erklären den Ablauf.  Die ersten Memmen jammern auf Twitter, weil ihr Drei-Wetter-Taft versagt.</p>
<p>Die Sessions interessieren mich nicht. Das wußte ich vorher, ich bin der Leute wegen hier. Bis zur Mittagspause schwatze ich mich durch die Besucherschar, teste einen pappigen Cappuccino und Apfelschorle.<br />
Der Koffeinist in mir sticht bös und böser zu. Frank und ich rennen ins nächste Café, wo wir eilig jeder zwei Tassen Kaffee einsaugen. Und über <a href="http://wordpress-buch.bueltge.de/">DAS BUCH</a> sprechen. Das längst schon fertig sein sollte …</p>
<p>Zurück zur Uni, Frank hält <a href="http://bueltge.de/wordpress-mehrsprachig/">seine Session</a>, die einzige, die mich interessiert, in einem Raum, der mir zu voll ist. Ich seh’ den Code schon früh genug.</p>
<p><a href="http://toscho.de/wp-content/uploads/2011/09/bueltge-mehrsprachigkeit.jpg"><img src="http://toscho.de/wp-content/uploads/2011/09/bueltge-mehrsprachigkeit-300x200.jpg" alt="Frank Bueltge: Mehrsprachigkeit mit Multisite" width="300" height="200" class="aligncenter size-medium wp-image-1810" /></a></p>
<p>Also gehe ich mit dem <a href="https://plus.google.com/100967148217893238418/posts">Schepp</a> in ein anderes Café. Langsam gewinne ich wieder menschenähnliche Züge. Mit Christian kann ich gut plaudern, auch mal eine Pause einlegen, die nicht peinlich wirkt.<br />
Mein leises Bedauern darüber, zu wenig Zeit für Köln zu haben, kontert Christian mit dem Hinweis auf das <a href="http://www.multimediatreff.de/naechstestreffen.php">nächste MMT</a>. Oha! Da habe ich gleich Lust drauf.</p>
<p>In die letzte Session werde ich von den Inpsyde-Leute sehr bestimmt hineingebeten. WordPress-Jeopardy. Die Besucher werden in zwei Gruppen aufgeteilt, die gegeneinander antreten. Ich darf in <em>keine</em> Gruppe. Ich bin der »Joker«, bekomme 1000 Punkte, weil ich einen semantischen Fehler korrigiere, statt die Frage zu beantworten, tue so, als fühlte ich mich nicht verarscht. Spiele mit.</p>
<p>Danach erwische ich endlich noch <a href="http://sprungmarker.de/">Sylvia</a> für einen kurzen Plausch, bedanke mich für ihre Hilfe bei einem Artikel, der schon viel zu lange seines letzten Schliffs wartet und dringend hier ans Licht möchte.<br />
Mit <a href="http://dnaber.de/">David</a> kann ich auch endlich schwatzen. Aus dem wird mal ein guter Nerd.<br />
Wir gehen zum <a href="http://www.flickr.com/search/?q=Aachener+Weiher">Aachener Weiher</a>, liegen auf der Wiese und sehen den Mädels zu. Ich koste die letzten Sonnenstrahlen aus. Jemand hext mir ein Kölsch in die Hand. Ich laufe umher, Musik in den Beinen. Eine Frau in roter Latzhose mit zwei Beuteln in der Hand führt Selbstgespräche. Wir teilen ein Lächeln.</p>
<p><a href="http://toscho.de/wp-content/uploads/2011/09/aachener-weiher.jpg"><img src="http://toscho.de/wp-content/uploads/2011/09/aachener-weiher-300x200.jpg" alt="Sonnenbad am Aachener Weiher" width="300" height="200" class="aligncenter size-medium wp-image-1811" /></a></p>
<p>Mit 30 Leuten irren wir zum <a href="http://www.maracana-rodizio-restaurant.de/" title="Vorsicht Flash.">Maracana Rodizio</a>. Hier haben wir 20 Plätze reserviert. Und kein Stuhl mehr frei. Die Gruppe schrumpft leider.<br />
Es gibt Caipirinha und leckere Vorspeisen, dann rennen Kellner um die Tische und schälen Fleisch auf unsere Teller. Alle halbe Stunde schlängeln Tänzerinnen zu ohrenbetäubend lauter Musik an der Theke entlang. Ich fliehe hinaus.</p>
<p>Gegen 22 Uhr zum Hotel zurück, schwatzen, noch einen Tee und Mitternacht ins Bett. Ich schlafe schlecht, ab 5 fechten die vielen scharf gewürzten Fleischstücke in meinem Magen einen Krieg aus.</p>
<p>7:45 Uhr Frühstück allein. Bis 10 fallen alle anderen aus ihren Betten, Gruppenfoto, Abfahrt. Die Tour zurück klappt reibungslos, allein Nicks iPhone nimmt sich eine Wärmepause.<br />
Kurz nach der Heimkehr bringt mein Bruder den Kater zurück, und sobald ich den original brasilianischen Tinnitus überwunden habe, kann ich die Stille genießen.</p>
<hr />
<p>Ich wollte noch eine Kundin treffen, die dort wohnt, hätte gerne mehr von der Stadt gesehen, vor allem von den Antiquariaten.<br />
Aber ich war schon bis zum Anschlag überreizt. Ich brauche öfter mal Pause, muß die Ideen wegschreiben, die sich unentwegt in mir auftürmen, Ruhe finden. Und ich kann das endlich auch. Manchmal.</p>
<p>Andere haben das WordCamp kritisiert. Manche haben einfach nur geschimpft. Es kommt wohl darauf an, was man erwartet. Ich bin zufrieden.</p>
<p>Alle Fotos hat <a href="http://de.xtreme-theme.com/">Alexander Frison (Xtreme Theme)</a> geschossen. Danke! Mehr Bilder gibt es in seinem <a href="http://de.xtreme-theme.com/2011/09/wordcamp-2011-nachlese-bilder-und-20-gutschein/">Artikel zum WordCamp</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordcamp-koeln-2011/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>WordPress: Headergrafik per Plugin ausblenden</title>
		<link>http://toscho.de/2011/wordpress-headergrafik-per-plugin-ausblenden/</link>
		<comments>http://toscho.de/2011/wordpress-headergrafik-per-plugin-ausblenden/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 05:02:18 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1805</guid>
		<description><![CDATA[Ein Header-Image aus einem bestehendem Theme entfernen: Hier zeige ich den Weg über ein Plugin als Alternative zum Child-Theme.]]></description>
			<content:encoded><![CDATA[<p>Seit Version 2.9 kann man in <a href="http://toscho.de/angebote/wordpress/themes/">WordPress-Themes</a> die internen Funktionen für eine eigene Kopfgrafik nutzen mit der Funktion <code><a href="http://codex.wordpress.org/Function_Reference/add_custom_image_header">add_custom_image_header()</a></code>. Jetzt bekommt der Nutzer des Themes im Backend unter <em>Design/Kopfzeile</em> eine nette kleine Bildverwaltung. Leider fehlt dort die Option, das Bild komplett wegzulassen.</p>
<p>Gute Themes bieten dafür eine Option an, TwentyTen und auch TwentyEleven leider nicht. Die nachträgliche Entfernung ist umständlich, wenn man kein Child-Theme erstellen möchte.</p>
<p>Deshalb habe ich ein kleines Plugin geschrieben, das sowohl das Bild im Frontend entfernt als auch den Menu-Eintrag im Backend.</p>
<p class="downloadlink"><a href="https://gist.github.com/1115203">Plugin Remove Header Image</a></p>
<p>Wie üblich – es gibt ein mindestens zwei Haken: Wenn im Theme nicht geprüft wird, ob überhaupt ein Bild vorhanden ist, ehe der Container dafür ausgegeben wird, bekommt man eine leere Fläche. Das ist dann eben ein Schrott-Theme. Davon gibt es leider zu viele.<br />
Und die Seite im Backend ist immer noch erreichbar, wenn man die URL dahin kennt. Bilder kann man aber nicht mehr hochladen.</p>
<p>Als Beispiel für den Einsatz in der Praxis sei das <a href="http://drehlog.de/">Videoblog Drehlog</a> genannt. Dort blogge ich mit ein paar Freunden ab und zu … tja … Videos.</p>
<p><a href="http://drehlog.de/"><img src="http://toscho.de/wp-content/uploads/2011/07/drehlog-300x300.png" alt="Screenshot Drehlog" width="300" height="300" class="aligncenter size-medium wp-image-1806" /></a></p>
<p>Irgendwie werde ich das Gefühl nicht los, einen leichteren Weg übersehen zu haben … sei’s drum.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-headergrafik-per-plugin-ausblenden/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>WordPress: Ein Plugin ist ein Plugin</title>
		<link>http://toscho.de/2011/wordpress-ein-plugin-ist-ein-plugin/</link>
		<comments>http://toscho.de/2011/wordpress-ein-plugin-ist-ein-plugin/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 13:25:16 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1793</guid>
		<description><![CDATA[Welcher Code gehört wohin? Wie mache ich es meinen Nutzern leicht – und mir selbst? Ein Blick auf meine Arbeitsweise und vielleicht sogar eine Entscheidungshilfe.]]></description>
			<content:encoded><![CDATA[<p>Ich will die Frage nicht mehr lesen: <i>Warum ist <a href="http://toscho.de/2010/wordpress-plugin-germanix/">Germanix</a> ein Plugin und keine <a href="https://github.com/bueltge/de_DE.php">de_DE.php</a> wie bei Frank Bültge?</i></p>
<p>Die erste Antwort darauf sieht ganz pragmatisch aus: Ungeachtet des schlecht gewählten Namens eignet sich Germanix für <strong>viele Sprachen:</strong> Dänisch, Türkisch, Französisch oder Spanisch zum Beispiel.<br />
Als <code>de_DE.php</code> wäre der Nutzen ohne Not reduziert, denn die benutzt WordPress ja nur, wenn in der <code>wp-config.php</code> eben diese Sprache angegeben wurde.</p>
<p>Die zweite – und mir wichtigere – Antwort fällt vielleicht eher unter <strong>Meinung,</strong> deshalb möchte ich vorausschicken, wie meine Sicht gefärbt ist: Ich schreibe pro Woche mindestens ein <a href="http://toscho.de/angebote/wordpress/plugins/">Plugin</a>, oft zwei, manchmal drei. Pro Monat schreibe ich zwei bis drei <a href="http://toscho.de/angebote/wordpress/themes/">Themes</a>. Ich weiß also ein wenig, was wo am besten funktioniert. Oder ich bin eingefahren, wie immer man das sehen möchte.</p>
<p>Was ich nicht bin: perfekt. Ich mache Fehler, schreibe <strong>Bugs</strong> in meinen Code, die ich dann wieder repariere. Bei einem komplexen System, dessen Bestandteile (Core, Themes und Plugins) separat aktualisiert oder ersetzt werden, kann sich so ein Bug recht gut verstecken. Manchmal entsteht so ein Fehler auch durch fremden Code, der nicht sauber geschrieben wurde, oder durch das Aufeinandertreffen zweier an sich ganz harmloser Codes.</p>
<p>Beispiel: Ein Beitrag wird plötzlich ganz anders ausgegeben, als er geschrieben wurde. Oder der Permalink dafür leitet auf die Fehlerseite.<br />
In solchen Fällen gehe ich wissenschaftlich vor: Ich ändere immer nur eine Variable, Schritt für Schritt, bis ich alle notwendigen Faktoren ermittelt habe. Dann weiß ich, wo ich suchen und flicken muß.</p>
<p><strong>Programmieren ist zu 80% Debuggen, also muß das einfach sein.</strong></p>
<p>Das heißt: Ich muß Code schnell und möglichst granular abschalten können. Als <code>de_DE.php</code> müßte ich zum Debuggen die Datei umbenennen, denn allein das Ändern der Sprache in der <code>wp-config.php</code> erfaßt zu viele weitere Faktoren. Das ist mir zu umständlich, obendrein vergesse ich es vielleicht.</p>
<p class="wideimg"><a href="http://www.flickr.com/photos/publicenergy/3325641526/"><img src="http://toscho.de/wp-content/uploads/2011/04/messy2.jpg" alt="" title="Messy! von publicenergy" width="560" height="420" class="aligncenter size-full wp-image-1796" /></a></p>
<p>Und für die Nutzer meines Plugins ist es noch umständlicher. Wer hat schon immer das FTP-Programm oder eine SSH-Shell geöffnet, wenn er an WordPress sitzt?</p>
<p>Als klassisches Plugin kann ich Germanix jederzeit einfach und isoliert abschalten.</p>
<p>Gleiches gilt auch für viele Hacks, die für die <code>functions.php</code> <a href="http://wordpress.stackexchange.com/questions/1567/best-collection-of-code-for-your-functions-php-file">empfohlen werden</a>. Wenn der eingebaute Code im Stylesheet oder in einer Template-Datei nicht berücksichtigt werden muß, dann gehört er in ein Plugin.<br />
Dabei entsteht keine zusätzliche Last, nur die Liste der aktiven Plugins wird um einen Eintrag erweitert. Und wenn diese paar Zeichen dein System schon in Not bringen, dann ist das System kaputt.</p>
<p>Wenn dir jemand sagt, er habe Plugin-Funktionalität <em>ohne ein Plugin</em>, dann glaub es nicht. Nicht der Ort des Codes entscheidet darüber, ob er ein Plugin ist, sondern das, was er tut. Auch ich habe diesen Fehler <a href="http://toscho.de/2009/no-no-no-nofollow/">schon begangen</a>. <strong>Sorry.</strong><br />
Mein <a class='piwik_download' href="https://github.com/toscho/Toscho-Dofollow">Dofollow-Code ist jetzt ein Plugin</a>, der Code zur <a href="http://toscho.de/2009/wordpress-umbruch-titel-steuern/">Kontrolle des Umbruchs</a> im Titel <a class='piwik_download' href="https://github.com/toscho/Prevent-Title-Widows">auch</a>.</p>
<p>Warum ist also Germanix ein Plugin? Weil es ein Plugin <em>ist</em>. Der Code benutzt die Plugin-API, er kann vom Theme komplett ignoriert werden, und er muß abschaltbar sein.</p>
<h2>Weitere Lektüre</h2>
<ul>
<li><a href="http://toscho.de/2010/wordpress-plugin-germanix/">WordPress-Plugin: Germanix</a></li>
<li><a href="http://toscho.de/2010/wordpress-cms-plugins/">WordPress als CMS: Hilfreiche Plugins</a></li>
<li><a href="http://toscho.de/2010/wordpress-tutorial-ein-framebreaker-plugin-schreiben/">WordPress-Tutorial: Ein Framebreaker-Plugin schreiben</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-ein-plugin-ist-ein-plugin/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>WordPress: Adminbar in Systemfarben</title>
		<link>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/</link>
		<comments>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 20:38:19 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1788</guid>
		<description><![CDATA[Ein WordPress-Plugin für eine angenehm bedienbare Adminbar. Screenshots und Download.]]></description>
			<content:encoded><![CDATA[<p>Ich finde die neue Adminbar recht praktisch, zumindest mit der <a href="http://wordpress.org/extend/plugins/debug-bar/">Debug-Bar</a>.</p>
<p>Leider sieht sie dämlich aus: Hellgrau auf Mittelgrau, zeitgemäß verhunzt mit Schatten und abgerundeten Ecken. Kinkerlitzchen, CSS3 vom Schlimmsten.</p>
<p>Ich habe diesen Quatsch mal aufgeräumt, die Farben auf die des Betriebssystems umgestellt und ein Plugin daraus gemacht:</p>
<p class="downloadlink"><a class='piwik_download' href="https://github.com/toscho/Admin-Bar-In-System-Colors">Admin Bar In System Colors</a></p>
<p class="wideimg"><a href="http://toscho.de/wp-content/uploads/2011/04/admin-system-compare.png"><img src="http://toscho.de/wp-content/uploads/2011/04/admin-system-compare.png" alt="Vergleich der Adminbar mit und ohne Plugin" width="650" height="400" class="alignnone size-full wp-image-1789" /></a></p>
<p>Das kann hoffentlich jede und jeder gut lesen.</p>
<p>Forks, Fragen oder <del datetime="2011-04-06T20:15:54+00:00">Fer</del> Verbesserungsvorschläge?</p>
<p>Umfangreiche Browsertests habe ich noch nicht gemacht – keine Zeit! – und vielleicht sollte ich das Standardstylesheet komplett ersetzen, statt es zu überschreiben. Auch über die feste Höhe samt Pixelschriftgröße werde ich sicher nochmal nachdenken. Und die kleine Grafik für aufklappbare Menus kann man kaum noch erkennen …</p>
<h2>Weiterlesen</h2>
<ul>
<li><a href="http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/">WordPress-Plugin: Backend Style Enhancements</a></li>
<li><a href="http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/">WordPress: Grundeinstellungen per Plugin setzen</a></li>
<li><a href="http://toscho.de/2009/wordpress-administrator-php-herausfinden/">WordPress: Administrator mit PHP herausfinden</a></li>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>WordPress: Permanente Umleitung auf upgrade.php beheben</title>
		<link>http://toscho.de/2011/wordpress-umleitung-upgrade-php-beheben/</link>
		<comments>http://toscho.de/2011/wordpress-umleitung-upgrade-php-beheben/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 07:30:58 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1784</guid>
		<description><![CDATA[Wie man eine überflüssige Umleitung behebt.]]></description>
			<content:encoded><![CDATA[<p>Eben habe ich ein Blog auf Version 3.1 aktualisiert. Danach wurde ich immer auf <code>wp-admin/upgrade.php?_wp_http_referer=%2Fwp-admin%2Findex.php</code> umgeleitet, wenn ich auf den Link zum Dashboard – <code>/wp-admin/index.php</code> – geklickt habe.<br />
Ein direkter Aufruf der Adresse <code>/wp-admin/</code> (ohne <code>index.php</code>) hingegen klappte problemlos.</p>
<p>Eine kurze Suche im Quellcode ergab den Auslöser: In der <code>/wp-admin/admin.php</code> steht eine Abfrage, ob die Datenbank aktualisiert wurde. Steht der Wert <code>db_upgraded</code> in der Optionstabelle nicht auf <code>FALSE</code>, so wird die Umleitung erzeugt, die dann eigentlich den Wert nach dem ersten Aufruf korrekt setzen sollte. Warum das nicht klappt, kann ich noch nicht sagen, aber die Lösung liegt jetzt auf der Hand:</p>
<ol>
<li>Rufe <code>/wp-admin/options.php</code> auf. Diese URL mußt du vermutlich per Hand eingeben.</li>
<li>Suche nach dem Eintrag <code>db_upgraded</code> und setze eine <code>0</code> (Null) hinein.</li>
<li>Drücke auf »Änderungen übernehmen«. Fertig.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-umleitung-upgrade-php-beheben/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugin: Magische Widgets</title>
		<link>http://toscho.de/2011/wordpress-plugin-magische-widgets/</link>
		<comments>http://toscho.de/2011/wordpress-plugin-magische-widgets/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 14:19:56 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Markup]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1768</guid>
		<description><![CDATA[Wie man Widgets auch in die heikelsten Stellen schiebt. Download und ausführliche Dokumentation inklusive.]]></description>
			<content:encoded><![CDATA[<p class="downloadlink"><a href="http://wordpress.org/extend/plugins/magic-widgets/">Download auf wordpress.org</a></p>
<p>Neulich stand ich vor einem spannenden Problem: Ein Freund wollte eine Zeile JavaScript und einen Link auf ein Stylesheet in den Header seines <a href="http://toscho.de/angebote/wordpress/themes/" title="Ich baue auch eigene!">Themes</a> bringen. Dieses Theme stammt aus dem <a href="http://wordpress.org/extend/themes/">Verzeichnis auf wordpress.org</a>, und es sollte weiterhin automatisch aktualisiert werden. Ich konnte also nicht direkt hineinschreiben.<br />
Nun hätte ich ein <a href="http://codex.wordpress.org/Child_Themes">Child-Theme</a> anlegen können, aber das fand ich dann etwas zu umständlich. Obendrein wäre das eine Speziallösung gewesen, und ich bin nun einmal Generalist.<br />
Ich wollte eine Lösung, die ich wiederverwenden kann. Und ihr vielleicht auch.</p>
<p>Zeit für einen kleinen Zaubertrick.</p>
<h2>Das Konzept</h2>
<p>Im Kopfteil eines jeden Themes, das auf wordpress.org zugelassen wird, finden wir die Funktion <a href="http://codex.wordpress.org/Plugin_API/Action_Reference/wp_head">wp_head</a>. Diese löst eine gleichnamige Aktion aus. Wenn wir uns in diese Aktion einklinken, können wir tun, was immer uns beliebt. Zum Beispiel Text ausgeben.</p>
<p>Als Plugin wäre das ein Vierzeiler:</p>
<pre class="notranslate">&lt;?php
<i>/* Plugin Name: Simple Head Insert */</i>
add_action( <code class="string">'wp_head'</code>, <code class="string">'simple_head_insert'</code> );
function simple_head_insert() { echo <code class="string">'&lt;!-- Buh! --&gt;'</code>; }</pre>
<p>Ganz nett, aber irgendwie … nicht gut genug. Es ist immer noch zu speziell, weil die Ausgabe fest im PHP-Code steht. Wenn die Ausgabe oder die Position geändert werden soll, muß das Plugin umgeschrieben werden. Das ist sehr fehleranfällig.</p>
<p>Jemand anderes möchte vielleicht Code im Backend einfügen. Der muß sich das Plugin im Grunde selbst neu schreiben.</p>
<p>Also habe ich mir gedacht: Dann hänge ich doch einfach an die Aktion <code>widgets_init</code> eine Funktion, die eine Instanz einer Klasse erzeugt, die für die Aktionen <code>wp_head</code>, <code>wp_footer</code>, <code>admin_head</code> und <code>admin_footer</code> eine weitere Funktion registriert, die wiederum den Inhalt einer ebenfalls registrierten Sidebar ausgibt, die man frei mit einem Widget befüllen kann, das ich in eine weiteren Klasse gepackt habe.</p>
<p>Klarsoweit?</p>
<p>Nicht? Dann kannst du dir den <strong><a href="https://github.com/toscho/WP-Magic-Widgets">Code auf GitHub ansehen und herunterladen</a></strong>. Für die Eingabe des HTML-Codes habe ich eine einfachere Variante des nativen Text-Widgets geschrieben; sie heißt <strong>Unfiltered Text Widget</strong>.</p>
<p>150 Zeilen mehr als die erste Version, dafür um so mächtiger. Frank wird mich sicher noch ermahnen, daß ich doch eine Sprachdatei einarbeiten sollte. Keine Lust. Insgesamt finde ich den Code immer noch angenehm einfach und enorm flexibel zugleich. Ich bin ausnahmsweise und sicher nur für kurze Zeit mal zufrieden damit.</p>
<h2>Einsatz</h2>
<p>Jetzt wollen wir uns noch ansehen, wie man das verdammte Ding benutzt.</p>
<p>Zunächst laden wir es herunter, packen es ins Pluginverzeichnis und aktivieren es. Ja, sehr spannend.</p>
<p><img src="http://toscho.de/wp-content/uploads/2011/01/activate.png" alt="" title="Plugin aktivieren" width="588" height="109" class="alignnone size-full wp-image-1774 border" /></p>
<p>Jetzt gehen wir auf »Design/Widgets«, und da haben wir vier neue Sidebars und ein neues Widget namens »Unfiltered Text«.</p>
<p><img src="http://toscho.de/wp-content/uploads/2011/01/sidebars-backend.png" alt="" title="Sidebars im Backend" width="309" height="281" class="alignnone size-full wp-image-1775 border" /><img src="http://toscho.de/wp-content/uploads/2011/01/unfiltered-text-widget.png" alt="" title="Widget Unfiltered Text" width="274" height="71" class="alignnone size-full wp-image-1776 border" /></p>
<p>Wir klappen zur Probe mal die Box für den »Front End Header« auf und ziehen das neue Widget hinein. Das können wir übrigens überall benutzen, auch in anderen Sidebars.</p>
<p>In das Eingabefeld schreiben wir ein Script:</p>
<pre class="notranslate">&lt;script&gt;alert('Buh!');&lt;/script&gt;</pre>
<p><img src="http://toscho.de/wp-content/uploads/2011/01/unfiltered-text-widget-edit.png" alt="" title="Widget-Editor" width="375" height="339" class="alignnone size-full wp-image-1773 border" /></p>
<p>Und dann rufen wir das Frontend unserer Website auf:</p>
<p><img src="http://toscho.de/wp-content/uploads/2011/01/script-test.png" alt="" title="Script-Test" width="347" height="129" class="alignnone size-full wp-image-1777" /></p>
<p>Faaaantastisch! Jetzt kann uns nichts mehr bremsen.</p>
<ul>
<li>In den Footer des Frontends können wir den Tracking-Code des <a href="http://toscho.de/2009/piwik-ueberblick-installation/">Analyse-Tools unserer Wahl</a> eingeben – und schon geht das Gezähle los.</li>
<li>In den Header des Backends können wir schreiben:
<pre class="notranslate">&lt;style&gt;#footer{display:none}&lt;/style&gt;</pre>
<p>Und – zack! – ist der Footer weg.</li>
<li>Wir können den JavaScript-Code des <a href="http://toscho.de/2010/wordpress-plugin-icon-to-link/">Plugins Icon to Link</a> einbauen.</li>
<li>Wer so richtig Spaß haben will, schreibt sich dies in beide Header:
<pre class="notranslate">&lt;style&gt;body{display:none}&lt;/style&gt;</pre>
</li>
</ul>
<p>Für weitere kreative Ideen und die obligatorischen … Verbesserungsvorschläge stehen euch die Kommentare offen.</p>
<h2>Anpassen</h2>
<p>Für Hacker habe ich zwei Filter eingebaut, die eine Kombination des Plugins mit dem eigenen Theme erlauben:</p>
<ol>
<li><code class="string">'magic_widgets_actions'</code> übergibt einen Array mit den Aktionen. Den können wir per Filter in der <code>functions.php</code> frei ändern:
<pre class="notranslate">add_filter( <code class="string">'magic_widgets_actions'</code>, <code class="string">'change_magic_widget_actions'</code>, 10, 1 );
function change_magic_widget_actions( <var>$arr</var> )
{
    <i>// Add</i>
    <var>$arr</var>[<code class="string">'loop_start'</code>] = <code class="string">'Post List Start'</code>;
    <i>// Remove</i>
    unset( <var>$arr</var>[<code class="string">'admin_footer'</code>] );
    <i>// Rename</i>
    <var>$arr</var>[<code class="string">'admin_head'</code>] = <code class="string">'HTML-Kopf Administration'</code>;
    return <var>$arr</var>;
}</pre>
<p>Mehr Aktionen findet ihr im <a href="http://codex.wordpress.org/Plugin_API/Action_Reference">Codex</a>, bei <a href="http://adambrown.info/p/wp_hooks">Adam R Brown</a> und auf <a href="http://docs.der-design.com/wp-actions-filters/">der-design.com</a>.</p>
<p>Ich habe mich auf die vier oben genannten Aktionen beschränkt, um die Widgetliste im Backend übersichtlich zu halten. Im Prinzip können wir aber auch 40 oder 400 Aktionen ansprechen.
</li>
<li>Den Namen <strong>Unfiltered Text</strong> können wir über den Filter <code class="string">'magic_widgets_name'</code> ändern (I18n für Arme!).</li>
</ol>
<p>Fehlt was? Funktioniert alles?</p>
<h2>Weitere Artikel dazu hier im Blog</h2>
<ul>
<li><a href="http://toscho.de/2010/wordpress-tutorial-ein-framebreaker-plugin-schreiben/">WordPress-Tutorial: Ein Framebreaker-Plugin schreiben</a></li>
<li><a href="http://toscho.de/2010/wordpress-tutorial-eigenes-widget-schreiben/">WordPress-Tutorial: Eigenes Widget schreiben</a></li>
<li><a href="http://toscho.de/2009/wordpress-parallele-widgets/">WordPress: Parallele Widgets</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/">WordPress-Plugin: Backend Style Enhancements</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-plugin-magische-widgets/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugin: Icon to Link</title>
		<link>http://toscho.de/2010/wordpress-plugin-icon-to-link/</link>
		<comments>http://toscho.de/2010/wordpress-plugin-icon-to-link/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 17:39:07 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[icon]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1759</guid>
		<description><![CDATA[Ein kleines Plugin, das den Editor verständlicher gestaltet.]]></description>
			<content:encoded><![CDATA[<p>Die Icons über dem Editor in WordPress sparen zwar Platz, verstanden werden sie leider nicht immer. Müde dieser Art Support habe ich kleines Plugin verzapft, das aus den Icons klassische Textlinks macht: <a href="https://github.com/toscho/Icon-to-link">Plugin Icon to Link auf GitHub</a>.</p>
<p>So wirkt es:<br />
<img src="http://toscho.de/wp-content/uploads/2010/12/icon-to-link.png" alt="" title="Icon to Link" width="293" height="199" class="alignnone size-full wp-image-1762" /></p>
<p>Und das ist der <del datetime="2010-12-29T21:04:09+00:00">gegenwärtige</del> <ins datetime="2010-12-29T21:04:09+00:00">alte</ins> Code, den man <a href="https://github.com/toscho/Icon-to-link/blob/176b91b8c3812c11c0abe40b44a8926b6dde92cd/icon-to-link.php">im Archiv herunterladen</a> kann:</p>
<pre class="notranslate php">&lt;?php
<i>/*
Plugin Name: Icon to Link
Plugin URI: http://toscho.de/2010/wordpress-plugin-icon-to-link/
Description: Changes upload icons in the edit screen into text links.
Version: 0.3
Author: Thomas Scholz
Author URI: http://toscho.de
*/</i>

add_action( <code class="string">'admin_head'</code>, <code class="string">'itb_change'</code> );
function itb_change()
{   ?&gt;
&lt;script type=<code class="string">"text/javascript"</code>&gt;jQuery(document).ready(function($){
    $(<code class="string">'a#add_image'</code>).text( '&lt;?php _e(<code class="string">'Image'</code>); ?&gt;' );
    $(<code class="string">'a#add_video'</code>).text( '&lt;?php _e(<code class="string">'Video'</code>); ?&gt;' );
    $(<code class="string">'a#add_audio'</code>).text( '&lt;?php _e(<code class="string">'Audio'</code>); ?&gt;' );
    $(<code class="string">'a#add_media'</code>).text( '&lt;?php _ex(<code class="string">'File'</code>, <code class="string">'column name'</code> ); ?&gt;' );
});&lt;/script&gt;
    &lt;?php
}</pre>
<p>Auf zwei Details sei hingewiesen: Dazu braucht man kein jQuery. Aber da es ohnehin geladen wird, habe ich es um der Kürze gleich verwendet.<br />
<del datetime="2010-12-28T19:47:08+00:00">Und der Text <i lang="en">File</i> wird seltsamerweise nicht übersetzt, obwohl er genau so in der Sprachdatei steht. Das finde ich noch heraus …</del><br />
<i lang="en">File</i> wird nur ersetzt, wenn man den passenden Kontext angibt, hier <code>column name</code>.</p>
<h2>Update 29.12.</h2>
<p>Ich habe das Javascript jetzt in eine separate Datei ausgelagert, einen Filter für die Namen eingebaut und sichergestellt, daß der Code nur auf Seiten mit einem Editor und dort erst am Seitenende geladen wird.</p>
<h3>PHP-Code</h3>
<div class="php-code">
<pre class="notranslate php-code"><span class='openclose'>&lt;?php
</span><i class='comment'>/*
Plugin Name: Icon to Link
Plugin URI: <a href="http://toscho.de/2010/wordpress-plugin-icon-to-link/">http://toscho.de/2010/wordpress-plugin-icon-to-link/</a>
Description: Changes upload icons in the edit screen into text links.
Version: 0.4
Author: Thomas Scholz
Author URI: <a href="http://toscho.de">http://toscho.de</a>
*/</i>

add_action( <span class='string'>&#039;admin_init&#039;</span>, <span class='string'>&#039;itb_change&#039;</span> );
<span class='internal'>function</span> itb_change()
{
    <i class='comment'>// Load the script on editor pages only.
</i>    <span class='internal'>if</span> ( <span class='internal'>empty</span> ( <var>$GLOBALS</var>[<span class='string'>&#039;pagenow&#039;</span>] )
        <span class='internal'>or</span> <span class='operator'>!</span> ( <span class='string'>&#039;post.php&#039;</span> <span class='operator'>==</span> <var>$GLOBALS</var>[<span class='string'>&#039;pagenow&#039;</span>]
            <span class='internal'>or</span> <span class='string'>&#039;post-new.php&#039;</span> <span class='operator'>==</span> <var>$GLOBALS</var>[<span class='string'>&#039;pagenow&#039;</span>] )
    )
    {
        <span class='internal'>return</span>;
    }

    <var>$handle</var>  <span class='operator'>=</span> <span class='string'>&#039;icon-to-links&#039;</span>;

    wp_register_script( <var>$handle</var>, plugins_url( <span class='string'>&#039;itl.js&#039;</span>, <span class='constant'>__FILE__</span> ), <span class='string'>&#039;jquery&#039;</span>, <span class='string'>&#039;0.4&#039;</span>, <span class='internal'>TRUE</span> );
    wp_enqueue_script( <var>$handle</var> );

    <i class='comment'>// Localize
</i>    <var>$text</var> <span class='operator'>=</span> <span class='internal'>array</span> (
        <span class='string'>&#039;image&#039;</span> <span class='operator'>=&gt;</span> __( <span class='string'>&#039;Image&#039;</span> )
    ,   <span class='string'>&#039;video&#039;</span> <span class='operator'>=&gt;</span> __( <span class='string'>&#039;Video&#039;</span> )
    ,   <span class='string'>&#039;audio&#039;</span> <span class='operator'>=&gt;</span> __( <span class='string'>&#039;Audio&#039;</span> )
    ,   <span class='string'>&#039;file&#039;</span>  <span class='operator'>=&gt;</span> _x( <span class='string'>&#039;File&#039;</span>, <span class='string'>&#039;column name&#039;</span> )
    );
    <i class='comment'>// To change the names, add a filter for &#039;itl_names&#039;.
</i>    <var>$text</var> <span class='operator'>=</span> apply_filters( <span class='string'>&#039;itl_names&#039;</span>, <var>$text</var> );
    wp_localize_script( <var>$handle</var>, <span class='string'>&#039;i2l&#039;</span>, <var>$text</var> );

    <span class='internal'>return</span>;
}

<i class='comment'>/**
 * Sample filter:

add_filter( &#039;itl_names&#039;, &#039;change_itl_names&#039;, 10, 1 );
function change_itl_names( $names )
{
    $names[&#039;image&#039;] = &#039;Foto&#039;;
    return $names;
}

*/</i></pre>
</div>
<h3>Javascript (itl.js)</h3>
<pre class="notranslate">jQuery(document).ready(function(<var>$</var>){
    $(<code class="string">'a#add_image'</code>).text( <var>i2l.image</var> );
    $(<code class="string">'a#add_video'</code>).text( <var>i2l.video</var> );
    $(<code class="string">'a#add_audio'</code>).text( <var>i2l.audio</var> );
    $(<code class="string">'a#add_media'</code>).text( <var>i2l.file</var>  );
});</pre>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-plugin-icon-to-link/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugin: Germanix</title>
		<link>http://toscho.de/2010/wordpress-plugin-germanix/</link>
		<comments>http://toscho.de/2010/wordpress-plugin-germanix/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 14:07:28 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Zeichen]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1753</guid>
		<description><![CDATA[Kurzvorstellung meines Plugins zum Konvertieren von Umlauten und ähnlichen Zeichen für URLs und Dateinamen.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2010/12/germanix.png" alt="" title="germanix" width="150" height="150" class="alignright size-full wp-image-1800" /></p>
<p>Nicht neu, aber bisher ungebloggt: Das <a href="https://github.com/toscho/Germanix-WordPress-Plugin">Plugin Germanix</a> wandelt Umlaute und viele andere Nicht-ASCII-Zeichen in einen passenden Ersatz um und erstellt daraus <a href="http://toscho.de/2009/beste-url-struktur/">Permalinks</a> und Dateinamen. Es ersetzt das längst nicht mehr gepflegte Plugin <a href="http://otaku42.de/2005/06/30/plugin-o42-clean-umlauts/">o42-clean-umlauts</a>.</p>
<p>Germanix schlägt zu, wenn man eine Datei hochlädt oder einen Artikel anlegt. Bei neuen Schlagwörtern, Kategorien, eigenen Taxonomien und Post-Typen natürlich auch.</p>
<p>Ein Beispiel: Einem Artikel mit dem schönen Titel »12 m³ Scheiße« gibt WordPress ohne weitere Plugins den Slug <samp>12-m³-scheise</samp>. Jetzt haben wir ohne Not ein Nicht-ASCII-Zeichen darin, und ein entstelltes ß.</p>
<p>Germanix hingegen produziert <samp>12-m3-scheisse</samp>. Das paßt besser.</p>
<p>Das Plugin besteht eigentlich aus zweien: <em>Germanix URL</em> für URLs und Dateinamen und <em>Germanix Translate</em> für Übersetzungen im Backend. Beide Plugins lassen sich separat anschalten. Das Übersetzungsplugin werde ich vermutlich irgendwann fallen lassen – außer der Umwandlung von »Dashboard« nach »Übersicht« brennt darin nichts; manche Einträge sind sogar veraltet.</p>
<p>Fehler und Vorschläge wirf bitte in den <a href="https://github.com/toscho/Germanix-WordPress-Plugin/issues">Bugtracker</a>. Da finde ich sie wieder.<br />
Oder besser noch: <a href="http://help.github.com/forking/">Erstelle einen Fork</a>, baue deine Ideen selber ein und sende einen Push-Request zurück.</p>
<p>Solange das Plugin nur bei GitHub liegt und ich keinen eigenen Updateserver eingerichtet habe, wird es keine automatische Aktualisierung geben, nur Hinweise per <a href="http://twitter.com/toscho">Twitter</a>. Sorry!</p>
<p>Ich habe neulich ein anderes Plugin – <a lang="en" hreflang="en" href="http://wordpress.org/extend/plugins/remove-redundant-links/">Remove Redundant Links</a> – testhalber im offiziellen Verzeichnis abgelegt und bin schon jetzt so genervt von SVN, daß ich auf weitere Experimente damit wenig Lust verspüre. Ja, <a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html#_caveats">git-svn</a> kenne ich. Das nervt auch.<br />
Schließlich geht es mir bei solchen Projekten auch um den Spaß an der Sache, also <em>nicht</em> um SVN.</p>
<p>Momentan wird der Windows-Livewriter noch nicht unterstützt. Wer das braucht, dem empfehle ich <a href="http://wordpress-buch.bueltge.de/das-wordpress-buch/downloads/extra/">Frank Bültges Alternative</a>. Die erfaßt weniger Zeichen und wird im Sprachverzeichnis abgelegt, wo sie sich nicht so einfach abschalten läßt wie ein Plugin. Dafür wandelt sie auch maskierte Zeichen um – das habe ich bisher weder gebraucht noch geschafft.</p>
<h2>Weitere WordPress-Plugins</h2>
<ul>
<li><a href="http://toscho.de/2011/wordpress-plugin-magische-widgets/">Magische Widgets</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-icon-to-link/">Icon to Link</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/">Backend Style Enhancements</a></li>
<li><a href="http://toscho.de/2010/wordpress-plugin-canonical-permalink/">Canonical Permalink</a></li>
<li><a href="http://toscho.de/2010/wordpress-tutorial-ein-framebreaker-plugin-schreiben/">Tutorial: Ein Framebreaker-Plugin schreiben</a></li>
<li><a href="http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/">Basic Settings</a></li>
<li><a href="http://toscho.de/2009/deppenlink-entfernen/">Remove Redundant Links</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-plugin-germanix/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>WordPress: Internet Explorer ohne CSS-Hacks ansprechen</title>
		<link>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/</link>
		<comments>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 07:43:50 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1731</guid>
		<description><![CDATA[Wie man jede Version des Internet Explorers einfach mit einem Klassennamen ansprechen kann. Extra Code für WordPress-Themes inklusive.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2010/09/ie-150.png" alt="" title="ie-150" width="150" height="150" class="alignright size-full wp-image-1732" />Den Internet Explorer betrachten die meisten Webentwickler zu Recht als chronische Krankheit. Neben anderen Browsern sieht auch die kommende Version 9 <a href="http://www.findmebyip.com/litmus">eher bedrückend</a> aus. Ehe wir diesem Browser keine Extrawurst mehr braten müssen, wird noch viel Zeit vergehen.</p>
<p>Um den IE im Stylesheet gesondert anzusprechen, brauchen wir weder Hacks im CSS noch eine zusätzliche Datei oder gar (pfui!) eine serverseitige Browserweiche. Wir müssen nur das Element <code>&lt;html&gt;</code> über <a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx" lang="en" hreflang="en">Conditional Comments</a> anpassen. Diese Idee <a href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/" hreflang="en">hatte Paul Irish schon 2008</a>.</p>
<p>Ich habe das neulich in einem WordPress-Theme eingesetzt und mag es so sehr, daß ich künftig all meine Themes damit ausrüsten werde.<br />
Ein wenig umständlich: Die Sprachattribute werden in WordPress mit der Funktion <a href="http://codex.wordpress.org/Function_Reference/language_attributes"><code>language_attributes()</code></a> erzeugt – und die hat ein fest eingebautes <code>echo</code>, das man nicht abschalten kann. Ich will nun nicht drei Meter Code in der <code>header.php</code> stehen haben, deshalb habe ich mir zwei kleine Funktionen gebaut. Die Funktion <code>get_language_attributes()</code> ist obendrein etwas schlanker als das Original, und sie gibt das Attribut <code>dir</code> nur aus, wenn der Text von rechts nach links läuft. Andernfalls ist es an dieser Stelle überflüssig.</p>
<p>Doch zum Code, er gehört in die <code>functions.php</code>:</p>
<div class="php-code">
<pre class="notranslate php"><span class='openclose'>&lt;?php
</span><i class='comment'>/**
 * html5 start tag + language attribute + conditional tags for IE Win
 * @link   <a href="http://paulirish.com/?p=88">http://paulirish.com/?p=88</a>
 * @param  bool $print
 * @return void|string
 */</i>
<span class='internal'>function</span> htmlstart(<var>$print</var> <span class='operator'>=</span> <span class='internal'>TRUE</span>)
{
    <var>$out</var>  <span class='operator'>=</span> <span class='string'>&#039;&lt;!Doctype html&gt;&#039;</span>;
    <var>$lang</var> <span class='operator'>=</span> get_language_attributes();
    <var>$ies</var>  <span class='operator'>=</span> <span class='internal'>array</span> (
        6 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte6 lte7 lte8&#039;</span>
    ,   7 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte7 lte8&#039;</span>
    ,   8 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte8&#039;</span>
    ,   9 <span class='operator'>=&gt;</span> <span class='string'>&#039;&#039;</span>
    );

    <span class='internal'>foreach</span> ( <var>$ies</var> <span class='internal'>as</span> <var>$n</var> <span class='operator'>=&gt;</span> <var>$class</var> )
    {
        <var>$out</var> <span class='operator'>.=</span> &quot;<span class='string'>&lt;!--[if IE </span><var>$n</var><span class='string'>]&gt;&lt;html </span><var>$lang</var><span class='string'> class=&#039;ie ie</span><var>$n</var><span class='string'> </span><var>$class</var><span class='string'> lte9&#039;&gt;&lt;![endif]--&gt;</span>&quot;;
    }

    <var>$out</var> <span class='operator'>.=</span> &quot;<span class='string'>&lt;!--[if !IE]&gt;&lt;!--&gt;&lt;html </span><var>$lang</var><span class='string'>&gt;&lt;!--&lt;![endif]--&gt;</span>&quot;;

    <span class='internal'>if</span> ( <span class='operator'>!</span> <var>$print</var> )
    {
        <span class='internal'>return</span> <var>$out</var>;
    }

    <span class='internal'>print</span> <var>$out</var>;
}

<span class='internal'>if</span> ( <span class='operator'>!</span> <a href='http://php.net/function_exists'>function_exists</a>(<span class='string'>&#039;get_language_attributes&#039;</span>) )
{
    <i class='comment'>/**
     * Returns the language attributes.
     *
     * Unobstrusive copy from the core.
     * Requires WP 3.0+
     *
     * @param string $doctype The type of html document (xhtml|html).
     */</i>
    <span class='internal'>function</span> get_language_attributes(<var>$doctype</var> <span class='operator'>=</span> <span class='string'>&#039;html&#039;</span>) {
        <var>$output</var> <span class='operator'>=</span> is_rtl() <span class='operator'>?</span> <span class='string'>&#039;dir=&quot;rtl&quot;&#039;</span> <span class='operator'>:</span> <span class='string'>&#039;&#039;</span>;

        <span class='internal'>if</span> ( <var>$lang</var> <span class='operator'>=</span> get_bloginfo(<span class='string'>&#039;language&#039;</span>) )
        {
            <var>$output</var> <span class='operator'>.=</span> ( ( get_option(<span class='string'>&#039;html_type&#039;</span>) <span class='operator'>!=</span> <span class='string'>&#039;text/html&#039;</span>
                <span class='operator'>||</span> <var>$doctype</var> <span class='operator'>==</span> <span class='string'>&#039;xhtml&#039;</span> )
                <span class='operator'>?</span> <span class='string'>&#039; xml:&#039;</span> <span class='operator'>:</span> <span class='string'>&#039;&#039;</span>) <span class='operator'>.</span> <span class='string'>&#039;lang=&quot;&#039;</span> <span class='operator'>.</span> <var>$lang</var> <span class='operator'>.</span> <span class='string'>&#039;&quot;&#039;</span>;
        }

        <span class='internal'>return</span> apply_filters(<span class='string'>&#039;language_attributes&#039;</span>, <var>$output</var>);
    }
}</pre>
</div>
<p>Im Theme rufen wir die Funktion dort auf, wo früher die Doctype-Deklaration und das Start-Tag standen.<br />
Die Ausgabe sieht (hier aufgehübscht) etwa so aus:</p>
<pre class="notranslate html">&lt;!Doctype html&gt;
&lt;!--[if IE 6]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie6 lte6 lte7 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 7]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie7 lte7 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 8]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie8 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 9]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie9 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if !IE]&gt;&lt;!--&gt;
    &lt;html lang=<code class="string">"de-DE"</code>&gt;
&lt;!--&lt;![endif]--&gt;</pre>
<p>Nein, das ist kein sehr schönes Markup mehr. Aber so richtig schlimmes auch nicht. Obendrein validiert es.</p>
<p>Im Stylesheet können wir den Internet Explorer jetzt ganz einfach mit der passenden Klasse ansprechen:</p>
<pre class="notranslate">.ie8
{
    top:        10px;
}
.lte7
{
    top:        15px;
}</pre>
<p>Das kann ich mir viel besser merken als Kommentarhacks oder Spielereien mit ungültigen Selektoren und Eigenschaften.</p>
<p>Mehrere Internet Explorer auf einem Windows kann man sich mit der <a href="http://utilu.com/IECollection/" lang='en' hreflang='en'>Utilo IE Collection</a> einrichten. Zum Testen der Conditional Comments habe ich im Labor eine kleine Seite eingerichtet: <a href="http://labs.toscho.de/test/conditional-comments/">CC-Test</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Database Caching using disk: basic
Object Caching 597/732 objects using disk: basic

Served from: toscho.de @ 2012-02-04 12:36:32 -->
