类别结构的改变会导致一个帖子有两种URL

时间:2021-12-15 作者:alancc

我已将类别从

"E;“文件恢复”-&燃气轮机"E;zip文件恢复“;

"E;“文件恢复”-&燃气轮机"E;归档和备份文件恢复”-&燃气轮机"E;zip文件恢复“;

然而,在那之后,我发现对于同一篇文章,有两种URL可以访问它。例如:

旧结构:https://www.datanumen.com/blogs/category/data-recovery/file-recovery/zip-file-recovery/page/3/

新结构:https://www.datanumen.com/blogs/category/data-recovery/file-recovery/archive-and-backup-file-recovery/zip-file-recovery/page/3/

这两个页面都将新的结构URL设置为规范URL。但当访问旧结构URL时,它会NOT 被重定向到新的。

这是专门设计的吗?如果是这样的话,如果我把类别改了10次,那么同一篇文章会有11份吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

访问旧结构URL时,它将NOT 被重定向到新的

这是因为:

默认值category 分类法是层次化的,permalink结构也是层次化的,因此其重写规则使用一个RegEx模式,如/category/(.+?)/? 它将匹配任何类别路径,即使它包含无效/不存在的术语段塞。(即(.+?) 零件是类别路径)

只要类别路径中的最后一个术语slug(在上述规则中)有效,即该术语存在,WordPress就会正常加载类别页面,即不会抛出404错误或重定向到正确的URL(具有正确类别路径的URL)。

对于第一个有问题的URL,类别路径是data-recovery/file-recovery/zip-file-recovery, 它包含有效的术语段塞,因此WordPress没有重定向到新的URL。

正如您现在可能已经猜到的,无效的类别路径foo/bar/zip-file-recovery, 其中;“foo”;和;条形图“;是不存在的类别,也可以工作,因为最后一个slug是有效的。

如何解决此问题

在加载类别存档页面之前,可以使用此选项确保类别路径有效:

add_action( \'wp\', \'wpse_399267_wp\', 1 );
function wpse_399267_wp( $wp ) {
    if ( is_category() &&
        ( $the_cat = get_queried_object() ) &&
        ! empty( $wp->query_vars[\'category_name\'] )
    ) {
        // Check if the category path is valid.
        $cat = get_category_by_path( $wp->query_vars[\'category_name\'] );

        // If the category path is invalid, redirect to the correct one.
        if ( empty( $cat ) && ! is_wp_error( $cat ) ) {
            wp_redirect( get_category_link( $the_cat ) );
            exit;
        }
    }
}
或者,如果您希望显示404错误页面,那么。。

// Replace these:
wp_redirect( get_category_link( $the_cat ) );
exit;

// with these:
$GLOBALS[\'wp_query\']->set_404();
status_header( 404 );
nocache_headers();

相关推荐

Slug for custom post type

我在我的网站上使用网页和博客帖子。页面获取URL示例。org/%postname%/,并基于Permalink设置,posts获取URL示例。组织/博客/%postname%/。完美的我有一个自定义的帖子类型,由我网站上的另一个组用于他们的网页。在注册post类型时,我为它们提供了一个重写slug:\'rewrite\' => array(\'slug\' => \'ncfpw\'),然而,他们的页面得到了URL示例。组织/博客/ncfpw/%博文名%/我怎样才能摆脱;博客;在他们的URL中?