如何使用wp_rel_noollow仅向外部链接添加noollow?

时间:2014-11-20 作者:Gixty

我想添加nofollow 属性仅限于文章内容中的外部链接。内部链接应保持不变follow.

那么,我可以使用wp_rel_nofollow() 仅使外部链接不跟随?还是我需要使用其他方法?

6 个回复
最合适的回答,由SO网友:Robert hue 整理而成

wp_rel_nofollow() 将nofollow属性添加到所有链接中,这样我们就不能使用它,或者我不知道如何使用它。

您可以使用此功能添加rel="nofollow" 到所有外部链接。此功能将根据您的博客/网站URL(作为内部域)检查内容中的所有链接,如果两者不匹配,则添加nofollow属性。

function add_nofollow_external_links( $content ) {
    return preg_replace_callback( \'/<a>]+/\', \'auto_nofollow_callback\', $content );
}
function auto_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;
}
add_filter( \'the_content\', \'add_nofollow_external_links\' );
未测试。

SO网友:Gixty

基于@Robert hue的答案和wordpress函数wp_rel_nofollow()wp_rel_nofollow_callback 我提出了一个非常类似的解决方案,它对我很有效,因为出于某种原因,Robert没有在链接中添加nofollow属性。

function add_rel_nofollow( $text ) {
    // This is a pre save filter, so text is already escaped.
    $text = stripslashes($text);
    $text = preg_replace_callback(\'|<a (.+?)>|i\', \'add_rel_nofollow_callback\', $text);
    //$text = wp_slash($text); //I had to remove this because it was adding undesired backslashes to the output
    return $text;
}

function add_rel_nofollow_callback( $matches ) {
    $text = $matches[1];
    $site_link = get_bloginfo(\'url\');

    if (strpos($text, \'rel\') === false) {
        $text = preg_replace("%(href=S(?!$site_link))%i", \'rel="nofollow" $1\', $text);
    } elseif (preg_match("%href=S(?!$site_link)%i", $link)) {
        $text = str_replace(array(\' rel="nofollow"\', " rel=\'nofollow\'"), \'\', $text);
    }       

    return "<a $text rel=\\"nofollow\\">";
}
add_filter( \'the_content\', \'add_rel_nofollow\' );
这将添加rel="nofollow" 属性到所有以前发布和将来发布的帖子。

关于表现,我问了@Roberthue同样的问题,他说:

我不知道为什么会这样。它与使用wp\\u rel\\u nofollow()基本相同,只是它有一个额外的外部域检查。仅此而已,但如果您添加了大量要检查和排除的域,那么很可能会这样做罗伯特·休伊

SO网友:Christine Cooper

我使用以下函数添加nofollow 指向外部链接的标记:

add_filter( \'the_content\', \'nofollow_enternal_links\');

function nofollow_enternal_links( $content ) {

    $regexp = "<a\\s[^>]*href=(\\"??)([^\\" >]*?)\\\\1[^>]*>";
    if(preg_match_all("/$regexp/siU", $content, $matches, PREG_SET_ORDER)) {
        if( !empty($matches) ) {

            $srcUrl = get_option(\'home\');
            for ($i=0; $i < count($matches); $i++)
            {

                $tag = $matches[$i][0];
                $tag2 = $matches[$i][0];
                $url = $matches[$i][0];

                $noFollow = \'\';

                $pattern = \'/rel\\s*=\\s*"\\s*[n|d]ofollow\\s*"/\';
                preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE);
                if( count($match) < 1 )
                    $noFollow .= \' rel="nofollow" \';

                $pos = strpos($url,$srcUrl);
                if ($pos === false) {
                    $tag = rtrim ($tag,\'>\');
                    $tag .= $noFollow.\'>\';
                    $content = str_replace($tag2,$tag,$content);
                }
            }
        }
    }

    $content = str_replace(\']]>\', \']]&gt;\', $content);
    return $content;

}
这在网站范围内起作用,针对所有帖子,甚至是已发布的帖子。

此方法与发布的其他工作方法不同。

我发布此消息是为了检查是否有人可以确认此方法或其他方法是否对性能更有利。

SO网友: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;
}

SO网友:Ste_95

Gixty和Robert的代码对我都不起作用。Robert的一个甚至没有正确匹配链接,即使使用正确的模式也没有检查链接是内部链接还是外部链接,并将nofollow添加到所有链接,而Gixty的一个则正确添加了nofollow,但再次添加到所有链接,而不仅仅是内部链接。

这是我的代码,对我来说很好,只会将rel nofollow添加到内部链接。此外,请注意,它不会接触已经具有rel属性的链接,无论它可能具有什么值。

function add_nofollow_external_links( $content ) {
    return preg_replace_callback( \'|<a (.+?)>|i\', \'add_nofollow_callback\', $content );
}

function add_nofollow_callback( $matches ) {
    $text = $matches[1];
    $site_link = get_bloginfo( \'url\' );

    //If this is an internal link, don\'t touch it
    if( strpos( $text, $site_link ) ) {
        return "<a $text>";
    }     

    //If this doesn\'t have the rel attribute, append the nofollow
    if( strpos( $text, \'rel\' ) === false ) {
        $text = preg_replace( "%(href=S(?!$site_link))%i", \'rel="nofollow" $1\', $text );
    } 

    return "<a $text rel=\\"nofollow\\">";
}

SO网友:Stephen M. Harris

其他答案并非在所有情况下都有效和/或在不应该和/或不可靠地检查rel 属性(如果存在)。

此解决方案更全面,允许更大的灵活性。

// Takes an string of html attr and adds an attribute value; if attr is present and $replace=false, space and the new value is added to end of the attribute; otherwise attr is added to end.
function inject_html_attr($attr_str, $new_attr_name, $attr_value, $replace=false) {
    return preg_replace_callback(
      \'/(((?:^|\\s)\'.$new_attr_name.\'=[\\\'"])(.*?))([\\\'"])|$/i\', 
      function($m)use($new_attr_name,$attr_value, $replace){
        if( $m[0] ){
            $m[1] = $replace ? $m[2] : $m[1].($m[3]?\' \':\'\');
        }else{
            $m[1] = \' \'.$new_attr_name.\'="\'; 
            $m[4] = \'"\';
        }
        return $m[1].$attr_value.$m[4];
      }, 
    $attr_str, 1 );
}

add_filter(\'the_content\', \'apply_external_link_markup\');
function apply_external_link_markup($content) {
    // Assumes attributes are quoted (single or double)
    return preg_replace_callback(
      \'/<a ([^>]*)(href=(["\\\'])(?:https?:)?\\\\/\\\\/([^\\\\/\\\'">]+)(.*?)\\3)([^>]*)>/i\', 
      function($m) {
        if( $m[4] === $_SERVER[\'HTTP_HOST\'] )
            return $m[0];
        $attr = \' \'.trim(trim($m[1]).\' \'.trim($m[6]));
        //$attr = inject_html_attr( $attr, \'class\', \'external-link\' );
        //$attr = inject_html_attr( $attr, \'target\', \'_blank\', true );
        $attr = inject_html_attr( $attr, \'rel\', \'nofollow\', true );
        return \'<a \'.$m[2].$attr.\'>\';
      }, 
    $content );
}

结束

相关推荐

编辑Pagina_Links()的格式

我正在使用paginate_links 对循环的结果分页。我想用点而不是数字来设置分页的样式,但我不知道该怎么做。我可以尝试使用css,但我更喜欢干净的方法。example. <- o o o -> currently. <- 1 2 3 -> 这就是我目前输出链接的方式。<?php