Add rel=“nofollow” and target=“_blank” for externa

2020-07-17 05:47发布

I would like to add rel="nofollow" and target="_blank" for all external links in my Wordpress posts and pages permanently. I am aware, that there are plugins, which do the same, but as soon as they get disabled, all changes will be reversed and the articles are the same as from the beginning.

I do not know how to differ between internal or external links nor how to check if there is already a rel="nofollow" or target="_blank" attribute.

I guess the best way of doing this would be using PHP instead of MySQL. I already searched the web for guides, tutorials or plugins, without success.

May someone help me? I appreciate your support.

标签: wordpress
4条回答
别忘想泡老子
2楼-- · 2020-07-17 06:04

I have got a solution for applying nofollow to all existing and new external links. Copy the code into your functions.php of your activated theme

function add_nofollow_content($content) {
$content = preg_replace_callback('/]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i', function($m) {
    if (strpos($m[1], "YOUR_DOMAIN_ADDRESS") === false)
        return '<a href="'.$m[1].'" rel="nofollow" target="_blank">'.$m[2].'</a>';
    else
        return '<a href="'.$m[1].'" target="_blank">'.$m[2].'</a>';
    }, $content);
return $content;
}
add_filter('the_content', 'add_nofollow_content');

You can also call the function home_url() instead of "YOUR_DOMAIN_ADDRESS" in the space provided to avoid hard coding of the domain name.

The code is tested and it works. Hope this one helps.

查看更多
我想做一个坏孩纸
3楼-- · 2020-07-17 06:21

You can use following snippet: http://wpsnipp.com/index.php/functions-php/nofollow-external-links-only-the_content-and-the_excerpt/

This great little snippet that will add rel=”nofollow” to external links within both the_content and the_excerpt. Add this snippet to the functions.php of your wordpress theme to enable nofollow external links.

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;
}
查看更多
祖国的老花朵
4楼-- · 2020-07-17 06:24

I think adding rel"nofollow" and target="_blank" to outgoing links permanently is more work than it can be shown here. You will have to rebuild the functions of plugins like External Links so that even links in your wp_nav_menus can be rewritten.

I have a suggestion that adds the desired attributes via JavaScript when the page is loaded. You can add this script directly to your theme header or you can keep it in a seperate file enqueing the script in your themes' functions.php:

$(document).ready(function () {
    $( "a:not(a[href^='http://www.your-domain-name.com'],a[href^='javascript'],a[href^='#'])" ).attr({
                rel: "nofollow",
                target: "_blank"
            });
});
查看更多
forever°为你锁心
5楼-- · 2020-07-17 06:30

I took the answer of @rony-samuel and adjusted few things you might find useful.

Use the built-in make_clickable function to wrap links automatically. (E.g. useful when creating posts via API) - then check if the user has added additional classes to a link, (like a button to have a different styling) – we don't want to overwrite that, so just return the given markup with $m[0].

Last thing is the regex. In combination with make_clickable it would output <a <a href... so a link in a link. I corrected the regex to avoid that.

// Auto warp links within content
add_filter( 'the_content', 'make_clickable' );

// Add target blank and nofollow to external links
// Do not overwrite links that probably have been placed manually in the content
// and contain classes like "button" or whatever etc. Since they were placed manually
// with additional styling, the editor can add target="_blank" manually as well if needed.

function external_links ($content) {
    $content = preg_replace_callback(
    '/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
    function($m) {
        $hasClass = (bool) preg_match('/class="[^"]*[^"]*"/', $m[0]);

        if (strpos($m[1], home_url()) === false && $hasClass === false)
            return '<a href="'.$m[1].'" rel="nofollow" target="_blank">'.$m[2].'</a>';
        else
            return $m[0];
        },

        $content);
        return $content;
    }

// set a very low priority to ensure,
// all the content and shortcode things has been completed already
add_filter('the_content', 'external_links', 999);
查看更多
登录 后发表回答