web-dev-qa-db-fra.com

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

Je pense qu'il y avait un plugin obsolète pour faire cela. Est-il possible de le faire facilement avec juste un peu de code? Nous préférons ne pas compter sur un plugin, car cela nous oblige à ce que le développeur le maintienne à jour.

Nous ne souhaitons supprimer que deux catégories de parents pour tous leurs permaliens de catégories enfants: "éléments" et "genres" (de sorte qu'il pourrait être adapté pour supprimer uniquement deux ID de catégorie).

Je vois qu'il y avait une solution avec les messages individuels ici , mais je ne pense pas que cela fonctionne aussi avec les permaliens de catégorie, n'est-ce pas?

7
David

Ce code fait assez bien le travail pour cette question et une autre sur la suppression de la/catégorie/base 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. (Pas sûr s'il y a un correctif pour cela.) En outre, cela ne change pas le permalien de publication. C'est juste la catégorie permalien qui change. 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;
}
6
David