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

Posted

技术标签:

【中文标题】拥有一个与自定义帖子类型“front”slug 标题相同的 WordPress 页面【英文标题】:Have a WordPress page with same title as custom post type “front” slug 【发布时间】:2015-10-15 18:53:10 【问题描述】:

我有一个自定义帖子类型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/(注意复数 DJss),我使用自定义页面模板循环访问来自相应城市的 DJ,并显示该页面所在城市的 DJ 档案链接列表。

我想做的是让重写 slug 成为%city%-wedding-djs,以便自定义帖子类型的单个页面“出现”(至少对 google)作为上述页面的子页面。

但是有一个冲突,当我将自定义帖子类型 djs 的重写 slug 更改为 %city%-wedding-djs 时,页面 /boston-wedding-djs//nyc-wedding-djs/ 出现 404 Not Found 错误。

如何获得与页面同名的重写 slug?

【问题讨论】:

查看一些代码通常会有所帮助。至少,你定义(并试图定义)重写的方式。 Google 在哪里显示“子页面”?我知道子页面(这里是单个 DJ 帖子)应该具有大致相同的 SEO 永久链接基础,但我的理解是每个页面都根据其自身的优点进行排名,无论是帖子类型的单个帖子更多的是面包屑问题.我通常以与您现在相同的方式处理此问题-/post-types/ 是一个具有很好概述的页面,然后/post-type/xyz/ 是有关xyz post-type 的具体细节-从未遇到过SEO 问题;两者都出现在post-type Google 搜索 Wordpress 在更改 slug 时有时会出现奇怪的错误,它会返回 404。删除具有相同 slug 的页面,更新 rewrite slug。然后转到设置 > 永久链接并重新保存永久链接。 【参考方案1】:

这让我想起了 Matthew Boynes 写的一篇很棒的博客 post,主题有点相关。

建议使用独特的基础 slug,以避免您描述的冲突。

如果您必须这样做并且正在寻找 WordPress 中的解决方法,那么可以在 request- 或 parse_request 过滤器的帮助下调整它解析传入请求的方式。

示例

这会检查%city%-wedding-djs页面是否存在,因此如果您以后添加更多城市,则无需更新代码sn-p:

! 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 帖子类型。

【讨论】:

【参考方案2】:

如果您使用的是 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 执行此操作,但他们似乎已经感到困惑,因此似乎不太可能起作用。

【讨论】:

【参考方案3】:

你不能有一个帖子和一个页面有相同的 slug。

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

查看此页面以获取template hierarchy

【讨论】:

所有三个提议的解决方案都可以解决这个问题,但这是迄今为止最不“hackish”、最干净、最面向未来的解决方案 - 而且它是唯一一个不会导致重复内容的解决方案据我所知。在解决问题之前咨询template hierarchy 总是一个好主意 - 通常它为相当复杂的问题提供了一个非常简单的解决方案。

以上是关于拥有一个与自定义帖子类型“front”slug 标题相同的 WordPress 页面的主要内容,如果未能解决你的问题,请参考以下文章

在永久链接中使用自定义帖子类型帖子 ID 而不是帖子标题

用于自定义帖子类型的 Wordpress 多个 slug

Wordpress - 如何通过 slug 获取自定义帖子类型?

自定义帖子类型 Slug 冲突

在函数文件中更改自定义帖子类型 slug

在 WordPress 管理列帖子/产品自定义帖子类型中显示 Slug