阻止index.php?CATEGORY_NAME=某项内容重定向

时间:2011-03-22 作者:kingkool68

我正在尝试按帖子日期的年份筛选类别中的帖子。我还想这样做,而不被重定向到年模板,所以我的理想URL将是http://example.com/category/reports/2011/ 将加载模板文件类别。php中,我可以使用query\\u帖子只包括2011年发布的、属于reports类别的帖子。

这是我的重写规则代码。。。

function filter_category_by_year_rewrite_rules( $wp_rewrite ) {
    /* Creates rewrite rules for filtering category archives by year (/category/reports/2011/)*/
    $new_rules = array(
        "category/(.+?)/(\\d\\d\\d\\d)/?$" => "index.php?category_name=" . $wp_rewrite->preg_index(1) . "&year=" . $wp_rewrite->preg_index(2)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    var_dump($wp_rewrite);
}
add_action(\'generate_rewrite_rules\', \'filter_category_by_year_rewrite_rules\');
我的问题是WordPress自动重定向index.php?category_name=reports&year=2011/category/reports/ 没有年份参数的痕迹。如何拦截此重定向?

我试着在template_redirect 无效操作:(

function testing_redirect() {
    global $wp;
    if($wp->request[\'matched_rule\'] == \'category/(.+?)/(\\d\\d\\d\\d)/?$\') {
        load_template( \'category.php\' ); //TEMPLATEPATH .\'/category.php\';
    }
}
add_action(\'template_redirect\', \'testing_redirect\', 1);

2 个回复
最合适的回答,由SO网友:John P Bloch 整理而成

这应该可以:

add_action( \'init\', \'wpa12742_init\' );

function wpa12742_init(){
  add_rewrite_rule( \'category/(.+?)/(\\d{4})/?$\', \'index.php?category_name=$matches[1]&year=$matches[2]\', \'top\' );
  add_rewrite_rule( \'category/(.+?)/(\\d{4})/page/(\\d+)/?$\', \'index.php?category_name=$matches[1]&year=$matches[2]&paged=$matches[3]\', \'top\' );
}
再想一想,这还不够,因为你会被redirect_canonical().

添加以下内容:

add_filter( \'term_link\', \'wpa12743_term_link\', 10, 3 );

function wpa12743_term_link( $link, $term, $taxonomy ){
  if(\'category\' != $taxonomy && !preg_match( \'@^\\d{4}$@\', get_query_var(\'year\') ) )
    return $link;
  return trailingslashit( $link ) . get_query_var( \'year\' );
}

SO网友:kingkool68

啊哈redirect_canonical 是罪魁祸首。我是这样除掉这个混蛋的。。。

function kill_canonical_redirect($redirect_url, $requested_url) {
    global $wp;
    if($wp->matched_rule == \'category/(.+?)/(\\d\\d\\d\\d)/?$\') { 
        return false;
    } else {
        return $redirect_url;
    }
}
add_filter(\'redirect_canonical\', \'kill_canonical_redirect\', 10, 2);
基本上,我查看与页面请求匹配的重写规则,如果它是我编写的规则,那么我知道我可以通过简单地返回false来终止规范重定向。

也许对于阅读本文的人来说,我是如何理解这一点的,这是一个更有用的信息。我安装了更好的HTTP重定向插件(http://hakre.wordpress.com/2011/03/20/how-to-debug-redirect-problems-in-wordpress/ ) 它有一个非常方便的重定向调试工具WP_DEBUG 在中设置为truewp-config.php.

从那里我意识到重定向是从/wp-includes/canonical.php 因此,在查看了Trac上的源代码后http://core.trac.wordpress.org/browser/trunk/wp-includes/canonical.php#L367 ), 我想出了如何杀死规范重定向。

结束