web-dev-qa-db-ja.com

カスタムの投稿タイプ名とページのパーマリンクの競合を解決します(同じスラッグ)。

私は "visningshus"と呼ばれるカスタム投稿タイプと、そのスラッグを含むPageも持っています。これは当然のことです。

現在、 " http://my-site.com/visningshus "にそのタイプの投稿がすべてリストされています。代わりに、そのパーマリンクスラッグを含むページを表示したいです。

どのように私はポストタイプ名を優先させるのではなくパーマリンクを優先させずにページを表示させることができますか?

17

最も簡単な方法は、このCPTのアーカイブページを無効にすることです。

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

"設定>パーマリンク" で、後でパーマリンクを更新することを忘れないでください。

30
kraftner

私は@ Carlの投稿にコメントするのに十分な評判が良くありませんが、彼は正しい答えです(少なくとも ページのスラッグ および カスタム投稿のタイプslug を維持するこの状況に対して) archive.phpファイルを使用していない)

しかし、彼の答えはページネーションに誤りを与えるでしょう。ページ付けエラーを回避するには

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

これはページ付けを見て、ページ番号をつかみ、そして反対側でそれに一致するスラッグを持つページを使うことを強制し、そしてページ変数を挿入します。

この 上記に投稿された'has_archive' => false,に加えて は、望ましい機能を実現するはずです。

他の人が言ったように、この変更をした後にSettings> Permalinksを訪問することによって書き換えルールをフラッシュすることを忘れないでください。

これが誰かに役立つことを願っています、私はこれが本当に長い間私を困惑させたことを知っているので。

8
Andrew Herder

ジェナヘンリック!

私はあなたがする必要があるのは既に作成されたWordpress書き換え規則に書き換え規則を追加することだけであると思います。あなたのテーマのあなたのfunctions.phpにこのコードスニペットを追加するか、またはそれを別々のpuginとして含めてください...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
4
Carl

これを修正したのは、アーカイブをfalseに設定しただけでなく、カスタム投稿タイプを設定するときにHierarchicalをfalseに設定することでした。

0
Adrian Sticea

投票は許可されていませんが、Carlsソリューションの場合、register_post_typeは

'has_archive' => false

簡単です。ただし、ページネーションの問題に直面したときは、

add_rewrite_rule

これは、カスタム投稿タイプのスラッグに対して、カスタム投稿タイプのコンテンツよりもページ付けを優先する一般的な解決策です。

// prioritize pagination over displaying custom post type content
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

このスニペットを追加する以外に、あなたのカスタム投稿タイプがarchive = falseを持っていることも確認するべきです

そして最後に重要なことですが、パーマリンク設定ページ設定>パーマリンク(/wp/wp-admin/options-permalink.php)に行き、現在の設定を保存してページ上のリンク構造を更新します。

0
jmarceli

私は衝突を解決せずにそれを解決しました。 slug visningshusでページを作成し、あなたがそれに欲しいものは何でも書いてください。このページのIDに注意してください。

Archive-custom-post-type.phpテンプレートを好きなように作成してカスタマイズします(たぶんページテンプレートを使うことになるでしょう)。

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

その後、 http://my-site.com/visningshus youllにアクセスすると、正しいURLでページによって管理されているコンテンツが表示されます。

それがうまくいくことを私に知らせてください。

0
molokom