web-dev-qa-db-fra.com

Filtrage des catégories dans la structure permalien

En utilisant /%category%/%postname%/ pour le permalien, je reçois une chaîne d'URL de toutes les catégories dans lesquelles la publication spécifique est incluse. J'aimerais que les catégories de l'URL soient filtrées dans une seule branche de la structure des catégories, et non à partir du parent racine. Catégorie.

J'ai un blog de voyage et j'ai cette structure de catégories:
endroits ›countryName› regionName ›cityName
ex: www.mytravelblog.com/places/indonesia/Java/jakarta/myPostName/

Je voudrais sauter la catégorie racine dans l'URL ou même simplement utiliser le plus petit enfant
ex: www.mytravelblog.com/jakarta/myPostName

C'est possible? (WP 3.0.1)

6
pax

Cela devrait être possible. Premièrement, vous avez de la chance que www.mytravelblog.com/jakarta/myPostName/ fonctionne déjà, il vous montre le message et ne vous redirige pas vers la version la plus longue (du moins, il semble fonctionner de mon côté). Cela signifie que vous ne devez travailler que sur le lien généré, sans vous soucier de la façon dont les URL entrantes sont traitées ou "canonisées".

Le résultat de get_permalink(), que vous souhaitez modifier, est filtré via post_link. Donc, vous pouvez probablement faire quelque chose comme ça:

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

J'avais pensé pouvoir commenter, mais ce serait un endroit trop petit pour préciser les détails.

La réponse publiée par Jan Fabry fonctionne bien! Cependant, l'inconvénient est qu'il a même souligné dans les commentaires que si vous avez une URL du type http://example.com/sports/world-sports/permalink , elle sera réduite à http://example.com/world-permalink , ce qui conduira en fait à un 404.

Pour éviter cela, vous pouvez ajouter

$parentcats = '/' . $parentcats;

Donc ça devrait être comme ça

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

Ceci dépouillera seulement/sports/et pas/sports du monde /

J'espère que ça aide quelqu'un!

0
Patrick S