【问题标题】:Custom post Types slug and permalinks issue - SEO and Structure自定义帖子类型 slug 和永久链接问题 - SEO 和结构
【发布时间】:2015-08-19 15:38:57
【问题描述】:

我看到这个问题之前已经提出过,但他们似乎没有解决我的具体问题。我确实觉得我的具体问题是一个广泛的问题。这可能看起来自相矛盾,但请听我说完。

对于我正在使用 WordPress 开发的网站,我为他们所服务的县创建了一些页面。到目前为止,我为雄鹿、蒙哥马利和特拉华县有一个,但还会有更多。从那里我们希望人们能够根据客户可以添加自己的县导航到“最近的工作”。因此,无论客户想要添加多少工作,它都可以是 1。这些页面将讨论特定城镇的特定工作,然后按工作类型而不是县链接到“相关工作”。所以这些深入 3 个级别,县中心页面 > 特定城镇的特定工作 > 特定工作类型(即:宾夕法尼亚州巴克斯县 > 宾夕法尼亚州纽敦的窗户更换工作 > 任何地方的窗户更换工作)。

希望这是有道理的。所以我所做的是为每个县创建一个页面。然后我创建了一个自定义帖子类型:County Jobs。我为每个县创建了自定义分类法,按县对它们进行分组。我可能还需要分类法来按工作类型对它们进行分组,但我还没有。我将我的模板“single-county-job.php”和我的自定义字段设置为仅在此帖子类型上显示。当“/county-job/”,post type slug,显示在 URL 中时,问题就出现了。添加额外的级别不利于 SEO 排名。如果您在 Google 中搜索任何内容,您将看到结果的第一页显示的网站只有两个级别:“URL.com/level1/level2”和任何带有“/level3/”的内容最多在第三页上(亚马逊或 eBay 等网站除外)。理想情况下,我希望 URL 是:“/bucks-county-pa/post-title”而不是“/county-job/bucks-county-pa/post-title”。用户从“/bucks-county/”页面转到“/county-job/bucks-county-pa/post-title”也是没有意义的。

所以我找到了多种方法从 URL 中删除 slug,但都导致 404。基本上 WordPress 不再将帖子识别为帖子。我可以添加一些重定向规则来绕过 404,但这对 SEO 也不利。我还读到这是不好的做法,是一种黑客行为,不应该这样做。

您过去是否设置过类似的页面/帖子,您是如何处理的?那个蛞蝓是个问题,但是为每个县制作一个 CPT 也不是一种选择,因为太多了,而且它们的设置都是一样的——这只是没有意义。也许这不应该是 CPT,但那我该如何处理呢?看起来它们不应该是页面,我将如何处理自定义字段?

我被困住了!您可以提供的任何帮助或见解都将是巨大的帮助。

【问题讨论】:

  • 在这种情况下坚持bucks-county-pa 是什么?这是县名?
  • 没错,就是县名。到目前为止,我有 3 个县,但最终会有 20 多个县。到目前为止,这三个是/bucks-county-pa/, /delaware-county-pa/, /montgomery-county-pa/。然后稍后我们将在 PA、NJ 和 DE 有其他县。现在,我将它们设置为分类法,但最终 - 给出了建议的解决方案 - 我不确定它们需要是什么。我只是确定它们需要成为 URL 的一部分。
  • 所以 slug 结构是[county name]-county-[state code],对吧?所以你总是在蛞蝓中有“县”?
  • 对。 :) 这就是我们组织工作所在城市的方式。

标签: wordpress url seo custom-post-type permalinks


【解决方案1】:

考虑到county 这个词在您的网址中是静态的,您可以使用它来让 Wordpress 识别您尝试请求的内容。您可以使用generate_rewrite_rules 过滤器来添加您自己的重写规则:

add_filter('generate_rewrite_rules', 'my_rewrite', 9);
function my_rewrite($wp_rewrite)
{
    $wp_rewrite->rules = array_merge(array(
        '^([^-]*)-county-([^/]*)/([^/]*)/?$' => 'index.php?post_type=county-job&county=$matches[1]-county-$matches[2]&county-job‌​=$matches[3]'
    ), $wp_rewrite->rules);
}

第二个重要部分是告诉 Worpdress 不要再使用以/county-job/ 为前缀的链接。您可以使用post_type_link 过滤器来做到这一点:

add_filter('post_type_link', 'my_post_link', 1, 3);
add_filter('post_link', 'my_post_link', 10, 3);
add_filter('page_link', 'my_post_link', 10, 3);
function my_post_link($post_link, $id = 0) {
  $post = get_post($id);
  if(is_object($post) && $post->post_type == 'job') {
      return str_replace('county-job/', '', $post_link);
  }
  return $post_link;
}

不要忘记,您需要刷新重写规则才能使该脚本正常工作。您可以通过访问 WP 后台的永久链接部分来做到这一点。

【讨论】:

  • 您好,感谢您提供清晰的解决方案 - 但由于我上面提到的原因,重定向确实不理想。我希望能够在没有任何黑客攻击的情况下进行设置。我对你的想法完全开放,但如果你认为这是一个干净的、良好的实践解决方案是有原因的。我还在学习。你能解释一下我为什么要这样做吗?
  • 那么问题是 Wordpress 需要自定义帖子类型的前缀 - 您的 url 的前缀来自您的 CPT 定义并被 WP 用于了解哪个存档页面打电话。因此,如果我们从 url 中删除此信息,Wordpress 就无法立即知道要引用哪个 CPT - 他迷路了。在我看来,重写规则是一个有效的解决方案,不应该被视为一种 hack - 它不会将旧的 url 重写为新的,他只是告诉 wordpress 一种访问 CPT 元素的新方法。
  • 好吧,让我确保我理解你 - 所以你是说这个重写规则不是我想的重定向,比如说 301?这不是“取这个 URL 并转到这里”,它更像是“这里是如何到达这里”?
  • 不,它不是 301,它只是一个重写 - WP 一直使用这种重写,以便使用正确的查询字符串获取对 index.php 的所有请求.
  • 我招募了我的老板,我们使用您提供的代码解决了这个问题:-D!因此,我将您的答案标记为正确,但这是我必须使用的字符串:index.php?post_type=county-job&county=$matches[1]-county-$matches[2]&county-job=$matches[3],我必须添加更多过滤器以确保在可能生成链接的任何地方,URL 都会在没有county-job 的情况下显示示例: add_filter( 'post_link', 'my_post_link', 10, 3); add_filter( 'page_link', 'my_post_link', 10, 3); add_filter( 'post_type_link', 'my_post_link', 10, 3); 感谢您的所有帮助!
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多