解决自定义帖子类型名称与页面永久链接冲突(相同的问题)


19

我有一个名为“ visningshus”的自定义帖子类型,还有一个带有该标签的页面。这是(必须)这样的。

当前,“ http://my-site.com/visningshus ”列出了该类型的所有帖子。我想显示具有该永久链接条的页面。

如何使Wordpress不使帖子类型名称优先,而是使永久链接显示页面?

Answers:


33

最简单的方法就是禁用此CPT的存档页面:

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

之后不要忘记在“设置>永久链接”中刷新永久链接。


1
效果很好-但是现在所有以自定义帖子类型名称开头的永久链接都给出404,尽管它们在wp-admin中是正确的,并且似乎没有进行重写。也就是说,所有永久链接在网站上都是正确的,但是所有自定义帖子都给出了404。您能帮上忙吗?:)
Henrik Erlandsson 2014年

@HenrikErlandsson也许您的帖子类型与页面名称相同。在这种情况下,建议您更改帖子类型名称。示例:自定义帖子类型名称-之前:产品之后:cpt_products。
布鲁诺·蒙泰罗

很聪明。解决了许多问题
bysanchy

8

我的信誉不高,无法评论@Carl的帖子,但他的答案是正确的(至少对于这种情况,页面页眉自定义帖子类型页眉保持相同并且不使用archive.php文件)

但是他的回答会给分页带来错误。为避免分页错误:

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

这将查看分页,获取页码,然后在反面强制其使用具有匹配块的页,然后插入page变量。

除了'has_archive' => false,上面发布的内容之外,这应该实现所需的功能。

如其他人所述,请确保在进行此更改后通过访问“设置”>“永久链接”来刷新重写规则。

希望这对某人有帮助,因为我知道这困扰了我很长时间。


4

Tjena Henrik!

我认为您需要做的就是将重写规则添加到已创建的Wordpress重写规则中。将此代码段添加到主题的functions.php中,或将其作为单独的pugin ...

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

4
如果有人使用它,请将其删除。flush_rewrite_rules();您不应该init每次都更改重写规则。重新加载一次,然后将其删除,或者通过转到管理控制台中的永久链接设置手动刷新永久链接,然后单击“保存更改”
tehlivi

0

我没有解决冲突就解决了它。创建一个包含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处看到由页面管理的内容。

让我知道它有效。


好主意,但这太复杂了。您尝试过我的解决方案吗?
kraftner 2014年

@kraftner不,我没有。下次我会尝试。谢谢!
molokom 2014年

这也有一些副作用,例如标题,所有内容仍在创建,就好像它是存档页面而不是页面一样。我不建议使用该解决方案。
kraftner 2014年

如果页面ID更改怎么办?这不安全。
乔尔·詹姆斯

0

不允许投票,但是对于卡尔斯解决方案,+应当为register_post_type

'has_archive' => false

简单。但是,当您遇到分页问题时,请看一下

add_rewrite_rule


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

最后但同样重要的是,转到“永久链接”设置页面的“设置”>“永久链接”(/wp/wp-admin/options-permalink.php),并保存当前设置以刷新页面上的链接结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.