基于日期的不再存在的帖子的重定向

时间:2011-01-31 作者:Dan Gayle

我想要一种更优雅的方式来表达以下重定向:

RewriteCond %{REQUEST_URI} ^/blog/2008/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/01/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/02/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/03/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/04/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/05/(.*) [NC, OR]
RewriteCond %{REQUEST_URI} ^/blog/2009/06(.*) [NC]
RewriteRule . http://example.com/blog/? [R=301,L]
理想情况下,我想使用wp_safe_redirectwp_redirect. 然而,问题是这些页面已经从WP中删除了。

如果这些帖子已从DB中完全删除,是否可以在内部执行?

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

帖子已经不存在了,这没什么问题,我们将在查询数据库之前连接到WP。首先,我们设置重写规则,它将设置一个特殊的查询变量(我们必须将其声明为public),然后,在parse_request 操作时,我们检查该变量,如果已设置,则重定向该变量。

add_action( \'init\', \'wpse8236_init\' );
function wpse8236_init()
{
    // This is case-sensitive, we can\'t set regex flags
    // Replace `blog` with `[Bb][Ll][Oo][Gg]` to make it case-insensitive
    add_rewrite_rule( \'blog/2008/\', \'index.php?wpse8236_redirect=true\', \'top\' );
    add_rewrite_rule( \'blog/2009/0[1-6]/\', \'index.php?wpse8236_redirect=true\', \'top\' );
}

add_action( \'query_vars\', \'wpse8236_query_vars\' );
function wpse8236_query_vars( $query_vars )
{
    $query_vars[] = \'wpse8236_redirect\';
    return $query_vars;
}

add_action( \'parse_request\', \'wpse8236_parse_request\' );
function wpse8236_parse_request( &$wp )
{
    if ( array_key_exists( \'wpse8236_redirect\', $wp->query_vars ) ) {
        wp_redirect( \'/blog/\' );
        exit();
    }

结束