WordPress Sitemap ohne Plugin

UPDATE: Dieser Artikel ist nicht mehr aktuell! Eine alternative Sitemap, die keine eigenen Datenbankabfragen mehr enthält, ist unter Sitemap: Die wordpresskonforme Methode zu finden.

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
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!

3 Gedanken zu „WordPress Sitemap ohne Plugin

  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. 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. Pingback: Sitemap erstellen ohne Plugin - Wordpress, Sitemap, erstellen, ohne, Plugin, Seitenübersicht - Plerzelwupps Erfahrungen

Kommentare sind geschlossen.