web-dev-qa-db-fra.com

Le meilleur moyen de supprimer/catégorie/de la catégorie permaliens?

doublon possible:
Supprimer la catégorie parent de permalien? Fondamentalement, seulement la catégorie enfant?

Nous avons vu des plugins pour le faire, et beaucoup de gens avec différentes modifications de code. Nous aimerions vraiment y parvenir de la manière la plus propre et la plus simple possible, sans nous soucier des plugins obsolètes ni causer des problèmes avec trop de mods.

1
David

Je ne sais pas si c'est facile ou propre, mais cela semble fonctionner. Ce code fait assez bien le travail pour cette question et une autre sur la suppression de la catégorie parente des permaliens. Je l'ai obtenu d'un plugin qui fait cela et j'ai décidé d'utiliser simplement le code brut.

Ainsi, les permaliens n’ont que la catégorie d’enfants la plus basse.

Tout d'abord, nous avons eu:

example.com/category/items/books/

et maintenant...

example.com/books

Cependant, les flux RSS ne semblent pas fonctionner avec cette URL plus courte et nécessitent tout de même une URL longue. (Vous n'êtes pas sûr qu'il existe un correctif pour cela.) Collez le code ci-dessous dans votre fichier functions.php. J'utilise Wordpress 3.0+.

// Remove category base
add_filter('category_link', 'no_category_parents',1000,2);
function no_category_parents($catlink, $category_id) {
    $category = &get_category( $category_id );
    if ( is_wp_error( $category ) )
        return $category;
    $category_nicename = $category->slug;

    $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $category_nicename, 'category' );
    return $catlink;
}

// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_parents_rewrite_rules');
function no_category_parents_rewrite_rules($category_rewrite) {
    //print_r($category_rewrite); // For Debugging

    $category_rewrite=array();
    $categories=get_categories(array('hide_empty'=>false));
    foreach($categories as $category) {
        $category_nicename = $category->slug;
        $category_rewrite['('.$category_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['('.$category_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]';
    }
    // Redirect support from Old Category Base
    global $wp_rewrite;
    $old_base = $wp_rewrite->get_category_permastruct();
    $old_base = str_replace( '%category%', '(.+)', $old_base );
    $old_base = trim($old_base, '/');
    $category_rewrite[$old_base.'$'] = 'index.php?category_redirect=$matches[1]';

    //print_r($category_rewrite); // For Debugging
    return $category_rewrite;
}

// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_parents_query_vars');
function no_category_parents_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}
// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_parents_request');
function no_category_parents_request($query_vars) {
    //print_r($query_vars); // For Debugging
    if(isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $query_vars['category_redirect'], 'category' );
        status_header(301);
        header("Location: $catlink");
        exit();
    }
    return $query_vars;
}
0
David