web-dev-qa-db-ja.com

パーマリンク構造におけるカテゴリのフィルタリング

パーマリンクに/%category%/%postname%/を使う特定の投稿が含まれているすべてのカテゴリのURL文字列を取得します。urlのカテゴリをカテゴリ構造の1つのブランチのみに絞り込み、ルート親からは開始しないようにしますカテゴリー。

私は旅行ブログを持っています、そして私はこのカテゴリー構造を持っています:
場所› countryName› regionName› cityName
例: www.mytravelblog.com/places/indonesia/Java/jakarta/myPostName/

URL内のルートカテゴリをスキップするか、単に最小の子を使用します。
例: www.mytravelblog.com/jakarta/myPostName

出来ますか? (WP 3.0.1)

6
pax

これは可能なはずです。まず、www.mytravelblog.com/jakarta/myPostName/がすでに機能していることは幸運です。投稿が表示され、より長いバージョンにリダイレクトされません(少なくとも私の側では機能するようです)。つまり、生成されたリンクを処理するだけで済み、着信URLの処理方法や「正規化」を混乱させることはありません。

変更したいget_permalink()の結果は、post_linkでフィルタリングされます。だからあなたはおそらくこのようなことをすることができます:

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

私はただそれについてコメントしたいと思っていました、しかしそれからそれは詳細を特定するには小さすぎる場所になるでしょう。

Jan Fabryが投稿した答えはうまくいきました!しかし、この欠点は、コメントで指摘されているように、 http://example.com/sports/world-sports/permalink のようなURLがあると削除されることです。 http://example.com/world-permalink に移動すると、実際には404になります。

これを避けるためにあなたは追加することができます

$parentcats = '/' . $parentcats;

だからこのようにする必要があります

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

これは/ sports /のみ削除し、/ world-sports /は削除しません

誰かに役立つことを願っています!

0
Patrick S