Prevenirea redirecționării index.php?category_name=ceva
Î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);

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

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.

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ă.

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