it-swarm.com.de

Wie verwende ich wp_rel_nofollow, um nofollow nur externen Links hinzuzufügen?

Ich möchte das Attribut nofollow nur externen Links im Inhalt des Beitrags hinzufügen. Interne Links sollten follow bleiben.

Kann ich wp_rel_nofollow() verwenden, um nur externe Links zu deaktivieren? Oder muss ich eine andere Methode anwenden?

2
Gixty

wp_rel_nofollow() füge allen Links das Attribut nofollow hinzu, damit wir es nicht verwenden können, oder ich bin mir nicht sicher, wie.

Mit dieser Funktion können Sie allen externen Links rel="nofollow" hinzufügen. Diese Funktion vergleicht alle Links im Inhalt mit Ihrer Blog-/Website-URL (als interne Domain) und fügt das Attribut nofollow hinzu, wenn beide nicht übereinstimmen.

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' );

nicht getestet.

2
Robert hue

Basierend auf der Antwort von @Robert hue und den WordPress-Funktionen wp_rel_nofollow () und wp_rel_nofollow_callback habe ich diese sehr ähnliche Lösung gefunden, die für mich funktioniert, weil Robert aus irgendeinem Grund dem Link nicht das Attribut nofollow hinzugefügt hat.

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' );

Dadurch wird allen zuvor veröffentlichten und zukünftigen Posts ein rel="nofollow"-Attribut hinzugefügt.

In Bezug auf die Leistung habe ich @Roberthue die gleiche Frage gestellt und dies ist, was er sagte:

Ich weiß nicht warum. Es ist meistens dasselbe wie bei der Verwendung von wp_rel_nofollow (), außer dass es eine zusätzliche Prüfung für eine externe Domain gibt. Das ist es aber, wenn Sie Tonnen von Domains hinzufügen, um sie zu überprüfen und auszuschließen, wird dies wahrscheinlich der Fall sein. - Robert hue

1
Gixty

Weder Gixtys noch Roberts Code funktionierten für mich. Roberts hat nicht einmal die richtigen Links gefunden, und selbst mit dem richtigen Muster hat er nicht überprüft, ob der Link intern oder extern ist, und das Nofollow allen Links hinzugefügt, während Gixtys den Nofollow korrekt hinzugefügt hat, aber wieder allen Links. nicht nur interne.

Dies ist mein Code, der für mich gut funktioniert und nur den rel nofollow zu internen Links hinzufügt. Beachten Sie auch, dass es keine Links berührt, die bereits das rel-Attribut haben, egal welchen Wert es haben mag.

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\">";
}
0
Ste_95

Ich verwende folgenden Code, um zu verhindern, dass alle externen Links folgen, und dieser Code funktioniert.

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;
}
0
Jase

Ich benutze die folgende Funktion, um nofollow Tags zu externen Links hinzuzufügen:

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;

}

Dies funktioniert Site-weit und zielt auf alle Beiträge ab, auch auf die veröffentlichten.

Dieser Ansatz unterscheidet sich von dem anderen Arbeitsansatz.

Ich poste dies, um zu überprüfen, ob jemand bestätigen kann, ob dieser oder der andere Ansatz für die Leistung besser ist.

0

Die anderen Antworten funktionieren nicht in allen Fällen und/oder ändern Verknüpfungen, wenn sie nicht und/oder nicht zuverlässig nach dem Attribut rel suchen sollen, falls es existiert.

Diese Lösung ist etwas umfassender und ermöglicht mehr Flexibilität.

// 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 );
}
0