拥有一个与自定义帖子类型“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
,其中包含两个术语:boston
和nyc
。因此,DJ 可以被标记为波士顿或纽约。
DJ 个人资料(单个 djs
帖子)位于 /nyc-wedding-dj/joe-shmoe/
,例如,对于波士顿 DJ,/boston-wedding-dj/jane-doe/
。换句话说,该自定义帖子类型的重写 slug 设置为 %city%-wedding-dj
。
我有两个常规页面,分别称为 /boston-wedding-djs/
和 /nyc-wedding-djs/
(注意复数 DJs 和 s),我使用自定义页面模板循环访问来自相应城市的 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;
);
或者如果你只有boston
和nyc
作为城市,你不需要检查对应的页面是否存在:
! 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 页面的主要内容,如果未能解决你的问题,请参考以下文章