<?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; Trickkiste</title>
	<atom:link href="http://toscho.de/thema/trickkiste/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>Apache: Fehlerseiten testen</title>
		<link>http://toscho.de/2010/apache-fehlerseiten-testen/</link>
		<comments>http://toscho.de/2010/apache-fehlerseiten-testen/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 08:00:59 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1756</guid>
		<description><![CDATA[Kleiner Trick mit mod_rewrite, der den Test erleichtert. Beispiele und Bookmarklets inklusive.]]></description>
			<content:encoded><![CDATA[<p>Mit der <a href="http://httpd.apache.org/docs/2.2/mod/core.html#errordocument">Direktive ErrorDocument</a> können wir dem Apachen sagen, welche Datei oder Nachricht er bei welchem <a href="http://toscho.de/2010/logfiles-analysieren/#toc-statuscode" title="Übersicht der wichtigsten Statuscodes">Statuscode</a> ausgeben soll. </p>
<pre class="notranslate">ErrorDocument 403 /403.php
ErrorDocument 401 /401.php
ErrorDocument 410 <code class="string">"&lt;h1&gt;Wech! Pech!&lt;/h1&gt;"</code></pre>
<p>Aber wie testen wir die? Den Status 404 können wir einfach durch eine falsche Adresse auslösen; 401 kommt aber erst, wenn wir an einer <a href="http://toscho.de/2009/authentifizierung-php-utf-8/" title="Authentifizierung mit PHP und UTF-8">Authentifizierung</a> gescheitert sind. Ganz bestimmt wollen wir nicht für jeden Fehler einen separaten Test bauen, das dauert viel zu lange.</p>
<p>Die Antwort: mit <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a>.</p>
<pre class="notranslate">RewriteCond <var>%{QUERY_STRING}</var> ^status=401$
RewriteRule ^ - [L,R=401]
RewriteCond <var>%{QUERY_STRING}</var> ^status=403$
RewriteRule ^ - [L,R=403]
RewriteCond <var>%{QUERY_STRING}</var> ^status=404$
RewriteRule ^ - [L,R=404]
RewriteCond <var>%{QUERY_STRING}</var> ^status=410$
RewriteRule ^ - [L,R=410]
RewriteCond <var>%{QUERY_STRING}</var> ^status=500$
RewriteRule ^ - [L,R=500]
</pre>
<p style="max-width:none"><img src="http://toscho.de/wp-content/uploads/2010/12/statuscodes.png" alt="" title="Statuscodes" width="150" height="150" class="aligncenter size-full wp-image-1799" /></p>
<p>Rufen wir jetzt eine beliebige Adresse auf und hängen den gewünschten Statuscode an, so liefert der Server brav unsere Fehlerseite.</p>
<ul>
<li><code>example.com/?status=403</code> gibt uns also die 403.php,</li>
<li><code>example.com/?status=410</code> den Text <samp>Wech! Pech!</samp> und</li>
<li><code>example.com/?status=500</code> den Serverfehler.</li>
</ul>
<p>Mit zwei kleinen Bookmarklets, die wir als Lesezeichen speichern, können wir jetzt fröhlich unsere Testcodes abklettern:</p>
<p><a href='javascript:(function(){var c,b;IB=1;function a(d){return("0"&lt;=d&amp;&amp;d&lt;="9")}L=location.href;LL=L.length;for(c=LL-1;c&gt;=0;--c){if(a(L.charAt(c))){for(b=c-1;b&gt;=0;--b){if(!a(L.charAt(b))){break}}break}}++b;if(c&lt;0){return}oldNum=L.substring(b,c+1);newNum=""+(parseInt(oldNum,10)+IB);while(newNum.length&lt;oldNum.length){newNum="0"+newNum}location.href=L.substring(0,b)+newNum+L.slice(c+1)})();'>Letzte Ziffer + 1</a> · <a href='javascript:(function(){var c,b;IB=-1;function a(d){return("0"&lt;=d&amp;&amp;d&lt;="9")}L=location.href;LL=L.length;for(c=LL-1;c&gt;=0;--c){if(a(L.charAt(c))){for(b=c-1;b&gt;=0;--b){if(!a(L.charAt(b))){break}}break}}++b;if(c&lt;0){return}oldNum=L.substring(b,c+1);newNum=""+(parseInt(oldNum,10)+IB);while(newNum.length&lt;oldNum.length){newNum="0"+newNum}location.href=L.substring(0,b)+newNum+L.slice(c+1)})();'>Letzte Ziffer - 1</a></p>
<p>Wenn alles so aussieht wie gewünscht, sollten wir die Regeln natürlich wieder entfernen. Es genügt völlig, wenn nur <em>wir</em> testen.</p>
<h2>Weitere Lektüre</h2>
<ul>
<li><a href="http://toscho.de/2010/logfiles-analysieren/">Logfiles analysieren</a></li>
<li><a href="http://toscho.de/2010/wordpress-htaccess-request-saeubern/">WordPress und .htaccess: Request säubern</a></li>
<li><a href="http://toscho.de/2010/skripte-gegen-http-aufrufe-sperren/">Zugriff verboten: Wie man Skripte gegen HTTP-Aufrufe sperrt</a></li>
<li><a href="http://toscho.de/2009/authentifizierung-php-utf-8/">Authentifizierung mit PHP und UTF-8</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/apache-fehlerseiten-testen/feed/</wfw:commentRss>
		<slash:comments>2</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>
		<item>
		<title>jQuery: Interne Sprungziele anbieten</title>
		<link>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/</link>
		<comments>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 00:24:58 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Interna]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1647</guid>
		<description><![CDATA[Wie man interne Anker mittels jQuery herausstellt und anklickbar macht.]]></description>
			<content:encoded><![CDATA[<!--TOC-->
<p>Meine Leidenschaft gilt dem Subtilen, dem unaufdringlichen Detail. Deshalb fange ich leere Suchanfragen ab, oder ich vergrößere die Eingabefelder im Kommentarformular, sobald sie fokussiert werden.</p>
<p>Heute habe noch so ein Detail nachgerüstet. Wenn ich einen Artikel mittels Überschriften in mehrere Abschnitte eingeteilt habe, dann lasse ich per <a href="http://scott.yang.id.au/code/toc-generator/" title="WordPress-Plugin: Table of Contents Generator" hreflang="en">Plugin</a> ein Inhaltsverzeichnis erstellen. Dabei werden alle Überschriften mit einer <code>id</code> versehen, die dann als Sprungziel dient. Bis hierhin nichts Neues; so verfahre ich schon lange. Heute aber habe ich den Nutzwert der <code>id</code>-Attribute erhöht.</p>
<p class="wideimg"><a href="http://www.flickr.com/photos/rakfb/2421927874/"><img src="http://toscho.de/wp-content/uploads/2010/04/anchor-rakfb-500.jpg" alt="Anker" title="Anker von rafk" width="500" height="188" class="size-full wp-image-1648" /></a></p>
<h2>CSS pur – nur für Auserwählte</h2>
<p>In <a href="http://toscho.de/2010/css-mein-userstylesheet/">meinem Userstylesheet</a> lasse ich mir interne Anker gerne zeigen:</p>
<pre class="notranslate">h1[id]:hover:after,
h2[id]:hover:after,
h3[id]:hover:after,
h4[id]:hover:after,
h5[id]:hover:after,
h6[id]:hover:after
    { <i>/* Findet interne Links, falls ich mal auf
       einen Abschnitt in einer Seite linken will. */</i>
        content:            " #" attr(id);
        font:               bold 14px/1 Consolas;
    }</pre>
<p>Das könnte ich hier auch einbauen. Leider hat aber Mozilla an dieser Stelle einen <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=12460" title="Bug 12460 - Cannot select or edit or search generated content and alt text" hreflang="en">unangenehmen Bug</a>, der erst zehneinhalb Jahre alt ist und deshalb noch nicht repariert wurde: <i lang="en">Generated Content</i> kann nicht kopiert werden. Ihr sähet also einen Text, den ihr nicht erreichen könnt. So etwas biete ich nicht an.</p>
<h2>Javascript macht’s möglich</h2>
<p>Zu den vielen <a href="http://molily.de/js/bibliotheken.html#vorteile-nachteile">Vorteilen eines Javascript-Frameworks</a> gehört, daß ich mich um die Bugs und Besonderheiten der einzelnen Browser kaum noch kümmern muß. Seit dem letzten <a href="http://toscho.de/2010/interna-layout-4-0/">kleinen Redesign</a> setze ich hier <a href="http://jquery.com/">jQuery</a> ein, und damit läßt sich das Problem sehr elegant lösen.</p>
<p>Man kann in jQuery meistens ganz normale CSS-Selektoren benutzen, um Elemente auszuwählen. Beispielsweise füllt <code>jQuery('<code class="string">h2[id], h3[id]</code>')</code> einen Array mit allen Überschriften zweiter und dritter Ordnung, die ein Attribut <code>id</code> besitzen.</p>
<p>Mit <a href="http://api.jquery.com/each/"><code>each()</code></a> schlendert man dann gemütlich jeden Treffer ab und löscht, ersetzt oder bearbeitet ihn, bis die Finger bluten. Und das mache ich jetzt auch:</p>
<pre class="notranslate">&lt;script defer&gt;
jQuery(document).<a href="http://api.jquery.com/ready/">ready</a>(function hpoint()
{
    jQuery('<code class="string">h2[id], h3[id]</code>').<a href="http://api.jquery.com/each/">each</a>(function jumplink()
    {
        <i>// Klasse setzen</i>
        jQuery(this).<a href="http://api.jquery.com/addClass/">addClass</a>('haslink');
        <i>// Link ankleben</i>
        jQuery(this).<a href="http://api.jquery.com/append/">append</a>(
            '&amp;#160;&lt;a class="hpoint noprint" href="#'
            + jQuery(this).<a href="http://api.jquery.com/attr/">attr</a>("id")
            + '" title="Direkter Link auf diese Position"&gt;#&lt;/a&gt;'
        );
    });
});
&lt;/script&gt;</pre>
<p>Jetzt haben also alle anspringbaren Überschriften einen Link, mit dem jeder etwas anfangen kann.</p>
<h2>CSS zur Feinarbeit</h2>
<pre class="notranslate">.hpoint:link,
.hpoint:visited
    {
        color:              #ccc;
        text-decoration:    none;
    }
.haslink:hover .hpoint,
.haslink:focus .hpoint,
.haslink:target .hpoint
    {
        color:              #059;
    }</pre>
<p>Das Script sollte irgendwo am Ende der Seite stehen oder ausgelagert werden. jQuery selbst muß natürlich vorher eingebunden werden.</p>
<p>Wie findet ihr das? Lästig, nützlich, oder verbesserungsbedürftig?</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/jquery-interne-sprungziele-anbieten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress: Länge der Artikelliste im Backend anpassen</title>
		<link>http://toscho.de/2010/wordpress-laenge-artikelliste-backend-anpassen/</link>
		<comments>http://toscho.de/2010/wordpress-laenge-artikelliste-backend-anpassen/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 18:02:39 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1631</guid>
		<description><![CDATA[Wie man die Zahl der angezeigten Artikel unter ›Artikel/Bearbeiten‹ beeinflußt.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.im-tal.net/">Markus</a> gab heute im WP-Forum mal wieder einen <a href="http://forum.wordpress-deutschland.org/allgemeines/66168-artikel-pro-seite-800-im-backend.html">guten Tipp</a>: Die Menge der Artikel pro Seite im Backend wird über den Meta-Key <code>edit_per_page</code> in der Tabelle <code>wp_usermeta</code> gesteuert.<br />
Abgefragt wird sie in der Datei <code>/wp-admin/includes/post.php</code> mit:</p>
<pre class="notranslate"><var>$posts_per_page</var> = (int) get_user_option( '<code class="string">edit_per_page</code>', 0, false );</pre>
<p>Die Funktion <code>get_user_option()</code> wiederum bietet einen Filter an:</p>
<pre class="notranslate">apply_filters("<code class="string">get_user_option_{<var>$option</var>}</code>", <var>$result</var>, <var>$option</var>, <var>$user</var>);</pre>
<p>Und <em>daraus</em> folgt dieser kleine Eintrag in der <code>functions.php</code>, mit dem ich künftig 100 Artikel sehe, ohne die Datenbank anzufassen:</p>
<pre class="notranslate">add_filter('<code class="string">get_user_option_edit_per_page</code>',
    create_function('','<code class="string">return 100;</code>'));</pre>
<p>Das kann man noch an eine <a href="http://codex.wordpress.org/Roles_and_Capabilities" hreflang="en" title="Roles and Capabilities">Abfrage des Userlevels</a> binden, wenn man möchte. Mir reicht es so.</p>
<p>Strenggenommen gehört so eine Modifikation natürlich nicht ins Theme, sondern in ein Plugin. Andererseits möchte ich dafür nicht extra ein zusätzliches Plugin laden. Kompromisse, wohin man sieht …</p>
<p>Und noch strenger gesehen ist diese Option bereits vorhanden: In den Optionen der Artikelansicht. Dort findet sie aber kaum jemand, deshalb setze ich sie global.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-laenge-artikelliste-backend-anpassen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress-Dashboard: ›Approved‹ nicht ›Genehmigt‹</title>
		<link>http://toscho.de/2010/wordpress-dashboard-approved-nicht-genehmigt/</link>
		<comments>http://toscho.de/2010/wordpress-dashboard-approved-nicht-genehmigt/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 12:34:03 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Sprache]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1628</guid>
		<description><![CDATA[Wie man nicht übersetzte Zeichenketten per <code>functions.php</code> repariert.]]></description>
			<content:encoded><![CDATA[<p>Dank einer <a href="http://forum.wordpress-deutschland.org/sprachdatei/63073-sprachdatei-fuer-2-9-1-zum-testen.html#post293301">kleinen Schlamperei</a> seitens der WordPress-Entwickler kann das <i lang="en">Approved</i> im Dashboard derzeit nicht per Sprachdatei ins Deutsche übersetzt werden.</p>
<p>Mich stört es nicht, einige Kunden aber schon.</p>
<p>Bis das behoben ist, kann man sich mit einem kleinen Workaround in der <code>functions.php</code> des Themes aushelfen:</p>
<pre class="notranslate">add_filter(
    '<code class="string">ngettext</code>',
    create_function(
        '<code class="string"><var>$t</var>,<var>$s</var>,<var>$p</var></code>',
        '<code class="string">return "Approved"== <var>$p</var>?"Genehmigte":<var>$t</var>;</code>'),
    10, 3);</pre>
<p>Keine Schlamperei, sondern <a href="http://forum.wordpress-deutschland.org/sprachdatei/31178-anmerkung-zum-tellerrand.html">Absicht</a>: <i lang="en">Dashboard</i> wird weiterhin nicht ins Deutsche übersetzt. Auch diesen <i lang="en">Bug</i> kann man leicht reparieren, ohne die Sprachdatei anzufassen, wie auch das <i lang="en">Submitted on</i>:</p>
<pre class="notranslate">if ( ! function_exists('<code class="string">toscho_translations</code>') )
{
    function toscho_translations(<var>$str</var>)
    {
        <i>// Diesen Array bei Bedarf um weitere Übersetzungen erweitern.</i>
        <var>$trans</var> = array (
            '<code class="string">Dashboard</code>'     =&gt; '<code class="string">Übersicht</code>',
            '<code class="string">Submitted on</code>'  =&gt; '<code class="string">Eingereicht am</code>'
        );

        foreach ( <var>$trans</var> as <var>$original</var> =&gt; <var>$translation</var> )
        {
            <var>$str</var> = str_replace(<var>$original</var>, <var>$translation</var>, <var>$str</var>);
        }

        return <var>$str</var>;
    }
    add_filter('<code class="string">gettext</code>', '<code class="string">toscho_translations</code>');
}</pre>
<p>Und so sieht das Ergebnis aus:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/02/dashboard-uebersetzt.png" alt="Dashboard übersetzt" width="529" height="229" class="alignnone size-full wp-image-1629 border" /></p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-dashboard-approved-nicht-genehmigt/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordPress: Grundeinstellungen per Plugin setzen</title>
		<link>http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/</link>
		<comments>http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 19:23:06 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1621</guid>
		<description><![CDATA[Wie man den Weg durch die vielen Einstellungsseiten abkürzt. Code zur Ansicht und ein Plugin zum Download.]]></description>
			<content:encoded><![CDATA[<p>Wer öfter mal ein WordPress-Blog installiert, weiß die vielen Einstellungsseiten nicht unbedingt zu goutieren. Ich habe mir dafür ein kleines Plugin geschrieben, das die wichtigsten Optionen auf einen Schlag setzt, die Blogroll (Linkliste) leert und die Dummytexte löscht:</p>
<p class="downloadlink"><a class='piwik_download' lang="en" href="http://f.toscho.de/php-skripte/toscho_basic_settings.zip">Download Toschos Basic Settings</a>.</p>
<pre class="notranslate">&lt;?php
<i>/*
Plugin Name: Toscho's basic settings
Plugin URI: http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/
Description: Some useful default configuration settings. See 'wp-admin/options.php' for more options.
Version: 0.3
Author: Thomas Scholz
Author URI: <a href="http://toscho.de/">http://toscho.de</a>
*/</i>

function set_toscho_defaults()
{
    global <var>$wpdb</var>;
    <var>$o</var> = array(
        '<code class="string">avatar_default</code>'            =&gt; '<code class="string">blank</code>',
        '<code class="string">avatar_rating</code>'             =&gt; '<code class="string">G</code>',
        '<code class="string">category_base</code>'             =&gt; '<code class="string">/thema</code>',
        '<code class="string">comment_max_links</code>'         =&gt; 0,
        '<code class="string">comments_per_page</code>'         =&gt; 0,
        '<code class="string">date_format</code>'               =&gt; '<code class="string">d.m.Y</code>',
        '<code class="string">default_ping_status</code>'       =&gt; '<code class="string">closed</code>',
        '<code class="string">default_post_edit_rows</code>'    =&gt; 30,
        '<code class="string">links_updated_date_format</code>' =&gt; '<code class="string">j. F Y, H:i</code>',
        '<code class="string">permalink_structure</code>'       =&gt; '<code class="string">/%year%/%postname%/</code>',
        '<code class="string">rss_language</code>'              =&gt; '<code class="string">de</code>',
        '<code class="string">timezone_string</code>'           =&gt; '<code class="string">Etc/GMT-1</code>',
        '<code class="string">use_smilies</code>'               =&gt; 0,
        '<code class="string">start_of_week</code>'             =&gt; 1
    );

    foreach ( <var>$o</var> as <var>$k</var> =&gt; <var>$v</var> )
    {
        update_option(<var>$k</var>, <var>$v</var>);
    }

    <i>// Delete dummy post and comment.</i>
    wp_delete_post(1, TRUE);
    wp_delete_comment(1);

    <i>// empty blogroll</i>
    <var>$wpdb</var>->query("<code class="string">DELETE FROM <var>$wpdb</var>->links WHERE link_id != ''</code>");

    return;
}
register_activation_hook(__FILE__, '<code class="string">set_toscho_defaults</code>');</pre>
<p>Dieses Plugin aktivieren, deaktivieren und löschen. Fertig.</p>
<p><strong>Nachtrag:</strong> Dieses kleine Plugin hat jetzt auch seine eigene GitHub-Adresse: <a href="http://github.com/toscho/WordPress-Basic-Settings">http://github.com/toscho/WordPress-Basic-Settings</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Opera: Wie man sich selbst aus der eigenen Statistik heraushält</title>
		<link>http://toscho.de/2010/opera-sich-selbst-aus-statistik-heraushalten/</link>
		<comments>http://toscho.de/2010/opera-sich-selbst-aus-statistik-heraushalten/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 20:04:32 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Opera]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1577</guid>
		<description><![CDATA[Wie man sich für die eigene Statistik unsichtbar macht: Man paßt den User-Agent-String an und das Script für den Tracking-Code.]]></description>
			<content:encoded><![CDATA[<p>Zu den wenigen Daten, die ich nicht in <a href="http://toscho.de/2009/piwik-ueberblick-installation/" title="Piwik: Überblick und Installation">Piwik</a> sehen möchte, gehören meine eigenen Aufrufe. </p>
<p>Zum Glück – und weil ich auf bequeme Technik abfahre – benutze ich Opera. Und WordPress. Also habe ich in den Einstellungen unter <a href="opera:config#ISP|Id">opera:config#ISP|Id</a> ein paar Zeichen in die User-Agent-Kennung eingetragen, mit denen ich mich im PHP-Skript wiedererkenne.</p>
<p>Diese Zeichenkette benutze ich in meinem Theme und auch im Labor, wo man <a href="http://labs.toscho.de/selbst/">den eigenen User-Agent-String ansehen</a> kann, um den Piwik-Code auszublenden.</p>
<p>Angenommen, die Zeichen wären <samp>ABC123DEF</samp>, dann sähe der Code so aus:</p>
<pre class="notranslate">function piwik_code()
{
    <i>// Das bin ich!</i>
    if ( strpos(<var>$_SERVER</var>['<code class="string">HTTP_USER_AGENT</code>'], '<strong><code class="string">ABC123DEF</code></strong>' ) )
    {
        return;
    }

    <var>$url</var> = '<code class="string">http</code>' . (empty(<var>$_SERVER</var>['<code class="string">HTTPS</code>']) ? '' : '<code class="string">s</code>') . '<code class="string">://p.toscho.de/</code>';
    ?&gt;
&lt;script type="<code class="string">text/javascript</code>" src="&lt;?php echo <var>$url</var>; ?&gt;<code class="string">piwik.js</code>"&gt;&lt;/script&gt;
&lt;script type="<code class="string">text/javascript</code>"&gt;
try {
var <var>piwikTracker</var> = Piwik.getTracker("&lt;?php echo <var>$url</var>; ?&gt;<code class="string">piwik.php</code>", 1);
<var>piwikTracker</var>.trackPageView();
<var>piwikTracker</var>.enableLinkTracking();
} catch( err ) {}
&lt;/script&gt;
&lt;noscript&gt;&lt;p&gt;&lt;img src="&lt;?php echo <var>$url</var>;
?&gt;<code class="string">piwik.php?idsite=1</code>" alt=""&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;?php
    return;
}</pre>
<p>Die Funktion <code class="notranslate">piwik_code()</code> rufe ich dann in der <code class="notranslate">footer.php</code> an passender Stelle auf. Und schon bin ich weg.</p>
<p><strong>Nachtrag:</strong> Einen anderen Weg zeigt der Folgeartikel: <a href="http://toscho.de/2010/per-cookie-aus-der-statistik/">Per Cookie aus der Statistik</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/opera-sich-selbst-aus-statistik-heraushalten/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WordPress: Administrator mit PHP herausfinden</title>
		<link>http://toscho.de/2009/wordpress-administrator-php-herausfinden/</link>
		<comments>http://toscho.de/2009/wordpress-administrator-php-herausfinden/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 01:26:37 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1504</guid>
		<description><![CDATA[Die Funktion is_boss() offenbart den Chef.]]></description>
			<content:encoded><![CDATA[<p>Will man bestimmte Inhalte – etwa bei der Fehlersuche – nur dem Administrator ausgeben, so möchte man zunächst nach der Funktion <code><a href="http://codex.wordpress.org/Function_Reference/is_admin">is_admin()</a></code> greifen, die WordPress schon mitbringt. Die liefert aber nur dann <code>TRUE</code> zurück, wenn man eine Seite des Backends aufruft und hätte besser <code>is_backend()</code> geheißen …</p>
<p>Ich benutze einen Schnipsel, den ich aus dem WordPress-Forum gepult und in eine Funktion gegossen habe:</p>
<pre class="notranslate"><i>/**
 * Prüft, ob der Administrator die Seite ansieht.
 * @author »Kafkaesqui« &lt;<a href="http://guff.szub.net/">http://guff.szub.net/</a>&gt;
 * @see <a href="http://wordpress.org/support/topic/153260#post-681600">http://wordpress.org/support/topic/153260#post-681600</a>
 * @return bool
 */</i>
function is_boss()
{
    global <var>$user_ID</var>;

    if ( ! <var>$user_ID</var> or ! current_user_can(&#039;<code class="string">level_10</code>&#039;) )
    {
        return FALSE;
    }
    return TRUE;
}</pre>
<p><i lang="en">Level 10</i> hat nur der Adminstrator. Man kann diese Abfrage aber anpassen und auch die niederen Ränge mit speziellen Inhalten beglücken.<br />
Lektüre: <a href="http://codex.wordpress.org/Roles_and_Capabilities">Roles and Capabilities</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/wordpress-administrator-php-herausfinden/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Vereinfachte Mausgesten für Opera</title>
		<link>http://toscho.de/2009/vereinfachte-mausgesten-fuer-opera/</link>
		<comments>http://toscho.de/2009/vereinfachte-mausgesten-fuer-opera/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 12:23:00 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Opera]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1493</guid>
		<description><![CDATA[Mausgesten in Opera, meine eigene Konfiguration zum Download und mit genauer Beschreibung.]]></description>
			<content:encoded><![CDATA[<p>Seit <a href="http://www.opera.com/docs/history/">Version 5.1</a> reagiert Opera auf bestimmte Mausbewegungen mit vordefinierten Aktionen. Hält man beispielsweise die rechte Maustaste gedrückt und ruckt kurz nach links, dann geht man im Verlauf eine Seite zurück. Ein Backbutton, den man nicht suchen muß.</p>
<p>Außerdem kann man noch <i lang="en">FlipBack</i> und <i lang="en">FlipForward</i> benutzen. FlipBack heißt: Man hält die rechte Maustaste gedrückt und klickt kurz auf die linke. <i lang="en">FlipForward</i> mag sich jetzt jeder selbst austüfteln …</p>
<p>Die Aktionen können noch mit Tastatureingaben kombiniert werden; sie bieten leidenschaftlichen Fummlern eine Menge Zeitvertreib.</p>
<p>Wie die kleinen Beispiele zeigen, bringt Opera hier einige Redundanz mit. Die Standardkonfiguration kennt zwei Aktionen für das Schließen eines Fensters, drei für das einfache Vor- und Zurückspringen innerhalb des Verlaufs (eine Seite), drei für das schnelle Zurückblättern (Einstiegsseite einer Domain) und sechs für das schnelle Vorwärtsblättern (automatisches Finden der nächsten Seite).</p>
<p>Wer soll sich das merken?</p>
<p>Mich stört vor allem die Möglichkeit, durch eine »verirrte« Geste versehentlich das Fenster zu schließen; außerdem brauche ich oft ganz andere Befehle. Deshalb habe ich eine sehr einfache Konfiguration erstellt, die ich in jede Neuinstallation importiere.</p>
<p class="downloadlink"><a class='piwik_download' href="http://f.toscho.de/opera/mouse/toscho.mouse.ini">Download toscho.mouse.ini</a></p>
<p>Opera bietet eigenständig die Installation an. Das kann man jederzeit wieder aufheben; die Standardkonfiguration wird nicht überschrieben.</p>
<h2>Die Mausgesten im Überblick</h2>
<table>
<caption>Mausgesten im Browserfenster</caption>
<thead>
<tr>
<th>Geste</th>
<th>Aktion</th>
<th>Erklärung</th>
</tr>
</thead>
<tbody>
<tr>
<td>GestureLeft</td>
<td>Refresh display</td>
<td> Neuaufbau eine Seite <em>ohne Reload</em>. Hebt alle Aktionen auf, die man beispielsweise per Javascript auf der Seite ausgeführt hat.
      </td>
</tr>
<tr>
<td>GestureRight</td>
<td>Reload</td>
<td>Lädt die Seite komplett neu.</td>
</tr>
<tr>
<td>GestureRight shift</td>
<td>Reload stylesheets</td>
<td>
        Lädt nur Stylesheets nach. Hilfreich, wenn man gerade ein Userstylesheet anpaßt.
      </td>
</tr>
<tr>
<td>GestureUp</td>
<td>Go to start | Go to parent directory</td>
<td>
        Auf der Seite nach oben. Wenn man schon oben ist, springt man eine Verzeichnisebene höher. Funktioniert auch innerhalb einer Textarea.
      </td>
</tr>
<tr>
<td>GestureDown</td>
<td>Go to end</td>
<td>Zum Ende der Seite. Funktioniert auch innerhalb einer Textarea.</td>
</tr>
<tr>
<td>FlipBack</td>
<td>Back</td>
<td>Eine Seite zurück.</td>
</tr>
<tr>
<td>FlipBack shift</td>
<td>Rewind</td>
<td>
        Auf die erste Seite zurück, die man auf der aktuellen Domain angesehen hat.
      </td>
</tr>
<tr>
<td>FlipForward</td>
<td>Forward | Fast forward</td>
<td>
        Eine Seite vor. Entweder die nächste (wenn man gerade zurückgegangen ist) oder eine automatisch ermittelte. Welche das ist, weiß Opera oft sehr genau, etwa die nächste Seite einer Google-Suche.
      </td>
</tr>
<tr>
<td>FlipForward shift</td>
<td>Fast forward</td>
<td>Ignoriert den eigenen Verlauf und springt zum nächsten »automatischen« Ergebnis.</td>
</tr>
<tr>
<td>Button6</td>
<td>Back</td>
<td>Zurückbutton der Maus, so sie einen hat.</td>
</tr>
<tr>
<td>Button7</td>
<td>Forward</td>
<td>Na?</td>
</tr>
<tbody>
</table>
<table>
<caption>Mausgesten im Mailfenster und in Eingabefeldern</caption>
<thead>
<tr>
<th>Geste</th>
<th>Aktion</th>
<th>Erklärung</th>
</tr>
</thead>
<tbody>
<tr>
<td>FlipForward</td>
<td>Mark and select next unread</td>
<td>
        Markiert die aktuelle Mail als gelesen und springt zur nächsten ungelesenen.
      </td>
</tr>
<tr>
<td>FlipForward</td>
<td>Paste</td>
<td>Fügt den Inhalt der Zwischenablage in ein Eingabefeld ein.</td>
</tr>
<tr>
<td>FlipBack</td>
<td>Undo</td>
<td>Tja …</td>
</tr>
<tbody>
</table>
<p>Das versehentliche Schließen ist hiermit nicht mehr möglich. Wer jetzt Lust auf eine eigene INI bekommen hat: Im Opera-Wiki wartet eine umfangreiche, kommentierte <a href="http://operawiki.info/AllActionsListPlus">Liste aller verfügbaren Aktionen</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/vereinfachte-mausgesten-fuer-opera/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogdesign für Profis</title>
		<link>http://toscho.de/2009/blogdesign-fuer-profis/</link>
		<comments>http://toscho.de/2009/blogdesign-fuer-profis/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 19:09:27 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1479</guid>
		<description><![CDATA[Wie man sein Blog echt cool … ähm … verunstaltet.]]></description>
			<content:encoded><![CDATA[<p>Deinem Blog fehlt der Pfeffer? Du willst ihm einen professionellen Anstrich geben, weißt aber nicht wie? Hier sind sie: die geheimen Tricks der Profis.</p>
<ul>
<li>Mach die <strong>Schrift</strong> <small>ganz, <small>ganz <small><a href="http://toscho.de/2009/schriftgroesse-meine-praxis/">klein</a>.</small></small></small> Dann hast du mehr Platz für Werbung.<br />
Wer doch etwas lesen will, kann ja einfach ein bißchen näher heranrücken oder mit der Vergrößerungsfunktion seines Browsers herumfummeln. Macht jeder gerne.</li>
<li>Packe alles in den <strong><a href="http://toscho.de/2009/titel-voran/">Titel</a></strong>, das irgendwie wichtig sein könnte: Kategorien, wichtige Suchworte und ein bißchen Werbung.<br />
Wer ein Lesezeichen setzen will, kann ja selbst nacharbeiten, wenn ihm das nicht paßt. Oder darauf verzichten.</li>
<li>Du brauchst kein <strong>Druckstylesheet</strong>. Und wenn doch, dann zumindest keinen Umbruch vor den Kommentaren. Laß unbedingt die Werbung drin; die ist so schön bunt und lockert den schwarzen Hintergrund auf.</li>
<li><strong>Verlinke</strong> einfach alles. Überall. Auf jeder Seite jede Kategorie, jedes Schlagwort, die 100 »beliebtesten« Artikel, die 100 am häufigsten kommentierten, 50 Werbepartner, deine Lieblingslinks und deine letzten 20 Tweets. Und die Seite, die der Leser <a href="http://toscho.de/2009/deppenlink-entfernen/">gerade sieht</a>. Dann findet er sie schneller wieder. Insgesamt wirkt deine deine Seite dann bestimmt sehr (wert)voll.</li>
<li>Links sind zwar eine tolle Sache, sehen aber doof aus. Kein Problem: Per CSS kannst du Links prima in den Rest des Textes eingliedern. Bau einfach die <strong>Unterstriche</strong> aus, und gib besuchten Links die gleiche <strong>Farbe</strong> wie unbesuchten: die des Textes. Und schon sieht die Linkwüste ein bißchen freundlicher aus.</li>
<li>Links auf <strong>fremde Seiten</strong> lassen sich übrigens sehr einfach mit dem Attribut <code>target="_blank"</code> vergolden. Wir wollen doch klarstellen, wer hier das Sagen hat, oder?</li>
<li>Warum nur einen <strong>Statistikdienst</strong>? Der könnte irgendwann <a href="https://www.datenschutzzentrum.de/tracking/">verboten</a> werden, da ist es sicherer, gleich zehn zu benutzen – die können ja nicht alle rechtswidrig sein. Und wer dein Blog besucht, verzichtet doch automatisch auf seine Privatsphäre, denn es ist ja öffentlich. Ladezeit? Ach was. Heute hat doch jeder DSL.</li>
<li>Du bist ein Genie, deine Artikel zeitlos gültig. Wozu also die Leser mit der Information verwirren, <strong>wann</strong> du einen Artikel geschrieben hast?<br />
Wenn du doch ein <strong>Datum</strong> verrätst, dann verstecke es gut. Direkt neben oder unter der Überschrift ist ein sehr schlechter Platz, da lenkt man nur von der Werbung ab.</li>
<li>Teile deine Artikel in <strong>mehrere Seiten</strong>. Leser blättern gerne, denn das schafft so eine … literarische Atmosphäre. Außerdem verdienst du dann mehr Geld mit deiner Werbung.</li>
</ul>
<p>Nächste Woche in dieser Sendung: Wie man seine Kommentatoren züchtigt.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2009/blogdesign-fuer-profis/feed/</wfw:commentRss>
		<slash:comments>26</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 624/762 objects using disk: basic

Served from: toscho.de @ 2012-02-04 11:28:40 -->
