一次性重写单个POST类型的插件(显示具有相同URL的普通页面)

时间:2017-04-07 作者:Sarah

SOLVED

见下面我的答案;我不能马上接受。

<小时>

Original post

我定制了一个帖子类型sector:

register_post_type( \'sector\',
  array(
    \'labels\' => array(
      \'name\' => __( \'Sectors\' ),
      \'singular_name\' => __( \'Sector\' )
    ),
    \'public\' => true,
    \'has_archive\' => false,
    \'rewrite\' => array(\'slug\' => \'sector\')
  )
);
我有一个名为“酒店与酒店”的部门,位于site.com/sector/hotels-hospitality/. 我在其他URL上有其他扇区。

我还有一个名为“扇区”的普通页面(位于site.com/sector/) 以及一个名为“Hotels&Hospitality”的子页面,其URL也是site.com/sector/hotels-hospitality/.

现在,当我导航到site.com/sector/hotels-hospitality/ 这是显示的帖子类型页面。我可以让正常页面显示吗?这是该部门的特殊登录页。

我在函数中尝试了这个。我的主题php:

flush_rewrite_rules();
add_rewrite_rule(
  \'sector/hotels-hospitality/\',
  \'index.php?page_id=1700\', // 1700 = post_id of the Page
  \'top\'
);
目前没有运气!我也尝试过不使用\'top\' param和这似乎没有什么区别。

Related Info

在此之后,我还编辑了“Hotels&Hospitality”部门的帖子类型slugsite.com/sector/hotels-hospitality/site.com/sector/hotels (这样想,至少我可以看到另一页),,但现在当我转到site.com/sector/hotels-hospitality/, 我被重定向到site.com/sector/hotels/ 我无法撤销它!我试着重新保存permalinks

然后我尝试将页面重命名为site.com/sector/hotels-hospitality-page/ 现在是404。

我正在使用新安装的4.7.3版。

Update

@WebElaine帮助我从中删除重定向site.com/sector/hotels-hospitalitysite.com/sector/hotels 通过删除WPPosteta中的\\u wp\\u old\\u slug字段。

site.com/sector/hotels-hospitality-page/ 仍将是404。

将要site.com/index.php?page_id=1700 正在重定向到site.com/sector/hotels-hospitality-page, 给出404。

我想问题是该网站正在搜索一个包含大量酒店接待页面的行业帖子,但没有找到一个。。。还没到检查页面的程度。

2 个回复
SO网友:Sarah

我安装了Monkeyman重写分析器https://wordpress.org/support/plugin/monkeyman-rewrite-analyzer/ 这帮了大忙。我在Jan Fabry关于this post 这也帮助了我。

我在插件中发现的第一件事是,我的重写并没有得到添加;他们没有出现在逻辑中。结果是add_rewrite_rule() 除非刚刚刷新重写,否则函数无效。我取出了flush_rewrite_rules(); 但每次测试更改时,我都会在管理面板中手动刷新permalinks。

一旦我将自定义帖子和页面重命名回相同的URLsectors/hotels-hospitality, 我能够解决这个问题。正如@WebElaine在评论中所解释的,如果有额外的重定向,则会创建额外的重定向_wp_old_slug 字段保存在wp_postsmeta 表,它帮助我在编辑post-slug后解决了相关/次要重定向问题。

这是我的最后一个功能and it only works after flushing rewrites (单击“设置”>“永久链接”中的“保存”)。我还使用pagename 而不是page_id 但您可以使用其中一个。

add_action( \'init\', \'addMyRules\' );
function addMyRules(){
    add_rewrite_rule(\'sector/hotels-hospitality\',\'index.php?pagename=sector/hotels-hospitality\',\'top\');
}
Thetop 参数很重要,因为它意味着将在系统post类型检查之前检查要匹配的模式(使用上述插件时检查重写顺序,下面的屏幕截图)。

enter image description here

因此,当我转到匹配的URL时,WordPress显示的是页面,而不是帖子,因为这是列表中的第一个模式匹配。

SO网友:WebElaine

我要解决的第一个主要问题是删除名为“Hotels&Hospitality”的“sector”帖子然后,转到永久链接页面(设置>永久链接),并按原样保存规则,这将刷新重写规则。理论上,如果没有/sector/hotels hospitality/sector“贴子,WordPress应该检查并找到你要找的页面。你可能想使用一个Chrome隐姓埋名窗口来确保过去的重定向不会让人觉得有问题,而实际上没有。

如果这不起作用,请尝试使用CPT而不是页面。重新创建名为“Hotels&Hospitality”的“sector”帖子。创建CPT“扇区”时,添加“支持=>页面属性”,以便您的CPT可以使用页面模板。这样,您可以将页面样式应用于帖子,但不会混淆WordPress和要显示的帖子类型。

因此,请将您的CPT注册码更改为:

register_post_type( \'sector\',
  array(
    \'labels\' => array(
      \'name\' => __( \'Sectors\' ),
      \'singular_name\' => __( \'Sector\' )
    ),
    \'public\' => true,
    \'has_archive\' => false,
    \'rewrite\' => array(\'slug\' => \'sector\'),
    \'supports\' => array(\'title\', \'editor\', \'thumbnail\', \'revisions\', \'page-attributes\')
  )
);
根据需要调整标题/编辑器/缩略图/修订-通过“页面属性”可以选择页面模板。然后,只需将页面内容复制到CPT中,删除页面,您就可以开始工作了。

相关推荐

如何将Page-{slug}.php这样的页面模板文件移到子目录中?

我想移动页面模板文件,如page-{slug}.php 到我的主题中的子目录,WordPress将自动识别它们。如果所述表单的页面模板在子目录中不存在,那么WordPress应该回到默认的模板加载规则。我如何才能做到这一点?Note-1: This 对于页面模板和this 链接提及template-parts/page, 这不是一回事。Note-2: 我有多个page-{slug}.php 像页面模板文件一样,我想将它们移动到子目录中,以获得更整洁的文件组织。