web-dev-qa-db-ja.com

ポストスラグをカテゴリスラッグよりも優先させる

カテゴリベースがURLから削除されているワードプレスサイトがあります。

現在、カテゴリにポストスラッグに似たスラッグがある場合、そのカテゴリが表示されます。

代わりに投稿を表示したいです。これは可能ですか?

ありがとうございます。

4
bertkat

あなたが求めていることをするためのきれいな方法はありません。あなたが欲しいのはWordPressが与えられたURLについてそのスラッグを含む投稿があるかどうかをチェックすることで、そうでない場合はそのスラッグを持つカテゴリーを見つけようとすることです。ページを除いて、WordPressは、一致する書き換え規則に「コミット」する前に、opject(post、term)が存在するかどうかを確認しません。したがって、書き換え規則に矛盾がある場合、2番目の書き換え規則は決して読み取られません。

最良の答えはあなたの投稿やカテゴリのために別の書き換え構造を見つけることです。プレフィックスは理想的です。投稿には/blog/%postname%//articles/%postname%/、カテゴリには/category/%category%//topic/%category%/のようにします。

それは言った、それはあなたが求めていることをすることは不可能ではない、それはただ最適ではありません。あなたがする必要があるのはrequestを傍受し、投稿が存在するかどうかを確認することです。そうでない場合は、クエリ変数を変更します。これはすべての投稿のページロードに追加されるので、メリットとコストを比較してください。また、投稿とカテゴリが同じ名前を共有している場合、そのカテゴリにアクセスすることはできません。難しい話は抜きにして、

function wpse_75604_check_rewrite_conflicts( $qv ) {
    if ( isset( $qv['name'] ) ) {
        if ( ! get_page_by_path( $qv['name'], OBJECT, 'post' ) ) {
            $qv['category_name'] = $qv['name'];
            unset( $qv['name'] );
        }
    }
    return $qv;
}
add_filter( 'request', 'wpse_75604_check_rewrite_conflicts' );
0
Matthew Boynes

この質問への答えpage_rewrite_rules filterをpost_rewrite_rulesに置き換えて書き換え後のルールを最優先にすることで解決できると思います。

1
Parham