Nofollow external links

时间:2016-04-17 作者:SillyNinja

大家好,我正在使用以下代码使所有外部链接都不遵循。

add_filter(\'the_content\', \'my_nofollow\');
add_filter(\'the_excerpt\', \'my_nofollow\');

function my_nofollow($content) {
return preg_replace_callback(\'/<a[^>]+/\', \'my_nofollow_callback\', $content);
}
function my_nofollow_callback($matches) {
$link = $matches[0];
$site_link = get_bloginfo(\'url\');

if (strpos($link, \'rel\') === false) {
    $link = preg_replace("%(href=\\S(?!$site_link))%i", \'rel="nofollow" $1\', $link);
} elseif (preg_match("%href=\\S(?!$site_link)%i", $link)) {
    $link = preg_replace(\'/rel=\\S(?!nofollow)\\S*/i\', \'rel="nofollow"\', $link);
}
return $link;
}
但在我的网站的主题功能中添加此代码后,所有链接仍然是dofollow。

我正在使用Advanced Custom Fields Pro 使用此插件添加的插件和链接仍然是dofollow。

如何使所有外部链接不受关注?

1 个回复
最合适的回答,由SO网友:Tung Du 整理而成

编辑2:根据马克·卡普伦的建议,一般的解决方案应该是这样的。我们会在页面生成后进行过滤,所以我们不在乎使用哪个插件。

我们需要一个黑客来获取整个页面:

ob_start();

add_action(\'shutdown\', function() {
    $final = \'\';

    // We\'ll need to get the number of ob levels we\'re in, so that we can iterate over each, collecting
    // that buffer\'s output into the final output.
    $levels = ob_get_level();

    for ($i = 0; $i < $levels; $i++)
    {
        $final .= ob_get_clean();
    }

    // Apply any filters to the final output
    echo apply_filters(\'final_output\', $final);
}, 0);
我从this question

然后可以删除2个旧过滤器:

add_filter(\'the_content\', \'my_nofollow\');
add_filter(\'the_excerpt\', \'my_nofollow\');
只能使用一个:

add_filter(\'final_output\', \'my_nofollow\');

Old answer

只需再添加一个过滤器。

add_filter(\'acf/load_value/name=my_field\', \'my_nofollow\' );
编辑:解决这个问题的概念是过滤插件生成的内容,这里是ACF。因为the_content 是来自WP的,而不是您正在使用的插件,因此将筛选器添加到\\u内容不会有帮助。