smart | Webentwicklung
Alles rund um HTML5, PHP, WordPress & Co.

Ähnliche Artikel in WordPress anzeigen (ohne Plugin)

4. Mai 2012
Stephan
WordPress

Eine gute Möglichkeit in eurem WordPress-Blog die interne Verlinkung zu optimieren als auch die Besuchszeit eurer Besucher zu erhöhen, ist es, unter einem Artikel weitere zum Thema passende Artikel anzuzeigen.

Ähnliche Artikel werden dabei im Allgemeinen anhand der Kategorie und/oder der Tags ermittelt. Für WordPress gibt es für eine solche Funktionalität bereits einige gute Plugins, wie z.B. das Related Posts by Category-Plugin.

Wer nicht unbedingt ein weiteres Plugin installieren möchte, der sollte sich diesen Artikel durchlesen, in dem ich zeige, wie ihr zu einem Artikel ähnliche Artikel basierend auf den Tags anzeigt.

Vorab ein Beispiel

Bevor ich euch den Code vorstelle, zuerst einmal ein Beispiel, wie ich hier im Blog ähnliche Artikel anzeige:

WordPress: Ähnliche Artikel anzeigen

Wer es bunter mag, kann auch noch die jeweiligen Artikel-Thumbnails anzeigen.

Der Code zum Ermitteln der ähnlichen Artikel

In unsere functions.php fügen wir den folgenden Code ein:

function get_related_posts($limit = 5) 
{
	global $post;

	$tags = get_the_tags();

	if($tags)
	{
		$tag_ids = array();
		foreach($tags as $tag)
		{
			$tag_ids[] = $tag->term_id;
		}

		$args = array(
			'numberposts' => $limit,
			'tag__in' => $tag_ids,
			'exclude' => $post->ID
		);

		$related_posts = get_posts($args);

		$output = '';

		foreach($related_posts as $tmp_post) 
		{
			setup_postdata($tmp_post);
			$title = get_the_title($tmp_post->ID);
			$output .= '<li><a href="'.get_permalink($tmp_post->ID).'" title="Artikel &bdquo;'.$title.'&ldquo; lesen">'.$title.'</a></li>';
		}

		wp_reset_postdata();
	}

	$output = !empty($output) ? $output : '<li>Keine ähnlichen Artikel gefunden.</li>';
	return '<ul>'.$output.'</ul>';
}

Der erste Teil der Funktion (Zeile 3 – 21) dient dazu, basierend auf den Tags, themenrelavante Artikel aus der Datenbank zu holen. Hierfür ermitteln wir als erstes die Tags des Artikels (Zeile 5), den der Besucher aufgerufen hat und speichern die dazugehörigen Tag-IDs in einem Array (Zeile 9 – 13).

Anschließend feuern wir mittels der Funktion get_posts(), der wir noch ein Array mit diversen Optionen übergeben, eine Datenbankanfrage (Zeile 15 – 21). Für die Anfrage legen wir fest, dass nur eine bestimmte Anzahl ($limit) von Artikeln aus der Datenbank geholt werden. Standardmäßig werden 5 themenrelevante Artikel ermittelt.

Weiterhin geben wir unsere Tag-IDs an und definieren, dass der aktuelle Artikel, den der Besucher aufgerufen hat, ausgeschlossen wird.

Im zweiten Teil (Zeile 23 – 36) fügen wir dann einfach unsere Ausgabe zusammen. Dabei erstellen wir uns eine Liste und fügen einen Link für alle ermittelten Artikel ein.

Der Code zum Anzeigen der ähnlichen Artikel

Um nun die Artikelliste unter euren Artikeln einzufügen, muss der folgende Code innerhalb der WordPress-Loop eingefügt werden:

echo get_related_posts(6);

In diesem Fall würden, wenn vorhanden, 6 themenrelevante Artikel angezeigt werden.

Fazit

Der vorgestellte Code dient natürlich wieder nur als Beispiel und kann entsprechend euren Wünschen angepasst werden.

Beispielsweise ist es auch denkbar noch das jeweilige Artikelbild mit anzuzeigen oder aber die ähnlichen Artikel nicht basierend auf den Tags, sondern auf Grundlage der Kategorie(n) zu ermitteln.

Zeigt ihr in eurem Blog auch ähnliche Artikel an? Wie habt ihr dabei diese Funktionalität umgesetzt?

Kommentare  
11 Kommentare vorhanden
1 Bettina schrieb am 1. März 2013 um 11:51 Uhr

Hallo zusammen,

ich möchte den excerpt und das thumbnail mit einfügen in der Ausgabe. Ich habe den Code wie folgt angepasst, zwischen Zeile 27 bis 29:

setup_postdata($tmp_post);
$excerpt = get_the_excerpt();
$date = get_the_date(get_option('date_format'));
$title = get_the_title($tmp_post->ID);
$thumbnail = get_the_post_thumbnail('thumbnail', array('class' => 'alignleft'));			
$output .= $thumbnail.'<a href="'.get_permalink($tmp_post->ID).'" title="Artikel „'.$title.'“ lesen">'.$title.'</a>vom '.$date.' '.$excerpt;

Der excerpt wird angezeigt, nur leider das thumbnail nicht. Als thumbnail ist ein Beitragsbild festgelegt, das sollte also passen.

Ich freue mich sehr über Eure Hilfe.

2 Stephan L. schrieb am 1. März 2013 um 12:02 Uhr

Du musst bei der Thumbnail-Funktion noch die jeweilige Artikel-ID als ersten Parameter mit übergeben (siehe meine Mail).

WordPress-Codex: get_the_post_thumbnail

3 Bettina schrieb am 1. März 2013 um 12:31 Uhr

So einfach kann es manchmal sein. 😉 Vielen herzlichen Dank. Du hast mir sehr weitergeholfen.

4 Bettina schrieb am 1. März 2013 um 12:43 Uhr

Jetzt habe ich doch noch ein Problem und zwar werden bei mir alle posts richtig angezeigt, nur leider wird mit meiner abfrage

$date = get_the_date(get_option(‚date_format‘));

das Datum des aktuellen Artikels aufgerufen und nicht das der Artikel.

5 Stephan L. schrieb am 1. März 2013 um 12:51 Uhr

Wie wäre es mit:

$dateTime = new DateTime($tmp_post->post_date);
$dateTime->format('d.m.Y');

Mögliche Formatoptionen findest du hier: php.net

6 Bettina schrieb am 1. März 2013 um 13:22 Uhr

Danke, aber wenn ich das so nutze und dann $dateTime im output aufrufe, dann kommt immer eine Fehlermeldung.

Deinen Code habe ich an derselben Stelle eingesetzt, wo vorher mein date-code war.

7 Stephan L. schrieb am 1. März 2013 um 13:31 Uhr

Ehm, also du musst $dateTime->format('d.m.Y') in $output einsetzen. Erst die Funktion format gibt dir einen String (Text) zurück – $dateTime selbst ist ein Objekt.

$dateTime = new DateTime($tmp_post->post_date);
$date = $dateTime->format('d.m.Y');
$output .= $date;

So, jetzt müsst es aber funktionieren oder? 😉

8 Bettina schrieb am 1. März 2013 um 13:49 Uhr

🙂 Du bist der beste. (hug)

9 Konstantin schrieb am 23. Juli 2013 um 19:11 Uhr

Hallo Leute,

hab ne kleine Frage, und zwar:
Wie kann man den Code so modifizieren, dass nur bestimmt Kategorien mit einbezogen werden?

Wäre nett, wenn mir da jemand helfen könnte 😉

10 Stephan L. schrieb am 24. Juli 2013 um 10:19 Uhr

Hallo Konstantin,

dazu einfach das Parameter-Array für die get_posts-Funktion anpassen:

$args = array(
    'numberposts' => $limit,
    'tag__in' => $tag_ids,
    'exclude' => $post->ID,
    'cat' => '6, 3'
);

wobei folgendes auch geht, wenn du eine Array-Angabe bevorzugst:

'category__in' => array(6, 3)

Die IDs musst du dann entsprechend deinen gewünschten Kategorien anpassen.

Viele Grüße

Stephan

11 Konstantin schrieb am 24. Juli 2013 um 22:30 Uhr

Super,
hat geklappt. Danke 🙂

0 Trackbacks/Pingbacks vorhanden
Du bist herzlich eingeladen auch ein Kommentar zu hinterlassen!
Kommentar schreiben

Vielen Dank für dein Kommentar!