web-dev-qa-db-de.com

Filtern von Kategorien in der Permalink-Struktur

Mit /%category%/%postname%/ für den Permalink erhalte ich eine URL-Zeichenfolge aller Kategorien, in denen der bestimmte Beitrag enthalten ist. Ich möchte, dass die Kategorien in der URL auf nur einen Zweig der Kategoriestruktur heruntergefiltert werden und nicht vom übergeordneten Stamm ausgehen Kategorie.

Ich habe ein Reiseblog und ich habe diese Kategoriestruktur:
Orte ›Landname› Regionname ›Stadtname
ex: www.mytravelblog.com/places/indonesia/Java/jakarta/myPostName/

Ich möchte die Stammkategorie in der URL überspringen oder nur das kleinste Kind verwenden
ex: www.mytravelblog.com/jakarta/myPostName

Ist es möglich? (WP 3.0.1)

6
pax

Das sollte möglich sein. Erstens haben Sie Glück, dass www.mytravelblog.com/jakarta/myPostName/ bereits funktioniert, Ihnen den Beitrag anzeigt und Sie nicht zur längeren Version weiterleitet (zumindest scheint es auf meiner Seite zu funktionieren). Das bedeutet, dass Sie nur an dem generierten Link arbeiten müssen und nicht daran, wie eingehende URLs behandelt oder "kanonisiert" werden.

Das Ergebnis von get_permalink(), das Sie ändern möchten, wird durch post_link gefiltert. Sie können also wahrscheinlich so etwas tun:

add_filter( 'post_link', 'remove_parent_cats_from_link', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename )
{
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Make sure we use the same start cat as the permalink generator
        usort( $cats, '_usort_terms_by_ID' ); // order by ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // If there are parent categories, collect them and replace them in the link
            $parentcats = get_category_parents( $parent, false, '/', true );
            // str_replace() is not the best solution if you can have duplicates:
            // myexamplesite.com/luxemburg/luxemburg/ will be stripped down to myexamplesite.com/
            // But if you don't expect that, it should work
            $permalink = str_replace( $parentcats, '', $permalink );
        }
    }
    return $permalink;
}
4
Jan Fabry

Ich hatte gedacht, ich würde es nur kommentieren, aber dann wäre es ein zu kleiner Ort, um die Details zu spezifizieren.

Die Antwort von Jan Fabry funktioniert gut! Dies hat jedoch den Nachteil, dass, wenn Sie eine URL wie http://example.com/sports/world-sports/permalink haben, diese abgespeckt wird to http://example.com/world-permalink , was tatsächlich zu einem 404 führt.

Um dies zu vermeiden, können Sie hinzufügen

$parentcats = '/' . $parentcats;

Also sollte es so sein

$parentcats = '/'. $parentcats;
$permalink = str_replace( $parentcats, '/', $permalink );

Dies wird nur/sports/und nicht/world-sports/strippen

Hoffe es hilft jemandem!

0
Patrick S