WordPress Sitemap ohne Plugin

26. August 2009 | Geschrieben von Konstantin Obenland in WordPress | Tags: , ,
Wordpress Sitemap selbstgemacht

Wordpress Sitemap ohne Plugin

Wer meine Einträge verfolgt wird bemerkt haben, dass ich lieber einige Zeilen mehr Code in einer meiner Dateien habe, als für die Funktionalitäten ein Plugin zu installieren.
Auch für das Thema Sitemap gibt es verschiedenste Lösungen mit umfangreichen Individualisierungsmöglichkeiten und Features, die man sich runterladen kann. Trotzdem war ich auch hier der Meinung, dass sich so was auch von vorne herein selbst lösen lässt. Hier mein Ansatz:

Ziel ist eine Sitemap, in der alle Einträge nach Kategorien geordnet sind und dazu die statischen Seiten angezeigt werden.
Richtig, sich die Seiten zu holen ist einfach. Aber Kategorien und Einträge außerhalb des Loops?

WordPress bietet dazu verschiedenste Funktionen, da wir aber jeweils nur die IDs und Namen bzw. Titel der Kategorien und Einträge benötigen, tun wir etwas für die Performance, wenn wir uns auch nur diese holen und nicht alle Kategorie- und Post-Objekte.

Wir starten mit einer neuen Funktion in der functions.php unseres Themes. Falls noch keine existiert, kreiert einfach eine. Die globale Variable $wpdb benötigen wir, um gleich die nötigen Datenbankabfragen durchführen zu können.

Mit der unten aufgeführten SQL Abfrage holen wir uns also die benötigten Informationen zu den Kategorien, wobei wir natürlich auch nur die veröffentlichten Einträge zeigen möchten.

function sitemap() {
	global $wpdb;

	$category_array = $wpdb->get_results("SELECT t.term_id, t.name FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = 'category' AND tt.count > 0");

    $sitemap = '<h3>'.__('Posts','domain').'</h3>' .
				'<ul class="categories">';

Mit einer foreach-Schleife laufen wir durch die Objekte und bauen mit den Kategorie IDs und Namen die Links zum Kategorie-Archiv. Nun holen wir uns die Einträge, die der aktuellen Kategorie ID zugeordnet , beschränken uns aber auf Einträge Typ ‚post’, die auch veröffentlicht sind.

foreach($category_array as $category){
        $sitemap .= '<li>'.__('Category: ', 'domain').'<a href="'.get_category_link($category->term_id).'" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '">'.$category->name.'</a><ul>';
		$post_array = $wpdb->get_results("SELECT p.ID, p.post_title FROM $wpdb->posts p INNER JOIN $wpdb->term_relationships r ON p.ID = r.object_id WHERE r.term_taxonomy_id = $category->term_id AND p.post_type = 'post' AND p.post_status = 'publish'");

Mit diesen Informationen bauen wir uns die nächste Unordered List mit allen Titeln und Permalinks.
Zu guter Letzt bemühen die bekannte wp_list_pages() Funktion, bei der wir selbstverständlich die Seiten-ID unserer Sitemap ausschließen, sobald diese bekannt ist. ‘Echo’ sollte auf FALSE gesetzt werden, sonst erscheint die Liste in unvorhergesehenen Gegenden.

		foreach($post_array as $post){
			$sitemap .= '<li><a href="'.get_permalink($post->ID).'" title="'.esc_attr($post->post_title).'">'.$post->post_title.'</a></li>';
		}
		$sitemap .= '</ul>';
	}
	$sitemap .= '</li></ul>';
    $sitemap .= '<h3>'.__('Pages','domain').'</h3><ul class="pages">';
	$sitemap .= wp_list_pages(array('echo'=>false, 'title_li'=>false, 'exclude'=>'343')).'</ul>';
	echo $sitemap;
}

Sobald die Funktion fertig ist, kreieren wir ein neues Template mit dem Name Sitemap (oder jedem anderen, der euch für geeignet erscheint). Vom Markup her sollte sie ungefähr so aussehen, wie die page.php, jedoch fügen wir in den Content-Bereich folgende Zeile ein:

<?php sitemap(); ?>
Das Template-Dropdown im rechten Rand

Das Template-Dropdown im rechten Rand

Wir erstellun nun im Admin-Bereich eine neue Seite und wählen rechts im Template-Dropdown das Template Sitemap aus. Nach der Eingabe des Titels sind wir fertig.

Wer wissen möchte wie das Ergebnis aussieht, klickt einfach auf Sitemap.

Viel Spaß beim Implementieren!

Edit:

Eine alternative Sitemap, die keine eigenen Datenbankabfragen mehr enthält ist unter Sitemap: Die wordpresskonforme Methode zu finden.

Konstantin Obenland

Ich habe mich auf die Webseitenerstellung mit Wordpress spezialisiert - sauberes und wordpresskonformes Schreiben und Internationalisierung haben dabei hohe Priorität.

Socialize!

Wenn dir der Artikel gefallen hat, gefällt er bestimmt auch Freunden von dir. Weiterempfehlen:

4 Antworten bisher.

  1. I’m founded your website from holidaycheck. But I don’t know what the means of content this blog. Beacause I don’t speaking germany. But I see your blog very nice information for Information technology. Good and Good

  2. Hi, danke für diese interessanten Ausführungen, habe ich bei mir gleich mal versucht umzusetzen, funktioniert gut und spart wieder ein plugin, hervorragend!
    Gibt es eine Begrenzung der angezeigten Artikel? Bei einem Plugin kann man ja 50 oder 100 pro Seite einstellen, geht dies mit dieser Variante auch umzusetzen? Ist es für die Sumas überhaupt nötig oder haben die keine Einschränkung?

    Danke und Grüße aus der Hauptstadt V.

  3. Konstantin Obenland sagt:

    Hallo Zauberer,

    eine Beschränkung lässt sich relativ easy bei der Datenbank-Abfrage einfügen. Einfach ans Ende ein “LIMIT 0,50″ oder 100 setzen.
    Was genau meinst du mit ‘Sumas’?

    Beste Grüße,
    Konstantin

  4. [...] diese Methode möchte ich eigentlich nicht näher eingehen, denn sie wird bei obenlands.de eingehend erläutert. Die Herangehensweise ist die gleiche, jedoch mit anderem [...]

Hinterlasse eine Antwort