Schlagwort-Archiv:

Internes

Etwas fürs Archiv (2):
Mehrfachauswahl von Schlagwörtern

TagsWie kürzlich angekündigt, gibt’s jetzt den Code für die zweite Sonderfunktion meiner Archivseite, die Mehrfachauswahl von Schlagwörtern.1 Auch dies ist wieder so ein Fall, wo man sich fragen mag, ob es überhaupt allzu häufig verwendet wird, sind doch schon gewöhnliche Schlagwort-Wolken mancherorts dahingehend in der Kritik. Aber andererseits mag es auch mal nützlich sein, also warum nicht?

WordPress bietet nämlich von Haus aus die Möglichkeit, mehrere Tags (neudeutsch: Schlagwörter2) – aber nicht Kategorien – in der Abfrage per UND und ODER zu verknüpfen (wenn auch nicht beides gleichzeitig), d.h. dass entweder nur die Beiträge kommen, die alle gewählten Schlagwörter enthalten (UND) oder die mindestens eines enthalten (ODER). Dazu werden sie in der URL mit + bzw. , aneinandergehängt – was sich ohne weiteres auch durch manuelle Eingabe nutzen lässt, wenn keine komfortablere Möglichkeit wie der hier vorgestellte Code vorhanden ist.

Die Schlagwortauswahl

Wie der beim letzten Mal erwähnte Monatsarchiv-Code steht dieser auch direkt im Inhalt der Seite (im HTML-Editor) – dank des Exec-PHP-Plugins. Mehr dazu dort. Hier dier Tag-Code:

<form id="tagform" action="/" method="get">
<select id="tagsel" multiple="multiple" size="20">
    <?php 
$tags = get_tags(''); 
foreach ($tags as $t) {
  echo '<option value="'.$t->slug.'">'.$t->name.' <small style="color:#777;">('.$t->count.')</small></option>'."\n";
}
?>
</select>
<style type="text/css"> 
#tagand + label + br { display:none; }
</style>
Bei Mehrfachauswahl (max.10): <input type="radio" name="tagcomb" id="tagand" value="+" checked="checked"/><label for="tagand">UND</label> <input type="radio" name="tagcomb" id="tagor" value=","/><label for="tagor">ODER</label>
<script type="text/javascript"><!--
function dotags () {
  var tagcomb = (document.getElementById("tagand").checked ? "+" : ",");
  var selected = '';
  var cnt = 0;
  ob = document.getElementById("tagsel");
  for (var i = 0; i < ob.options.length; i++) 
    if (ob.options[i].selected) {
      if (cnt<10) {
        if (selected!="") selected += tagcomb;
        selected += ob.options[i].value;
        cnt++;
      }
    }
  if (selected=="") {
    alert ("Kein Schlagwort ausgewählt!");
  } else {
    document.location.href = "/tag/"+selected+'/';
  }
}
function cleartags() {
  ob = document.getElementById("tagsel");
  for (var i = 0; i < ob.options.length; i++) 
    ob.options[i].selected = false;
}
//--></script>
<input type="button" onclick="javascript:dotags();" value=" Aufrufen " style="font-weight:bold;"/> &nbsp; <a href="javascript:cleartags();">Auswahl aufheben</a>
<noscript style="color:red;">Für diese Funktion ist JavaScript erforderlich.</noscript>
</form>

Diesmal benötigen wir nichtmal eine eigene Datenbank-Abfrage, denn die WordPress-Funktion get_tags() liefert uns schon, was wir benötigen, nämlich alle Schlagwörter, die wir als options einer Auswahlliste (select multiple) ausgeben, gefolgt von den Radiobuttons für UND und ODER. Die eine Zeile CSS-Style mit #tagand + label + br verhindert, dass der Zeilenumbruch, den WordPress automatisch hinter dem ersten Label einfügt, angezeigt wird, da ich die beiden Radiobuttons gerne nebeneinander hätte.

Es folgen dann zwei kleine JavaScript-Funktionen, die bei Klick auf den „Aufrufen“-Button (function dotags()) bzw. den „aufheben“-Link (function cleartags()) aufgerufen werden. Letzterer hebt einfach die Auswahl auf, naheliegenderweise, und bedarf wohl keiner näheren Betrachtung.

dotags() ermittelt zunächst das für die URL zu verwendende Verknüpfungszeichen + für UND und , für ODER, wie sie WordPress erwartet, und geht dann die options durch, um die ausgewählten in der Variablen selected aneinanderzuhängen – der Übersicht halber beschränkt auf maximal 10 Schlagwörter – und schließlich den Browser zu veranlassen, die entsprechende Seite à la /tag/schlag1+wort2/ aufzurufen. (Wer eine andere URL-Struktur verwendet, muss dies natürlich anpassen; für „unschöne“ wäre das etwa ?tag=schlag1+wort2.)

Die Überschrift des Ergebnisses

So, damit kann man also eure Schlagwortarchive nach Belieben aufrufen – ein kleines Manko bleibt aber noch: die Überschrift der Archivseite. Denn euer Theme wird i.d.R. die WordPress-Funktion single_tag_title() benutzen (im entspr. Zweig der archive.php) und dadurch nur das erste Schlagwort ausgeben, im generischen Beispiel schlag1+wort2 also „Schlagwortarchiv: Schlag 1“ und nicht „Schlagwortarchiv: Schlag 1 UND Wort 2“. (Die eigentlichen Beiträge darunter sind trotzdem die richtigen.)

Natürlich hab ich auch dafür eine Funktion – diesmal wieder in der functions.php des Themes, aufgerufen mit <?php echo ag_multi_tag_title();?> in archive.php für die schön formatierte Überschrift und mit ag_multi_tag_title (false) für das title-Tag im HTML-head, damit auch das Browserfenster die passende Überschrift hat.

<?php
function ag_multi_tag_title ($pretty = true) {
    $tag_slug = get_query_var('tag');
    $tag_slug = str_replace(" ","+",$tag_slug);
    if (strpos($tag_slug,",")===false) {
        $tags = explode ("+", $tag_slug);
        $tagcomb = __('and');
    } else {
        //bei , wird aus + bzw. Leerz. auch ODER
        $tags = explode (",", str_replace("+",",",$tag_slug));
        $tagcomb = __('or');
    }
    if ($pretty) $tagcomb = ' <small style="font-weight:normal; font-variant:small-caps;">'.$tagcomb.'</small> ';
        else $tagcomb = ' '.$tagcomb.' ';
    $tagstr = '';
    foreach ($tags as $t) {
        $tag = get_term_by ("slug",$t,"post_tag",OBJECT);
        if ($tagstr!='') $tagstr .= $tagcomb;
        if ($tag) $tagstr .= $tag->name;
        else $tagstr .= ($pretty?'<acronym title="unbekanntes Schlagwort" style="color:red;">'.htmlspecialchars($t).'</acronym>' : htmlspecialchars($t));
    }
    if ($tagstr=='') return single_tag_title(); else
    return $tagstr;
}
?>

Hier wird zunächst der tag-Parameter aufgedröselt, d.h. an + bzw. , getrennt und dabei auch das ausgeschriebene Wort vorbelegt ($tagcomb). In der Schleife darunter wird mittels der WordPress-Funktion get_term_by() der schöne Name (z.B. „Schlag 1“) zur slug, dem URL-Bestandteil (z.B. „schlag1“), ermittelt und das ganze aneinandergehängt und am Ende zurückgegeben. (Falls irgendwas schiefgelaufen sein sollte, rufen wir halt doch single_tag_title() auf, man kann ja nie wissen…)

Und das war’s dann auch mit dem zweiten Archiv-Code. Wie immer: Wer Fragen, Anregungen, Verbesserungsvorschläge o.ä. hat, darf sie ruhig äußern…

  1. Die Sache mit WP.com-Stats für die beliebtesten Beiträge muss noch etwas warten… []
  2. oder andersrum ;) []

Änderüngchen

Manchmal scheinen Änderungen in Blogs gehäuft aufzutreten, teils kleinere, teils größere – und das nicht nur wegen eines größeren WordPress-Updates wie jetzt 3.0 Auch bei mir gab’s jüngst ein paar Kleinigkeiten, und ich will auch die Gelegenheit nutzen, euch, meine Leser, nach eurer Meinung zu fragen.

Twitter Doch zunächst zu den Neuerungen: Da wäre zum ersten ein Eingabefeld für den Twitter-Namen beim Kommentieren, damit einhergehend eine kleine Neuanordnung der Felder zweispaltig nebeneinander. Der Twitter-Name wird mit der E-Mail-Adresse verknüpft, sodass er auch bei älteren Kommentaren erscheint. (Das bedeutet natürlich auch, dass es mit leerem E-Mail-Feld keinen Twitter-Link gibt.)

Das Plugin, das sich (derzeit) darum kümmert, ist TwitterLink Comments – mit leichten Modifikationen, damit es auch mit leeren E-Mail-Adressen umgehen kann und damit der Twitter-Name bei wiederkehrenden Kommentatoren schon im Eingabefeld vorbelegt ist. Ich werd’s aber wohl noch so weit abspecken, dass ich die ganzen Automatismen und dazugehörigen Konfigurations­möglichkeiten, die ich nicht brauche, rausschmeiße und den Rest ins Theme integriere – unnötigen Ballast abwerfen eben…

Entsprechend wurde auch die Kopfzeile der Kommentare etwas umgestaltet: der Name ist größer, darunter der Twitter-Link, und die anderen Angaben sind jetzt zweizeilig und rechtsbündig. (Und die Buttons unter den Eingabefeldern wurden auch leicht aufgehübscht. Zumindest auf brauchbaren Browsern.^^)

Zum anderen gibt’s nun unter dem Kommentarfeld eine einblendbare Hilfe bzw. ein paar Hinweise zum Kommentieren – die entscheidende Idee dazu lieferte Robert (bei dem’s gleich größere Änderungen gab) – besser einblendbar und ausführlich als ständig zu sehen und (um nicht zu aufdringlich zu sein) knapp. Und so gibt’s jetzt hier sechs Punkte von „Benimm dich!“ bis zu den erlaubten HTML-Tags, wie ihr unten sehen könnt.

Bei deaktiviertem JavaScript wird der Hilfe-Block übrigens immer angezeigt – dafür der Link zum Aufklappen nicht. Alles in Allem kümmert sich darum dieser jQuery-JavaScript-Code:

jQuery('.comment-help').hide();
jQuery('.comment-help-link').show().click(function () {
    jQuery('.comment-help').toggle(250);
    return true;
});

Und die beitragsspezifischen Flattr-Buttons sind jetzt nicht mehr auf Index- und Archiv-Seiten unter jedem Beitrag zu finden – nicht zuletzt auch der Ladezeit wegen –, sondern nur noch in der Einzelansicht; dafür gibt’s einen im Footer für das Blog insgesamt. Aber irgendwie scheint der Flattr-Hype schon nach diesen wenigen Wochen abgeebbt zu sein… naja, mal sehen, wie sich das entwickelt. Ich bin ja erst seit Anfang Juni dabei, und den Monat mach ich mindestens noch voll. Und insgesamt 6 Flattrings (oder wie das heißt) hab ich ja schon bekommen… (Falls jemand noch Flattr-Invites braucht, ich hätte noch welche übrig.)

So, das waren die bisherigen Neuerungen, jetzt die Überlegungen zur Zukunft. Gut, am Ende mach ich wie so ziemlich jeder zwar doch das, was ich selbst für richtig halte, aber es wäre natürlich auch töricht, nicht auf die Wünsche der Leser und Kommentatoren zu hören – und da diese selten Wünsche von sich aus äußern, frage ich euch hiermit. Also: Welche Wünsche hättet ihr in Bezug auf das Aussehen und die Funktionen meines Blogs?

  • Wie ist es mit der Schriftgröße, dem Zeilenabstand und der Schriftart im Haupttext und in der Sidebar? Zu klein? Zu eng? Richtig? Zu groß?

    Wobei es da auch Unterschiede gibt je nachdem, ob ihr Microsofts aktuelle C-Standardschriften Calibri, Cambria & Co installiert habt oder nicht (und deswegen mit Arial o.ä. vorlieb nehmen müsst). Hier ein kleiner Vergleich: Links mit C-Schriften und ClearType-Kantenglättung, rechts mit Arial und ohne Glättung:

both

  • Soll mehr in die Sidebar, weniger in die Sidebar? Ganz auf eine Sidebar verzichten wie Knut will ich allerdings nicht…
  • Soll mehr in den Footer, weniger in den Footer?
  • In der Einzelansicht sind oben und unten Links zum « vorherigen und zum » nächsten Beitrag. Sinnvoll? Zu viel?
  • Und was für Gedanken kommen euch sonst bei diesem Thema?

Nun, dann bin ich mal auf eure Äußerungen gespannt…

Etwas fürs Archiv (1):
Geordnetes Monatsarchiv

Monate und Jahre Der erste von zwei weitereren kleinen WordPress-Tips, diesmal für die Archivseite. Dorthin packt man ja gerne eine Übersicht über alle Beiträge nach Monaten und nach Kategorien, und in einigen Themes steckt so eine Funktionalität bereits drin, einige Plugins bieten ebenfalls diverse Funktionen.

Wie man solche Archive mit Bordmitteln, nämlich der Funtion wp_get_archives() und einer Theme-Template-Seite macht, hat etwa Perun im Januar beschrieben; für das Kategorienarchiv benutze ich diese auch. Für mein Monatsarchiv hab ich aber „natürlich“ eine eigene Funktion geschrieben, die mir eine schönere Darstellung nach Jahren gruppiert bietet – darum geht es in diesem Beitrag. In ein paar Tagen zeige ich euch dann den Code für die Schlagwort-Mehrfachauswahl, die ihr bereits auf der Archivseite findet.

Stellt sich nur generell die Frage, ob allzu viele Besucher diese Archiv-Funktionalität auch wirklich nutzen… aber egal, im Zweifelsfall betrachtet’s man einfach als ein bisschen Blog-Spielerei.^^

In diesem Fall hab ich den PHP-Code direkt in die Seite geschrieben (im HTML-Editor von WordPress) – weshalb auch das <?php...?>-Tag mittendrin steht –, da ich hier eh schon das Plugin Exec-PHP einsetze, das ebendies ermöglicht1. Alternativ kann man den Code natürlich auch anderweitig unterbringen, etwa über entsprechende Unterscheidungen im Theme oder komfortablerweise per Template – siehe Peruns Artikel.

Wie ihr auf dem Bild oben erkennen dürftet, sind hier Monate vor dem Blogbeginn und nach dem aktuellen Datum gar nicht dargestellt und Lücken der Regelmäßigkeit halber grau; zudem – was aber nur eine Stylingfrage ist – gibt’s keine unnötigen ansonsten listentypischen • Bullets und Einrückungen. Und in Klammern steht die Anzahl der Beiträge.

Das ist der Code dazu:

<style type="text/css">
div.yeararch { float: left; color:#777; margin-right: 2em; }
ul.montharch { list-style-type: none; padding-left: 0px; }
</style>

<?php global $wpdb;
$mnames = array (1=>'Januar', 2=>'Februar', 3=>'März', 4=>'April', 5=>'Mai', 6=>'Juni', 7=>'Juli', 8=>'August', 9=>'September', 10=>'Oktober', 11=>'November', 12=>'Dezember');
$started = false;
$years = $wpdb->get_results("SELECT YEAR(post_date) AS year, COUNT(*) AS count
FROM $wpdb->posts
WHERE post_type='post'
  AND post_status='publish'
GROUP BY year
ORDER BY year ASC");
foreach ($years as $y) {
  echo '<div class="yeararch"><h4><a href="/'.$y->year.'/">'.$y->year.'</a> <small>('.$y->count.')</small></h4><ul class="montharch">';
  $months = $wpdb->get_results("SELECT MONTH(post_date) AS month, COUNT(*) AS count
  FROM $wpdb->posts
  WHERE post_type='post'
    AND post_status='publish'
    AND YEAR(post_date)=$y->year
  GROUP BY month
  ORDER BY month ASC");
  $ms = array();
  foreach ($months as $m) { $ms[$m->month] = $m->count; }
  for ($i=1; $i<=12; $i++) {
    $m0 = sprintf('%02d',$i);
    $mname = $mnames[$i];
    if ($ms[$i]>0) {
      echo '<li><a href="/'.$y->year.'/'.$m0.'/">'.$mname.'</a> ('.$ms[$i].')</li>';
      $started = true;
    } else {
      if ($y->year<date('Y') || $i<=date('n')) {
        if (!$started) echo '<li>&nbsp;</li>'; else echo '<li>'.$mname.' (0)</li>';
      }
    }
  }
  echo "</ul></div>\n";
}
?>

<div style="clear:both;"></div>

Großes Hexenwerk ist der Code nicht: Nach der kleinen CSS-Definition (direkt auf der Seite, da ja nur hier benötigt) schaut der PHP-Code erst in der Datenbank nach, welche Jahre denn in Frage kommen – YEAR(post_date) AS year ... GROUP BY year – und nimmt auch die Beitragsanzahl – COUNT(*) AS count gleich mit.

Für jedes Jahr wird dann ein div-Container generiert, die dank des CSS am Anfang nebeneinander stehen – so viele wie halt auf die Seite passen, bei mir geht’s 2011 dann darunter weiter; ihr könnt ja mit den Abständen (margin-right) spielen. (Der div am Ende mit clear:both; sorgt dafür, dass nachfolgender Text darunter und nicht daneben landet.)

Dann gibt’s für jedes Jahr natürlich eine analoge Datenbank-Abfrage für die nach Monaten gruppierten Beiträge des jeweiligen Jahres, die dann nacheinander ausgegeben werden. Da diese Abfrage nur so viele Array-Einträge liefert, wie Monate benutzt wurden, sortiere ich sie ins Array $ms um, um in der Schleife alle Monate von 1 bis 12 durchlaufen und für leere Monate je nachdem, ob das Blog noch gar nicht begonnen wurde (!$started) oder ob es eine Lücke ist, eine Leerzeile bzw. eine nicht verlinkte Zeile mit der traurigen Null ausgeben zu können.

(Die Monatsnamen bekäme man an sich auch eleganter über PHP-Funktionen, aber irgendwie hatte ich da Probleme im Zusammenhang mit meiner Sprachumschaltung, deshalb die Lösung mit dem $mnames-Array.)

Bei den Links zu den Monatsarchivseiten geht der Code davon aus, dass sie dem Schema /2009/12/ folgen – wer ein anderes Schema mit pretty permalinks verwendet (kommt das denn vor?), muss sie entsprechend anpassen, ebenso wer die „unschöne“ Variante mit ? und Argumenten verwendet; das wäre dann ?m=200912 etc.

So, das war der erste Beitrag zum Archiv – wer Fragen, Anregungen, Verbesserungsvorschläge o.ä. hat, möge jetzt sprechen oder für immer schweigen… Wie erwähnt geht’s dann demnächst um die Mehrfachauswahl bei den Schlagwörtern, aber vielleicht schiebe ich auch noch die Einbindung von WP.com-Stats anstelle von WP-PostViews für die Ermittlung der beliebtesten Beiträge dazwischen, wie Robert angeregt hatte. Mal sehen.

  1. Nebenwirkung: Man muss den HTML-Editor von WordPress verwenden, weil der visuelle nicht mehr möglich ist. []

Die große Enthüllung

Ja, heute ist es endlich so weit:
Der Tag der angekündigten Enthüllung!
 
Und hier ist sie:
 
Die Offenbarung:
 
Das, was ihr schon immer wissen wolltet:
 
Seid ihr bereit?
 
Also:
 
Hier kommt’s:
 
 
Heute beginnt die Snooker-WM!
 
Jetzt um 11 Uhr (natürlich auf Eurosport).
 
Ist doch toll!
 
 
 
Wie?
 
Ihr habt mehr erwartet?
 
Echt?
 
Na gut…
 

Ja, nachdem ich im April 2008 und 2009 jeweils einen Teil verraten hatte, erfahrt ihr heute endlich, was „cimddwc“ komplett bedeutet! Lassen wir doch den „Laudator“ zu Wort kommen, der mir anlässlich des fünfjährigen Jubiläums unserer Haupt-Software im Oktober 2005 den zugrundeliegenden „Titel“ verliehen hat:

CONGRATULATIONS !!!!!!!!!!!!!!!!!!!!!!!!

In Anerkennung Ihrer exorbitant fulminanten Leistungen im Bereich der Entwicklung dem aktuellen Stand der Technik weit vorauseilender Diagnosesoftware werde ich offiziell und unwiderruflich Ihre Beförderung zum Chief International Managing Direktor Developement, Wizardry and Clairvoyance jetzt und für alle Zeiten beantragen.

And there you have it. W und C entbehren nicht einer gewissen Ironie, oder?1

Und? Enttäuscht? Erleichtert? Entgeistert? Ent-garnichts? :mrgreen:

  1. Gemeint war letzteres in der Hinsicht, dass Kunden immer wieder mal von neuen Funktionen, die ich eingebaut hatte (und wenn’s nur eine Erleichterung in der Bedienung war), gesagt hatten, dass sie sie sich schon insgeheim gewünscht hatten… []

1234,56789

Der erste Beitrag in meinem Blog – einfach ein „Hallo Welt!“ – ist vom 6.9.2006 9:05:43 Uhr, somit ist mein Blog ist jetzt – um 22:43:28 Uhr – genau 1234,56789 Tage alt. Wollte ich nur mal kurz erwähnt haben, eine große Feier gibt’s nicht. :)

Was, ihr wollt doch ein bisschen mehr? Na gut, ein Poetron-Gedicht und virtuellen Schampus:

Das Bloggen der Blogs
 
Blogs müssen träumen.
Sie träumen alt und zerschlagen.
Sie grapschen albern und rein.
 
Oh Blogger, alt bist auch du!
 
Was wohl grapschen, was bloggen?
Die Stimmungen!
Grapschende Blogs!
Alt träumen die Blogs,
alt und rein.

redhead model cheering isolated on white

 


Photo: Gleb Semenjuk – Fotolia.com