在“/go/”后使用$POST_SLUG掩蔽代销商URL

时间:2015-10-13 作者:Rogger

我想知道如何根据自定义字段URL重定向屏蔽URL。如果我有一个屏蔽的URL:

echo \'<a href="https://domain.com/go/\'. $post_slug .\'/" class="button">Click here to save \' . $discount_percentage . \'% on \' . $title . \'</a>\';
那么如何重定向此URLhttps://example.com/go/wordpress 指向保存如下值的自定义字段urlhttps://wordpress.org

重定向的配置方式必须使其仅重定向URL/go/ 然后是post_slug. 我不想重定向正在使用domain.com/post_slug = 有什么想法吗?

1 个回复
SO网友:chrisguitarguy

您需要使用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\'
    );
}
thewpse205416_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 关于它。

相关推荐

How To Fix A Redirect Chain

我希望有人能帮上忙。我的网站爬网显示我的主页上有一个重定向链。基本上,这表明我正在从:http: > https: > https://www.我需要一切http:// 和http://www 直接发送至https://www. 没有链条。以下是.htaccess, 有人能看到是否有可能导致它的错误吗。</IfModule> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ h