Icon der Seite

Top Artikel in WordPress hervorheben

  • von Micha am 27. August 2007
  • 13 Kommentare
  • Gelesen: 11133 | Heute: 3

RSS abonnieren

Top Artikel in WordPress hervorheben

Jeder Blogger hat sicherlich Artikel, die ihm besonders ans Herz gewachsen sind, in die er viel Zeit und Arbeit gesteckt hat. Aber mit der Zeit gehen diese Perlen zwischen all den anderen Artikeln unter. Man kann die meistgelesenen Artikel listen, die meistkommentierten, aber das müssen nicht zwangsläufig die Artikel sein, an denen unser Herzblut hängt und die wir unseren Lesern besonders hervorheben möchten.

Um dieses Dilemma zu beseitigen, ohne gleich ein Plugin zu installieren, habe ich mir eine einfache Vorgehensweise überlegt.

Vorbereitungen

Da WordPress nicht weiß, welches unsere Top-Artikel sind, müssen wir eine Möglichkeit schaffen, es ihm mitzuteilen. Dazu nutzen wir die sogenannten Benutzerdefinierten Felder (custom fields). Wir finden diese Felder beim Schreiben eines Beitrags/Seite am Ende des Dialogs.

Dialog Benutzerdefinierte Felder

Benutzerdefinierte Felder sind ein Schlüssel/Wert Paar (key/value), die zusammengehören und die in der Datenbank in der Tabelle postmeta gespeichert werden. Wir sehen in der Auswahlbox die von WordPress voreingestellten Schlüssel _wp_attached_file, _wp_page_template usw. Rechts daneben haben wir die Möglichkeit, eigene Schlüssel/Wert Paare anzulegen. Nach diesen Schlüsselen/Werten kann dann in der Datenbank gesucht werden.

Für unsere Topartikel brauchen wir nur ein Paar anzulegen, als Schlüssel topartikel und als Wert eine Zahl, die wir als eine Art Priorität oder Sortierung benutzen.

Wir suchen uns im WordPress Admin Modul unter Verwalten->Beiträge den ersten “Topartikel” aus und klicken auf bearbeiten. In das Feld Schlüssel tragen wir topartikel ein (Groß-/Kleinschreibung beachten) und daneben in das Feld Wert 1. Danach auf Benutzerdefiniertes Feld hinzufügen klicken und die Werte werden gespeichert. Ihr braucht nicht extra noch einmal den Beitrag speichern.

Dialogfeld ist gespeichert

Solltet ihr euch verschrieben haben oder ihr wollt vielleicht einen der Werte später einmal ändern, einfach die angezeigten Schlüssel/Werte überschreiben und danach Aktualisieren drücken. Wenn man Felder nicht mehr benötigt, können sie auch gelöscht werden.

Nachdem nun die Topartikel mit den benutzerdefinierten Feldern ausgestattet sind, brauchen wir eine Funktion, die uns die entsprechenden Ergebnisse liefert.

Die PHP Funktion

Damit wir nicht an jede Stelle in unseren Theme-Dateien immer wieder die gleiche Funktion schreiben müssen, gibt es in WordPress eine Datei functions.php. Sollte sie in eurem Theme fehlen, öffnet mit einem Texteditor ein leeres Dokument und speichert es in eurem Theme als functions.php ab und fügt folgenden Code ein:


<?php
function getTopArticles($count){
	global $wpdb;
	$count = intval($count);
	$toparticles = $wpdb->get_results("SELECT post_id
					FROM  $wpdb->postmeta
					WHERE meta_key ='topartikel'
					ORDER BY meta_value ASC
					LIMIT 0, $count");
	if ($toparticles){
		foreach ($toparticles as $toparticle){
			$title = wptexturize(get_the_title($toparticle->post_id));
			$link = get_permalink($toparticle->post_id);
			echo '<li><a href="'.$link.'" title="'.$title.'">'.$title.'</a></li>';
		}
	}else{
		echo '<li>keine Topartikel gefunden.</li>';
	}
}
?>

Die Funktion getTopArticles sucht die Beiträge aus der Datenbank, welche den Schlüssel topartikel haben und sortiert die Beiträge nach dem Wert. Die Anzahl der gelisteten “Topartikel” können wir bestimmen. Wenn Beiträge mit dem Schlüssel topartikel gefunden werden, wird eine Liste ausgegeben, sind keine Datensätze vorhanden, die Fehlermeldung “keine Topartikel gefunden”.

Topartikel im Template

Jetzt brauchen wir nur noch unsere Funktion an der Stelle in eine der Theme-Dateien eintragen, wo sie im Blog erscheinen soll. Das kann die Sidebar sein, oder oberhalb einer Post. Ich schreibe diese Funktion in die sidebar.php, damit die Topartikel ganz oben in der Seitenleiste zu sehen sind.

Also die sidebar.php im Editor öffnen und an die entsprechende Stelle die Funktion einfügen:


<?php if (function_exists('getTopArticles')): ?>
	<h3>Topartikel</h3>
	<ul>
	<?php getTopArticles(5); ?>
	</ul>
<?php endif; ?>

Zuerst fragen wir ab, ob unsere Funktion getTopArticles überhaupt existiert. Sollte das nicht der Fall sein, wird der HTML Code, der zwischen if und endif steht, nicht ausgeführt. Innerhalb der Klammern von getTopArticles(5) wird die Anzahl der Topartikel angegeben, die in der Seitenleiste erscheinen sollen.

Diese ungeordenete Liste könnt ihr natürlich nach allen Regeln der Kunst mit CSS stylen und eurem Theme anpassen.

13 Kommentare
  1. Tim sagt:

    Vielen Dank für die kurze Einführung in die Nutzung von benutzerspezifischen DB-Feldern.

    Ich habe jedoch eine Frage. Wenn ich nun zu den gefunden Posts nicht nur die Überschrift und Link benötige, sondern auch den Content anzeigen möchte. Wie soll ich dass denn machen? the_content() wird da ja nicht funktionieren.

    Besten Gruß
    Tim

  2. Micha sagt:

    Tim, du kannst get_the_content() verwenden. Natürlich ist dann ein Listenelement nicht unbedingt geeignet. Falls dir eine Extra Seite dafür vorschwebt, kannst du ein Template dafür erstellen und entsprechende html tags zur Ausgabe deiner Topartikel verwenden.

  3. Heike sagt:

    Hi Micha,

    vielen Dank für dieses Tutorial. Ich nutze WP noch nicht sehr lange und deine Einführung habe sogar ICH verstanden ;-)

    Grüßle,
    Heike

  4. Micha sagt:

    Danke Heike!
    bwt. Du hast eine sehr schöne Webseite.
    Liebe Grüße
    Micha

  5. Luigi sagt:

    Hallo!

    Wie mach ich das denn wenn ich Widgets nutze? Habe ein wenig rumexperimentiert komme aber auf keinen grünen Zweig :(

  6. Luigi sagt:

    Nachtrag: wenn ich die Topartikel auf in dr index.php unter dem DIV Content einfüge klappt es soweit, aber da will ich die nicht haben ;)

  7. Micha sagt:

    Der Code für die Sidebar muß ausserhalb von
    if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar() ) :
    ...
    endif;

    stehen, sonst geht es nicht.

  8. Luigi sagt:

    Wunderbar ! Nun funzt es… – Danke dir!

  9. Luigi sagt:

    Hallo!

    Kannst du bitte noch genauer erklären wie der Code aussehen muss wenn ich auf einer page die TopArtikel mit einem Auszug der Beitrags anzeigen will. Ich habe ein template angelegt für die page und soweit funzt das auch sehr schön. Ich bekomme es nur nicht hin das ein Auszug des Artikels angezeigt wird.

  10. Micha sagt:

    Probier mal folgendes direkt im Template, ich habs aber nicht getestet.
    global $wpdb;
    $posts = $wpdb->get_results("SELECT post_id
    FROM $wpdb->postmeta
    WHERE meta_key ='topartikel'
    ORDER BY meta_value ASC");


    if ($posts){
    foreach ($posts as $post){
    setup_postdata($post);
    // hier dein posttemplate reintun, wie bei der index
    }
    } else {
    echo "keine Topartikel gefunden.";
    }

    Wie gesagt, ohne Gewähr ;)

  11. Luigi sagt:

    Hallo!
    Ich bekomms nicht hin, trotzdem danke :(

  12. Basti sagt:

    Okay. Ich hatte dies bis jetzt immer mit einer “Top-10″ – Kategorie gelöst.
    Vorteil hier ist, dass der Nutzer bei vielen Posts die Massenbearbeitung von WordPress nutzen kann (einfach x Artikel markieren und dann die Kategorie “Top-10″ ankreuzen – fertig).

    Die Artikel werden dann mit einem Loop angezeigt, wo auch immer sie erscheinen sollen. Hervorhebung funktioniert auch, über “in_category()”.

    Im Admin-Bereich kann ich mir jederzeit über Filter->Top-10 die aktuellen Top-Artikel anzeigen lassen.

    Bei oft wechselnden “Top”-Artikeln müsste man sonst ständig jeden Artikel aufrufen und mühsam den Meta-Key ändern / entfernen.

    Wenn man allerdings sortieren will, kommt man dann nicht weiter und Deine Lösung muss angewendet werden…

  13. Micha sagt:

    Basti, ich würde das heute nicht mehr so machen (der Beitrag ist von 2007).
    Mit dem Linkmanager ist das easy getan.

Einen Kommentar schreiben

Kategorien

Werbung