web-dev-qa-db-ja.com

Index.php?category_name =がリダイレクトされないようにする

投稿日の年でカテゴリ内の投稿をフィルタしようとしています。また、年テンプレートにリダイレクトされずにこれを行いたいので、私の理想的なURLは http://example.com/category/reports/2011/ になります。これはテンプレートをロードします。 file category.phpここで、query_postsを使用して、2011年に公開されたレポートカテゴリに含まれる投稿のみを含めることができます。

これが私の書き換え規則のコードです。

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/にyearパラメータの痕跡なしにリダイレクトすることです。どうすればこのリダイレクトを傍受できますか?

無駄に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);
3
kingkool68

これはうまくいくはずです。

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' );
}
4
John P Bloch

ああ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を返すことで正規のリダイレクトをやめることができることを知っています。

おそらくこれを読んでいる人にとってより役に立つ情報は私がこれを考え出した方法です。 Better HTTP Redirectsプラグインをインストールしました( http://hakre.wordpress.com/2011/03/20/how-to-debug-redirect-problems-in-wordpress/WP_DEBUGwp-config.phpがtrueに設定されている場合、これは本当に便利なリダイレクトデバッグツールを持ちます。

そこから、私はリダイレクトが/wp-includes/canonical.phpの367行目から引き起こされていることに気づいたのでTracのソースコードを見た後( http://core.trac.wordpress.org/browser/trunk/wp-includes /canonical.php#L367 )、正規リダイレクトを削除する方法を見つけました。

4
kingkool68