web-dev-qa-db-fra.com

Empêcher index.php? Category_name = quelque chose de rediriger

J'essaie de filtrer les publications dans une catégorie en fonction de l'année de la date de publication. Je souhaite également le faire sans être redirigé vers le modèle d'année pour que mon URL idéale soit http://example.com/category/reports/2011/ qui chargerait le fichier de modèle category.php où je pourrais ensuite utiliser query_posts pour inclure uniquement les publications publiées en 2011 et se trouvant dans la catégorie des rapports.

Voici mon code de règle de réécriture ...

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

Mon problème est que WordPress redirige automatiquement index.php?category_name=reports&year=2011 vers /category/reports/ sans laisser de trace du paramètre année. Comment puis-je intercepter cette redirection?

J'ai essayé de m'attacher à l'action template_redirect en vain :(

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

Cela devrait fonctionner:

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

MODIFIER

À la réflexion, cela ne suffit pas, car vous serez pris par redirect_canonical().

Ajoutez ceci aussi:

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

Ahhh redirect_canonical était le coupable. Voici comment j'ai éliminé ce bougre ...

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

Fondamentalement, je regarde la règle de réécriture qui correspond à la demande de page et si c'est celle que j'ai écrite, alors je sais que je peux supprimer la redirection canonique en renvoyant simplement false.

Peut-être que l'information la plus utile pour ceux qui liront ceci est la façon dont j'ai compris cela. J'ai installé le plugin Better HTTP Redirects ( http://hakre.wordpress.com/2011/03/20/how-to-debug-redirect-problems-in-wordpress/ ) qui possède un outil de débogage de redirection vraiment pratique lorsque WP_DEBUG est défini sur true dans wp-config.php.

À partir de là, j'ai réalisé que la redirection était déclenchée à partir de la ligne 367 de /wp-includes/canonical.php, donc après avoir examiné le code source sur Trac ( http://core.trac.wordpress.org/browser/trunk/wp -includes/canonical.php # L367 ), j'ai découvert comment tuer la redirection canonique.

4
kingkool68