Da mich der Google Bot durch massives Generieren von 404-Fehlern fleißig darauf aufmerksam gemacht hat, dass meine Jahresarchive im Blog wohl nicht erreichbar sind, bin ich der Sache nachgegangen.
Ich habe mein Blog wie im WordPress Codex beschrieben konfiguriert – funktioniert zwar grundsätzlich, allerdings sind die Jahresarchive nicht erreichbar. Für die eigene Seite „Blog“ werden wie für alle anderen Seiten Rewrite Rules angelegt – das Problem daran ist, dass diese auch beim Aufruf von zB /blog/2011
greifen und somit nie die erste Seite des gewünschten Archivs (blog/([0-9]{4})/?$
) angezeigt werden kann. Unterseiten oder Monatsarchive funktionieren weiterhin wie gewünscht, da es dafür eigene Regeln gibt.
Ich habe das Problem über folgenden Code in der functions.php
meines Themes gelöst:
/** * Year-based archive fix [YAF] * * My blog is accessable via a subdirectory called /blog * Permalink structure: /blog/%category%/%postname%/ * Page ID of my blog page: 13 * * It seem's that if you create a "page" for your blog in a subdirectory as suggested * by the WordPress Codex (http://codex.wordpress.org/Making_Your_Blog_Appear_in_a_Non-Root_Folder) * the page-related rewrite rule get's executed first and it bypasses the pattern for * year-based archives (blog/([0-9]{4})/?$ in my example). * * To fix this behavior I changed the slug for my "blog page" to archives and * added a filter to page_link that changes the link from "archives" to "blog". * * DON'T FORGET TO SAVE THE PERMALINK STRUCTURE AT LEAST ONCE! * DON'T FORGET TO REPLACE THE PAGE ID (13) WITH YOUR BLOG PAGE ID! */ $permalink_structure = get_option('permalink_structure'); if (preg_match(':/([^/%]+)/.*:', $permalink_structure, $blog_page)) { // blog is located in a subdirectory $sezz_blog_subdirectory = $blog_page[1]; add_filter('rewrite_rules_array', 'sezz_yaf_rewrite_rules'); function sezz_yaf_rewrite_rules( $rewrite_rules ) { global $sezz_blog_subdirectory; $new_rules = array( $sezz_blog_subdirectory.'/?$' => 'index.php?cat=-0', $sezz_blog_subdirectory.'/page/?([0-9]{1,})/?$' => 'index.php?cat=-0&paged=$matches[1]', ); $rewrite_rules = $new_rules + $rewrite_rules; return $rewrite_rules; } if (!is_admin()) { add_filter('page_link', 'sezz_yaf_page_link', 1, 2); function sezz_yaf_page_link( $link, $id ) { if ($id == 13) { global $sezz_blog_subdirectory; return home_url().'/'.$sezz_blog_subdirectory.'/'; } else { return $link; } } } }
Update: home_url() anstatt WP_HOME