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


19

「visningshus」と呼ばれるカスタム投稿タイプと、そのスラッグのあるページがあります。これは、そうあるべきです(必須)。

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

Wordpressに投稿タイプ名を優先させず、代わりにパーマリンクを作成させ、ページを表示させるにはどうすればよいですか?

回答:


33

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

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

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


1
完全に機能しましたが、wp-adminで正しく、書き換えが行われていないにもかかわらず、カスタム投稿タイプの名前で始まるすべてのパーマリンクが404になります。つまり、サイト上のすべてのパーマリンクは正しいが、すべてのカスタム投稿は404を提供します。それを手伝ってもらえますか?:)
ヘンリックアーランソン14年

@HenrikErlandssonおそらく、あなたの投稿タイプは同じページ名を持っています。この場合、投稿タイプ名を変更することをお勧めします。例:カスタム投稿タイプ名-変更前:製品変更後:cpt_products。
ブルーノモンテイロ

非常にインテリジェントです。
多数

8

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

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

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

これは、ページネーションを見て、ページ番号を取得し、それから裏返して、一致するスラッグを持つページを使用するように強制し、ページ変数を挿入します。

これは、'has_archive' => false,上記の投稿に加えて、目的の機能を実現するはずです。

他の人が述べたように、この変更を行った後、[設定]> [パーマリンク]にアクセスして、書き換えルールを必ずフラッシュしてください。

これが非常に長い間私を困惑させたのを知っているので、これが誰かを助けることを願っています。


4

ティエナ・ヘンリック!

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

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

4
誰かがこれを使用する場合は、削除flush_rewrite_rules();するinitたびに書き換えルールを変更しないでください。一度リロードしてから削除するか、管理ダッシュボードのパーマリンク設定に移動してパーマリンクを手動でフラッシュし、[変更を保存]をクリックしてください
-tehlivi

0

対立を解決せずに解決しました。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にアクセスすると、正しいURLのページで管理されているコンテンツが表示されます。

動作することを教えてください。


良いアイデアですが、これは非常に複雑です。私のソリューションを試しましたか?
クラフトナー14

@kraftnerいいえ、私はしませんでした。次回は試してみます。ありがとう!
モロコム14

これには、ヘッダーなどの副作用もあり、ページではなくアーカイブページであるかのようにすべてが作成されます。そのソリューションを使用することはお勧めしません。
クラフトナー14

ページIDが変更された場合はどうなりますか?これは安全ではありません。
ジョエルジェームズ

0

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

'has_archive' => false

シンプル。ただし、ページネーションの問題に直面したときは、

add_rewrite_rule

0

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


0

カスタム投稿タイプのスラッグのカスタム投稿タイプのコンテンツよりもページネーションを優先する一般的なソリューションを次に示します。

// 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

最後に、Permalinks設定ページの設定>パーマリンク(/wp/wp-admin/options-permalink.php)に移動し、現在の設定を保存してページのリンク構造を更新します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.