WordPress评论者链接重定向跳转并在新窗口中打开

WordPress评论者链接重定向跳转并在新窗口中打开

一、评论者链接重定向

细心的朋友可能会注意到,在一些 WordPress 博客 上,随便打开一篇文章,把鼠标放在任意一个评论者名称上时,浏览器状态栏显示的地址可能是这样的形式:

http://earn.yesmall.biz/?r=http://earnfs.sinaapp.com/

点击后,浏览器仍然会跳转到评论者的网站。再观察自己站点上的评论链接,默认情况下评论者链接会直接显示为评论者填写的网址。两者最终打开的目标页面一样,但从站点链接结构来看,默认形式会让每一条评论都成为一个外链,可能分散站点权重。把它改成站内重定向地址,效果会更可控一些。

方法是在当前主题的 functions.php 中加入下面的代码。更推荐放在子主题或自定义插件里,避免主题升级时被覆盖。

// 评论者链接重定向。
add_filter('get_comment_author_link', 'add_redirect_comment_link', 5);
add_filter('comment_text', 'add_redirect_comment_link', 99);

function add_redirect_comment_link($text = '') {
    $home = home_url('/');
    $text = str_replace('href="', 'href="' . esc_url($home) . '?r=', $text);
    $text = str_replace("href='", "href='" . esc_url($home) . '?r=', $text);
    return $text;
}

add_action('init', 'redirect_comment_link');

function redirect_comment_link() {
    if (empty($_GET['r'])) {
        return;
    }

    $redirect = esc_url_raw(wp_unslash($_GET['r']));

    if (!$redirect) {
        wp_redirect(home_url('/'));
        exit;
    }

    if (!empty($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], home_url()) !== false) {
        wp_redirect($redirect);
        exit;
    }

    wp_redirect(home_url('/'));
    exit;
}

如果还有特殊需求,也可以用同样思路处理评论正文中的 URL 链接。不过评论正文里的链接数量和来源更复杂,修改前最好先在测试环境检查输出结果,避免误改站内链接或后台生成的链接。

二、评论链接在新窗口打开

WordPress 默认的评论者链接是在当前窗口中打开的。访客点击评论者链接之后会离开你的站点,很多时候流量就是在这个时候丢失的。

旧方法是直接修改 wp-includes/comment-template.php,在下面这段代码中的 rel="external nofollow" 后面加入 target="_blank"

if (empty($url) || 'http://' == $url) {
    $return = $author;
} else {
    $return = "<a rel=\"external nofollow\" href=\"$url\">$author</a>";
}

return apply_filters('get_comment_author_link', $return);

不过不建议直接改 WordPress 核心文件,因为升级 WordPress 时这些改动会被覆盖。更稳妥的方式仍然是在主题的 functions.php 或自定义插件中通过过滤器处理:

add_filter('get_comment_author_link', 'comment_author_link_new_window', 20);

function comment_author_link_new_window($link) {
    if (empty($link)) {
        return $link;
    }

    $link = str_replace('<a ', '<a target="_blank" ', $link);

    if (strpos($link, 'rel=') === false) {
        $link = str_replace('<a ', '<a rel="external nofollow noopener" ', $link);
    } else {
        $link = str_replace('rel="external nofollow"', 'rel="external nofollow noopener"', $link);
        $link = str_replace("rel='external nofollow'", "rel='external nofollow noopener'", $link);
    }

    return $link;
}

最后,建议在 robots.txt 中增加一行,告诉搜索引擎不要抓取这些跳转地址:

Disallow: /?r=*

保存后刷新页面,检查评论者链接是否已经变成站内跳转地址,并确认点击后会在新窗口中打开目标网站。

Leave a Reply