如何正确重写帖子标签?

How to properly rewrite a post tag?

提问人:sfarzoso 提问时间:11/15/2023 最后编辑:sfarzoso 更新时间:11/17/2023 访问量:73

问:

假设我有一个作为术语 id 的帖子标签,我正在尝试使用,到目前为止我做到了:480add_rewrite_rule

function term_custom_redirect()
{
    $referer_url = "en/tag/a-lange-sohne";
    add_rewrite_rule(
        "^$referer_url/?$",
        'index.php?p=' . 480,
        "top"
    );

    flush_rewrite_rules();
}
add_action('init', 'term_custom_redirect', 10, 0);

代码应该为术语 ID 添加重写,因此当用户访问以下 url: 时,应该加载关联的标签页面,但我得到一个 404,即使我在最后添加了(我还保存了后端的永久链接)。480example.com/en/tag/a-lange-sohne/480flush_rewrite_rules

更新:

这里的主要问题是 url 中包含一些帖子标签,我想删除它,例如:-en

example.com/en/tag/a-lange-sohne-en/

应变为:

example.com/en/tag/a-lange-sohne/

分类法是 WordPress 中默认可用的,所以我没有创建任何新的分类法:post_tag

enter image description here

我虽然我最初的解决方案会起作用,但由于某种原因没有。我还尝试了一个应该处理这项工作的新钩子:

function update_term_link($permalink, $tag)
{
    if (strpos($permalink, '-en') !== false) {
        $permalink = str_replace('-en', '', $permalink);
    }

    return $permalink;
}

add_filter('tag_link', 'update_term_link', 10, 2);

但它也不起作用(我总是刷新永久链接)。

注意:使用钩子,我可以正确地看到新的永久链接结构,它根本无法访问,并出现 404 错误。tag_link

php wordpress url-重写

评论

1赞 Chris Haas 11/15/2023
可能与您的问题无关,但从技术上讲,正如所写的那样,您有两个尾随前斜杠,只有第二个是可选的
0赞 sfarzoso 11/15/2023
@ChrisHaas感谢您的提示,我试图删除斜杠,但同样的问题,有:$referer_urlen/tag/a-lange-sohne
0赞 Chris Haas 11/15/2023
此外,再次可能与您的问题无关,但由于您没有使用捕获括号,因此将是空的,因为与任何内容无关。name$matches[1]
0赞 sfarzoso 11/15/2023
@ChrisHaas我已经更新了代码,谢谢
0赞 Chris Haas 11/15/2023
最后,您可以尝试而不是 ,p=489page_id=480

答:

1赞 cabrerahector 11/16/2023 #1

这应该有效:

function term_custom_redirect()
{
    $referer_url = "en/tag/a-lange-sohne";
    $tag_id = 480;
    $tag = get_term($tag_id, 'post_tag');

    if ( $tag ) {
        add_rewrite_rule(
            "^{$referer_url}/?$",
            'index.php?tag=' . $tag->slug,
            "top"
        );

        flush_rewrite_rules();
    }
}
add_action('init', 'term_custom_redirect', 10, 0);

在这里,我们使用参数要求 WordPress 通过 slug 查找标签存档页面。tag

该函数使用 get_term() 按 ID 获取标签(在您的例子中,ID 是 ),然后我们可以使用该信息来检索标签对象,包括它的 slug。这很好,因为如果标签被重命名,它不会影响我们的代码,因为 ID 将保持不变。480

Screenshot of rewrite rule in effect

评论

0赞 cabrerahector 11/16/2023
此外,请考虑从函数中删除该行,它应该只谨慎使用,因为它是一个昂贵的调用(就性能而言)。手动保存永久链接(设置>永久链接)可以达到相同的效果。flush_rewrite_rules();
0赞 sfarzoso 11/16/2023
感谢您的解决方案,这对您有用吗?因为我的 wordpress 安装不断返回 404,我不知道此时可能是什么原因,也感谢您的提示。我做了一个,这是内容:flush_rewrite_rulesvar_dumpvar_dump([ 'url' => $referer_url, 'slug' => $term->slug ]); die;array(2) { ["url"]=> string(22) "/en/tag/a-lange-sohne/" ["slug"]=> string(16) "a-lange-sohne-en" }
0赞 cabrerahector 11/16/2023
是的,它正在我的本地开发环境中工作。我在这里分享代码之前测试了它:P在答案中添加了屏幕截图。
0赞 sfarzoso 11/17/2023
感谢您的解决方案,我已经接受了您的答案,尽管在我的情况下解决方案有点不同,但我写了一个答案来解释什么对我有用,再次感谢
1赞 sfarzoso 11/17/2023 #2

根据@cabrerahector提供的答案,我能够解决问题,但在我的情况下,我必须从中删除该部分,因此最终代码如下所示:en$referer_url

$referer_url = str_replace('/en/', '', $referer_url);

add_rewrite_rule(
    "^$referer_url?$",
    'index.php?tag=' . $term->slug,
    "top"
);