仅在未找到其他匹配页面时重写

时间:2020-10-01 作者:chrispytoes

我正在重建一个网站,其中要求我将归档页面的URL结构更改为WordPress默认情况下无法处理的内容。我有一个名为product, 具有自定义分类product-category. 我需要重写/product-category/{term-slug} 将此分类法的页面存档为/{term-slug}.

所以我想制定一个重写规则/{term-slug} 页面,并将其重写为/product-category/{term-slug}, 只有在没有其他规则匹配的情况下。

我可以这样做来捕获并正确重写这些页面:

function rewrite_product_archive() {
    add_rewrite_tag(\'%product-category%\', \'([a-z0-9\\-_]+)\');
    add_rewrite_rule(
        \'^([a-z0-9\\-_]+)/?$\',
        \'index.php?product-category=$matches[1]\',
        \'top\'
    );
}
add_action(\'init\', \'rewrite_product_archive\');
有了这个,我可以导航到/{term-slug} 页面,它将显示存档/product-category/{term-slug} 正确翻页。然而,这现在导致所有实际页面停止工作,404。

所以我试着修改重写中的第三个参数topbottom, 还冲了一下。这使我的常规页面再次正常工作,但现在/{term-slug} 重写已停止工作,现在它们已达到404。

所以本质上,我只需要在没有其他规则匹配的情况下遵循重写。这可能吗?

1 个回复
SO网友:chrispytoes

事实证明,这是因为默认类别存档页不需要URL开头/category. WordPress已匹配路径/{category-slug} 对于默认值category 分类法存档。

我通过将默认类别存档重写更改为/category.

function move_category_rule($rules) {
    if(array_key_exists(\'(.+?)/?$\', $rules)) {
        $val = $rules[\'(.+?)/?$\'];
        unset($rules[\'(.+?)/?$\']);
        $rules[\'category/(.+?)/?$\'] = $val;
    }
    return $rules;
}
add_filter(\'rewrite_rules_array\', \'move_category_rule\');

相关推荐

permalinks issue and archives

我对运行在WP 3.3上的一个站点有一个问题,当我们通过“/%post\\u id%/%postname%/”使永久链接成为任何内容时,归档页面会断开并变成404。经过一些研究,我明白了为什么从性能的角度来看,这不是一个好的做法,所以我尝试了建议的备选方案:“/%year%/%postname%/”和“/%post\\u id%/%postname%/”这两个建议都有效,只是只有使用post\\u id的建议,归档URL才会变成“/date/2012/11/”,并被找到。根据permalink的任何其他建