有一个与自定义帖子类型“front”相同标题的WordPress页面


Have a WordPress page with same title as custom post type “front” slug

我有一个自定义帖子类型djs和一个自定义分类法city,其中有两个术语:bostonnyc。所以DJ可以被标记为波士顿或纽约。

例如,DJ个人资料(单个djs帖子)位于/nyc-wedding-dj/joe-shmoe/,或者对于波士顿DJ,位于/boston-wedding-dj/jane-doe/。换句话说,该自定义帖子类型的重写段被设置为%city%-wedding-dj

我有两个称为/boston-wedding-djs//nyc-wedding-djs/的常规页面(注意复数DJ s),其中我使用自定义页面模板来循环来自相应城市的DJ,并显示来自该页面城市的DJ Profiles链接列表。

我想做的是有重写段是%city%-wedding-djs,以便自定义帖子类型的单一页面"出现"(至少谷歌)作为上述页面的子页面。

有一个冲突,然而,当我将自定义帖子类型djs的重写段塞更改为%city%-wedding-djs时,我得到/boston-wedding-djs//nyc-wedding-djs/页面的404 Not Found错误。

我怎么能有一个重写块与页面相同的名称?

这让我想起了Matthew Boynes关于一个相关主题的一篇很棒的博客文章。

建议使用唯一的基础段,以避免您所描述的冲突。

如果你必须这样做,并且正在WordPress中寻找一个解决方案,那么可以在requestparse_request过滤器的帮助下调整它如何解析传入请求。

:

检查%city%-wedding-djs页面是否存在,因此如果稍后添加更多城市,则不需要更新代码片段:

! is_admin() && add_filter( 'request', function( $query_vars )  
{
    if ( isset( $query_vars['city'] ) && ! isset( $query_vars['djs'] ) )  
    {
        $slug = $query_vars['city'] . '-wedding-djs';
        // Override if the %city%-wedding-djs page exists
        if ( get_page_by_path( $slug ) )
            $query_vars['pagename'] = $slug;
    }
    return $query_vars;
} );

或者如果你只有bostonnyc作为城市,你不需要检查相应的页面是否存在:

! is_admin() && add_filter( 'request', function( $query_vars )  
{
    if ( isset( $query_vars['city'] ) && ! isset( $query_vars['djs'] ) )  
    {
        $city = $query_vars['city'];
        if ( in_array( $city, array( 'boston', 'nyc' ) ) )
            $query_vars['pagename'] = $city . '-wedding-djs';
    }
    return $query_vars;
} );

这意味着请求:

example.tld/nyc-wedding-djs/

现在被视为page,而

example.tld/nyc-wedding-djs/joe-smhoe/

作为djs post.

这里我们假设page重写规则的优先级低于djs post类型。

如果您使用htaccess,您可以手动设置这些页面的重定向,然后它们应该正确解析。添加以下行:

RewriteCond %{REQUEST_URI} ^/boston-wedding-djs/$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/boston-wedding-djs$ [NC]
RewriteRule . index'.php?pagename=boston-wedding-djs [NC,L]
RewriteCond %{REQUEST_URI} ^/nyc-wedding-djs/$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/nyc-wedding-djs$ [NC]
RewriteRule . index'.php?pagename=nyc-wedding-djs [NC,L]

RewriteRule ^index'.php$ - [L]

你也可以用WordPress add_rewrite_rule来做这件事,但是看起来他们已经很困惑了,所以看起来不太可能工作

一个帖子和一个页面不能有相同的段符。

你需要删除你的页面,并创建一个archive-djs.php的模板页面,也许是single-djs.php,这将显示该页面动态为你。

见本页的模板层次