Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

currently I'm using the below code to add rel=nofollow and target=_blank to all external links of my site's content but I would like this to happen only on Contributors posts. IE, Authors posts and above have no rewrite rules.

<?php

add_filter( 'the_content', 'cn_nf_url_parse');

function cn_nf_url_parse( $content ) {

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

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

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

            $noFollow = '';

            $pattern = '/target\s*=\s*"\s*_blank\s*"/';
            preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE);
            if( count($match) < 1 )
                $noFollow .= ' target="_blank" ';

            $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;

}
share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

There's author_can() for that:

add_action( 'loop_start', 'wpse105294_nofollow_author' );
function wpse105294_nofollow_author()
{
    ! author_can( $GLOBALS['post']->ID, 'edit_others_posts' )
        AND add_filter( 'the_content', 'cn_nf_url_parse');
}

So you only add that filter callback for authors and other roles that don't have the possibility to edit_others_posts. By default this is Subscriber and Author. For more info, take a look at the Codex article about Roles and Capabilities.

Edit

As I've lately done some stuff with the PHP HTML DOM Parser, I thought it might be better to use this one. For the easiness off things the code was mostly taken from @Alex answer on SO.

add_filter( 'the_content', 'cn_nf_url_parse');
function wpse_105294_Content_Parser( $content )
{
    $dom = new DOMDocument;
    $dom->loadHTML( $content );

    // DOMXPath() might be just too much
    $anchors = $dom->getElementByTagName( 'a' );

    foreach ( $anchors as $a )
    {
        if ( 
            ! $a->hasAttribute( 'rel' )
            OR '' === ( $rel = trim( $a->getAttribute( 'rel' ) ) )
        )
            continue;

        $rel = preg_split( '/\s+/', $rel );

        if ( in_array( 'nofollow', $rel ) )
           continue;

        $rel[] = 'nofollow';
        $anchor->setAttribute( 'rel', implode( ' ', $rel ) );
    }

    $html = '';

    // Remove `html\body` before returning
    foreach ( $dom->getElementsByTagName( 'body' )->item(0)->childNodes as $el )
        $html .= $dom->saveXML( $el, LIBXML_NOEMPTYTAG );

    return $html;
}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.