web-dev-qa-db-ja.com

コアカテゴリのCPTアーカイブ

news_archiveというカスタム投稿タイプがあり、WordPressカテゴリを使用しています。これらのカテゴリのアーカイブページをCPTのみでコアの投稿ではなく取得したいと考えています。管理しました。このURLに出くわします。これは、カスタムアーカイブページに関連付けられているときに私が望んでいることとまったく同じです。

/stories/category/in-the-news/?post_type=archived_news/

ここで、storiesは、パーマリンクページのカスタム構造で設定されたブログ投稿のパーマリンクです。

私がやりたいのはそれを

/news/category/in-the-news/

ニュースはarchived_news投稿のrewriteです

私は次のようなことを試していました:

function category_cpt_rewrites() {
    $categories = array( 'in-the-news', 'press-release' );
    foreach ( $categories as $category ) {
        $rule    = '/stories/category/' . $category . '/?post_type=archived_news';
        $rewrite = '/archived_news/category/' . $category . '/';
        add_rewrite_rule( $rule, $rewrite, 'top' );
    }
}

add_action( 'init', 'category_cpt_rewrites' );

しかし、構文が正しいとは思いません。私も正しい考えを持っていますか?

* edit Ok私はそれを機能させて、ソートしました。ルールを交換して値を書き換えてから、正しい正規表現を使用する必要がありました。

function category_cpt_rewrites() {
    $categories = array( 'in-the-news', 'press-release' );
    foreach ( $categories as $category ) {
        $rule    = '^news/category/([^/]*)/?';
        $rewrite = 'index.php?post_type=archived_news&category=' . $category;
        add_rewrite_rule( $rule, $rewrite, 'top' );
    }
}

add_action( 'init', 'category_cpt_rewrites' );

まだ両方のカテゴリが表示されていますが、近いと思います。しかし、今ではページネーションは機能せず、理由はわかりません。 /news/category/press-release/page/2/は最初のページと同じ投稿を返しますが、/stories/category/press-release/page/2/?post_type=archived_newsは次の投稿ページを表示します

1
zfors

カテゴリ({term})から特定のタイプ({post_type})の投稿を表示する場合、リンクの構造は次のようになります。

{post_type} /カテゴリ/ {term}

ページおよび「ブログ」投稿へのリンクとの衝突を回避するために、式は_([^/]+)_で始めることはできませんが、明示的に入力された投稿タイプのスラッグを含める必要があります。これは、カスタム投稿タイプごとに個別のルールを意味します。

_$regex = '^news/category/(.+?)/?$';
_

上記の式では、_$redirect_に_category_name_および_post_type_パラメーターを含める必要があります。

_$redirect = 'index.php?category_name=$matches[1]&post_type=news';
_

また、カスタム分類法(^news/custom_tax_slug/(.+?)/?$)の場合:

_$redirect = 'index.php?CUSTOM_TAX_SLUG=$matches[1]&taxonomy=CUSTOM_TAX_SLUG&post_type=news';
_

ページネーションを処理するには、上記のルールの拡張バージョンである別のルールが必要です。

_$regex = '^news/category/(.+?)/page/?([0-9]{1,})/?$';
$redirect = 'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]';
_

すべて一緒に:

_function category_cpt_rewrites()
{
    add_rewrite_rule( '^news/category/(.+?)/page/?([0-9]{1,})/?$',
        'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]',
        'top'
    );
    add_rewrite_rule( '^news/category/(.+?)/?$',
        'index.php?category_name=$matches[1]&post_type=news',
        'top'
    );
}
_

または:

_function category_cpt_rewrites()
{
    $post_types = [ 'news' ];
    foreach ( $post_types as $cpt )
    {
        add_rewrite_rule( '^'. $cpt .'/category/(.+?)/page/?([0-9]{1,})/?$',
            'index.php?category_name=$matches[1]&post_type='. $cpt .'&paged=$matches[2]',
            'top'
        );
        add_rewrite_rule( '^'. $cpt .'/category/(.+?)/?$',
            'index.php?category_name=$matches[1]&post_type=' . $cpt,
            'top'
        );
    }
}
_
1
nmr