Prevenirea redirecționării index.php?category_name=ceva

22 mar. 2011, 20:05:44
Vizualizări: 2.04K
Voturi: 4

Încerc să filtrez postările dintr-o categorie după anul datei postării. De asemenea, vreau să fac asta fără să fiu redirecționat către șablonul de an, așa că URL-ul meu ideal ar fi http://example.com/category/reports/2011/ care ar încărca fișierul șablon category.php unde apoi aș putea folosi query_posts pentru a include doar postările publicate în 2011 și care sunt în categoria reports.

Iată codul meu pentru regulile de rescriere...

function filter_category_by_year_rewrite_rules( $wp_rewrite ) {
    /* Creează reguli de rescriere pentru filtrarea arhivelor de categorie după an (/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');

Problema mea este că WordPress redirecționează automat index.php?category_name=reports&year=2011 către /category/reports/ fără nici o urmă a parametrului year. Cum pot intercepta această redirecționare?

Am încercat să folosesc acțiunea template_redirect fără succes :(

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);
0
Toate răspunsurile la întrebare 2
2

Acesta ar trebui să funcționeze:

add_action( 'init', 'wpa12742_init' );

function wpa12742_init(){
  // Adaugă reguli de rescriere pentru categorii cu an
  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' );
}

EDITARE

La o a doua privire, asta nu este suficient, deoarece vei fi prins de redirect_canonical().

Adaugă și asta:

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

function wpa12743_term_link( $link, $term, $taxonomy ){
  // Modifică link-ul termenului doar pentru categorii și când există un an în query
  if('category' != $taxonomy && !preg_match( '@^\d{4}$@', get_query_var('year') ) )
    return $link;
  return trailingslashit( $link ) . get_query_var( 'year' );
}
22 mar. 2011 20:27:24
Comentarii

Ai dreptate, canonical_redirect a fost problema. Vezi răspunsul meu de mai jos pentru cum am rezolvat-o. Voiai să filtrezi term_link și nu redirect_canonical? Îmi place mai mult metoda ta pentru slash-ul de la final.

kingkool68 kingkool68
22 mar. 2011 21:16:06

Super! Intenționam să filtrez term link, dar metoda ta funcționează perfect. :)

John P Bloch John P Bloch
22 mar. 2011 21:35:48
2

Ahhh redirect_canonical a fost vinovatul. Iată cum am scăpat de acest nenorocit...

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);

Practic, verific regula de rescriere care s-a potrivit cu cererea paginii și dacă este cea pe care am scris-o, atunci știu că pot opri redirecționarea canonică pur și simplu returnând false.

Poate informația mai utilă pentru oricine citește acest lucru este cum am descoperit acest lucru. Am instalat pluginul Better HTTP Redirects (http://hakre.wordpress.com/2011/03/20/how-to-debug-redirect-problems-in-wordpress/) care are un instrument foarte util pentru depanarea redirecționărilor când WP_DEBUG este setat pe true în wp-config.php.

De acolo, am realizat că redirecționarea era declanșată de la Linia 367 din /wp-includes/canonical.php, așa că după ce am analizat codul sursă pe Trac (http://core.trac.wordpress.org/browser/trunk/wp-includes/canonical.php#L367), am înțeles cum să opresc redirecționarea canonică.

22 mar. 2011 21:12:53
Comentarii

O unealtă într-adevăr foarte bună pentru a analiza nucleul este PHPXref: http://phpxref.ftwr.co.uk/wordpress/nav.html

John P Bloch John P Bloch
22 mar. 2011 21:36:29

+1 Redirectările canonice chiar mă enervau până când am găsit asta. Mulțumesc!

Marcus Downing Marcus Downing
20 mai 2011 12:35:27