您需要使用rewrite rule 与自定义查询变量组合并挂接到template_redirect
抓住你的/go/...
URL。
首先:重写规则。这只是将正则表达式模式映射到上的一组查询参数index.php
. 我将在这里使用post ID,而不是slug。使捕获/重定向功能更加简单。
add_action(\'init\', \'wpse205416_add_rule\');
function wpse205416_add_rule()
{
add_rewrite_rule(
\'^go/(\\d+)/?$\',
\'index.php?wpse205416_go=$matches[1]\',
\'top\'
);
}
the
wpse205416_go
位是重要的,我们稍后将获取它。WordPress丢弃它不知道的查询变量,因此我们必须通过挂接
query_vars
.
add_filter(\'query_vars\', \'wpse205416_add_var\');
function wpse205416_add_var(array $vars)
{
$vars[] = \'wpse205416_go\';
return $vars;
}
现在我们可以
template_redirect
寻找我们的
wpse205416_go
变量如果存在,请获取帖子(确保它存在),获取URL并重定向。这里唯一有趣的是
_wpse205416_not_found
函数,它只是确保我们实际上是404。使命感
$wp_query->set_404()
未发送正确的HTTP状态。
function _wpse205416_not_found()
{
global $wp_query;
status_header(404);
$wp_query->set_404();
}
add_action(\'template_redirect\', \'wpse205416_catch_go\');
function wpse205416_catch_go()
{
$id = get_query_var(\'wpse205416_go\');
if (!$id) {
return; // not a redirect
}
$post = get_post($id);
if (!$post) {
return _wpse205416_not_found(); // not a valid post ID, 404 it!
}
// whatever your meta key is
$url = get_post_meta($post->ID, \'_wpse205416_go_url\', true);
if (!$url) {
return _wpse205416_not_found(); // no url, 404 it!
}
// always exit after redirecting
wp_safe_redirect($url, 302);
exit;
}
如果您有兴趣了解有关重写api的更多信息,我编写了一个相当广泛的
tutorial 关于它。