提问人:sfarzoso 提问时间:11/15/2023 最后编辑:sfarzoso 更新时间:11/17/2023 访问量:73
如何正确重写帖子标签?
How to properly rewrite a post tag?
问:
假设我有一个作为术语 id 的帖子标签,我正在尝试使用,到目前为止我做到了:480
add_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,即使我在最后添加了(我还保存了后端的永久链接)。480
example.com/en/tag/a-lange-sohne/
480
flush_rewrite_rules
更新:
这里的主要问题是 url 中包含一些帖子标签,我想删除它,例如:-en
example.com/en/tag/a-lange-sohne-en/
应变为:
example.com/en/tag/a-lange-sohne/
分类法是 WordPress 中默认可用的,所以我没有创建任何新的分类法:post_tag
我虽然我最初的解决方案会起作用,但由于某种原因没有。我还尝试了一个应该处理这项工作的新钩子:
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
答:
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
评论
0赞
cabrerahector
11/16/2023
此外,请考虑从函数中删除该行,它应该只谨慎使用,因为它是一个昂贵的调用(就性能而言)。手动保存永久链接(设置>永久链接)可以达到相同的效果。flush_rewrite_rules();
0赞
sfarzoso
11/16/2023
感谢您的解决方案,这对您有用吗?因为我的 wordpress 安装不断返回 404,我不知道此时可能是什么原因,也感谢您的提示。我做了一个,这是内容:flush_rewrite_rules
var_dump
var_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"
);
评论
$referer_url
en/tag/a-lange-sohne
name
$matches[1]
p=489
page_id=480