web-dev-qa-db-de.com

Übergeordnete Kategorie aus Permalink entfernen? Grundsätzlich nur die Kinderkategorie?

Ich denke, es gab früher ein veraltetes Plugin, um dies zu tun. Gibt es eine Möglichkeit, dies einfach mit nur einem kleinen Code zu tun? Wir bevorzugen es, uns nicht auf ein Plugin zu verlassen, da dies uns davon abhängig macht, dass der Entwickler es auf dem neuesten Stand hält.

Wir haben nur zwei übergeordnete Kategorien, die wir für alle untergeordneten Kategorie-Permalinks entfernen möchten: "Elemente" und "Genres" (so dass nur zwei Kategorie-IDs entfernt werden können)

Ich sehe, dass es eine Lösung für die einzelnen Posts gab hier , aber ich denke, das funktioniert nicht auch mit den Permalinks der Kategorie, oder?

7
David

Dieser Code erledigt so ziemlich den Job für diese und eine andere Frage zum Entfernen der/category/base aus den Permalinks. Habe es von einem Plugin bekommen, das dies tut, und habe beschlossen, nur den Rohcode zu verwenden.

So haben die Permalinks nur die niedrigste untergeordnete Kategorie aufgelistet.

Erstens hatten wir:

example.com/category/items/books/

und nun...

example.com/books

Die RSS-Feeds scheinen jedoch nicht mit dieser kürzeren URL zu funktionieren und erfordern weiterhin die lange URL. (Ich bin mir nicht sicher, ob es eine Lösung dafür gibt.) Außerdem ändert dies nichts an dem Post-Permalink. Es ist nur der Kategorie-Permalink, der sich ändert. Fügen Sie den folgenden Code in Ihre functions.php-Datei ein. Ich benutze 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