kingkool
  • 0
Новичок

Предотвращение перенаправления index.Php?Category_name=something

  • 0

Я пытаюсь отфильтровать сообщения в категории по году публикации. Я также хочу сделать это без перенаправления на шаблон года, поэтому мой идеальный URL-адрес будет http://example.com/category/reports/2011/, который загрузит файл шаблона 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/ указания параметра года. Как я могу перехватить это перенаправление?

Я пытался подключиться к 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);
Share
  1. Это должно работать:

    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' );
    }
    
    • 0
  2. Аааа 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_DEBUG он установлен к истине в wp-config.php .

    Оттуда я понял, что перенаправление запускается из строки 367, /wp-includes/canonical.php поэтому, посмотрев исходный код на Trac ( http://core.trac.wordpress.org/browser/trunk/wp-includes/canonical.php#L367 ), Я разобрался, как убить канонический редирект.

    • 0

Оставить ответ

You must login to add an answer.