Sitemap: Die wordpresskonforme Methode

Sitemap RevisitedAuf Grund der Beliebtheit meines früheren Artikels über eine WordPress Sitemap ohne Plugin und meiner heute besseren Kenntnis des WordPress Core, möchte ich eine Alternative zur Erstellung einer Sitemap vorstellen, die ohne eigene Datenbank Queries auskommt und ausschließlich auf schon vorhandene WordPress Funktionen beruht:

/**
 * Builds the Sitemap and echoes the HTML
 *
 * @echo Sitemap
 */
function sitemap() {

    $category_array = get_categories(array(
        'exclude_tree'    =>    24
    ));

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

foreach ( $category_array as $category ) {
    $sitemap .= "<li>".__('Category: ', 'domain').'<a href="'.get_category_link($category->cat_ID).'" title="' . sprintf( __( "View all posts in %s" , 'domain'), $category->name ) . '">'.$category->name."</a><ul>n";
    $post_array = get_posts(array(
        'post_type'    =>    'post',
        'cat'        =>    $category->cat_ID
    ));

    foreach ( $post_array as $post ) {
        $post->post_title = apply_filters( 'the_title', $post->post_title, $post->ID );
        $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>";
$sitemap .= wp_list_pages(array(
    'echo'        =>    false,
    'title_li'    =>    false,
    'exclude'    =>    '343,487,491'
))."</ul>";

 echo $sitemap;
}

In der ersten Funktion werden offensichtlich alle Kategorie-Objekte aus der Datenbank geholt. Diese Funktion verfügt über unheimlich viele personalisierungsmöglichkeiten, die ihr im WordPress Codex nachlesen könnt.

$category_array = get_categories(array(
    'exclude_tree'    =>    24
));

Als nächstes gehen wir durch die Kategorie-Objekte und holen zu jedem die dazugehörigen Einträge. Mit den geholten Einträgen könnt ihr dann die Liste bauen. Ich habe den the_title-Filter noch vorgeschaltet, damit meine Plugins auch hier ihre Magie versprühen können.

foreach ( $category_array as $category ) {
    $sitemap .= "<li>" . __('Category: ', 'domain') . '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '">' . $category->name . "</a><ul>";
    $post_array = get_posts(array(
        'post_type'  =>    'post',
        'cat'        =>    $category->cat_ID
    ));

    foreach ( $post_array as $post ) {
        $post->post_title = apply_filters( 'the_title', $post->post_title, $post->ID );
        $sitemap .= '<li><a href="' . get_permalink($post->ID) . '" title="' . esc_attr($post->post_title) . '">' . $post->post_title . '</a></li>';
    }
    $sitemap .= "</ul>";
}

Und nach dem jetzt alle Artikel aufgezählt wurden, fehlen nun nur noch die Seiten (ich habe die Seiten aus dem Footer ausgeschlossen um nur Seiten mit relevantem Inhalt anzuzeigen):

$sitemap .= wp_list_pages(array(
    'echo'       =>    false,
    'title_li'   =>    false,
    'exclude'    =>    '343,487,491'
)) . "</ul>";

Fertig ist die Sitemap.