将/%postname%用于自定义帖子类型

时间:2011-05-18 作者:Marcus Downing

我有一个自定义的帖子类型,其permalink需要与页面位于同一空间,如下所示:

/an-example-thing  <--  custom post type \'thing\'
/about-the-things  <--  a normal page
我很清楚this isn\'t the recommended way to do it, 但我真的没有选择——这是客户指定的。

我已经用创建了自定义类型register_post_type, 并使用Custom Post Permalinks 按如下方式设置永久链接的插件:

/%thing%/
然而,这在识别我的自定义帖子的规则和普通页面的规则之间产生了冲突,这会将所有普通页面变成404。当永久链接更改为以下内容时,此问题就会消失:

/things/%thing%/
使用Monkeyman Rewrite Analyser 显示自定义帖子的规则排在第一位。即使我尝试强制它使用详细规则:

global $wp_rewrite;
$wp_rewrite->use_verbose_page_rules = true;
自定义post类型规则的优先级高于页面的详细规则,因此它们仍然得到404。

我希望它首先查找内容,如果找不到具有该名称的内容,请查找页面。另一种方式是可以接受的。在打404之前,有没有办法说服它同时查找事物和页面?

3 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

使用我的重写分析器可以获得一个加分:-)

事实上,即使您使用详细的页面规则,由于3.1版(或其他版本)的分类法重写规则甚至早于此。我recently answered another question 用一种方法将他们真正推向巅峰。如果您不介意使用详细的页面规则(如果您的页面不超过25页左右),那么这应该是可行的。

如果不需要详细的页面规则,则必须扩展核心WP 类,以便它可以处理URL可以引用页面或自定义帖子类型的“不明确”情况。迈克once provided a nice way to do this. 他的答案是为自定义分类法编写的,但它也应该适用于自定义帖子类型。

SO网友:Marcus Downing

我找到了一个解决方案,但它确实很难看:hook into 404 routing 交付应交付的页面。代码有点复杂,因为我还需要处理多站点前缀。

theme/404.php

<?php
global $current_blog;
$prefix = $current_blog->path;
$path = $_SERVER[\'REQUEST_URI\'];
$path = preg_replace("!^$prefix!i", "", $path);
$path = preg_replace("!\\?.*$!i", "", $path);
$path = trim($path, \'/\');
$page = get_page_by_path($path);

if (isset($page)) {
  $template = get_post_meta($page->ID, \'_wp_page_template\', true);
  if (empty($template))
    $template = get_page_template();
  query_posts("post_type=page&id={$page->ID}");
  include($template);
  die;
}
?>
...actually handle a 404...
识别出一个页面后,它必须运行query_posts 再次正确加载所有数据。这远不是理想的解决方案,但至少对我有效。如果有人能提出更好的解决方案,我很乐意用它来代替。

SO网友:Adam Gordon Bell

有两个插件可以解决这个问题。

This one 通过为每个自定义帖子类型页面添加特定规则来删除类型slug。

This one 看起来更高级,它允许您设置任何想要的slug结构,但它也被开发人员放弃了。

虽然最初我不得不用Monkeyman Rewrite Analyzer进行调试,因为其他一些规则会干扰我,但我还是让它们都工作了。

结束

相关推荐

curl problem or permalinks

我刚刚配置了我的VPS,我使用的是Centos,一切都很好,但如果我将永久链接设置为自定义结构,然后接受主页,没有帖子出现,它会显示404页,我想这是因为我没有启用curl,但我不知道我的php在哪里。我的centos中的ini文件?好的,我的卷曲被启用了,我检查过了phpinfo(); 这里是URLhttp://74.117.158.182/info.php但如果我在我的wordpress中设置了永久链接,那么接受主页,所有都会给我404页,你可以在这个URL上查看http://mbas.co.in如果