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

时间:2015-07-25 00:49:30

标签: php wordpress custom-post-type permalinks custom-taxonomy

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

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

我有两个名为/boston-wedding-djs//nyc-wedding-djs/的常规页面(注意复数 DJ 带有 s ),我使用自定义页面模板从相应的城市循环播放DJ,并显示该页面城市的DJ个人资料链接列表。

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

但是,当我将自定义帖子类型djs的重写slug更改为%city%-wedding-djs时,我会收到页面/boston-wedding-djs/的404 Not Found错误和/nyc-wedding-djs/

如何使用与页面同名的重写slug?

3 个答案:

答案 0 :(得分:10)

这让我想起了Matthew Boynes关于一个有点相关主题的精彩博客post

建议使用独特的底座,以避免您所描述的冲突。

如果你必须这样做并且正在寻找WordPress中的解决方法,那么可以在request - 或parse_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帖子。

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

答案 1 :(得分:7)

如果您使用的是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执行此操作,但看起来它们似乎很困惑,因此似乎不太可能正常工作。

答案 2 :(得分:7)

您不能拥有相同slug的帖子和页面。

您需要删除自己的网页并创建archive-djs.php的模板页面,也可以创建single-djs.php,并为您动态显示该页面。

请参阅此页面了解template hierarchy