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

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

Also, kann ich wp_rel_nofollow() , um nur externe Links nofollow zu machen? Oder muss ich eine andere Methode verwenden?

Solutions Collecting From Web of "Wie verwende ich wp_rel_nofollow, um nofollow nur externen Links hinzuzufügen?"

wp_rel_nofollow() füge nofollow-Attribut zu allen Links hinzu, so dass wir es nicht benutzen können oder vielleicht bin ich mir nicht sicher wie.

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

 function add_nofollow_external_links( $content ) { return preg_replace_callback( '/]+/', '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.

Basierend auf der Antwort von @Robert hue und den WordPress-functionen wp_rel_nofollow () und wp_rel_nofollow_callback kam ich auf diese sehr ähnliche Lösung, die für mich funktioniert, weil Robert aus irgendeinem Grund das nofollow-Attribut nicht zu der Verbindung 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('||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 ""; } add_filter( 'the_content', 'add_rel_nofollow' ); 

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

Bezüglich der performance habe ich @ Roberthue die gleiche Frage gestellt und das ist, was er gesagt hat:

Ich weiß nicht, warum es sollte. Es ist größtenteils das gleiche wie die Verwendung von wp_rel_nofollow (), außer dass es eine zusätzliche Prüfung für die externe Domäne gibt. Das ist es, aber wenn Sie Tonnen von Domains hinzufügen und ausschließen, dann wird es wahrscheinlich. – Robert Farbton

Ich verwende die folgende function, um nofollow Tags zu externen Links hinzuzufügen:

 add_filter( 'the_content', 'nofollow_enternal_links'); function nofollow_enternal_links( $content ) { $regexp = "]*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(']]>', ']]>', $content); return $content; } 

Dies funktioniert Site-weit und richtet sich an alle Posts, auch an die veröffentlichten.

Dieser Ansatz unterscheidet sich von dem anderen, der veröffentlicht wurde.

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

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

Dies ist mein Code, der für mich in Ordnung ist und nur den internen Link den rel nofollow hinzufügt. Beachten Sie außerdem, dass es keine Links berührt, die bereits über das rel-Attribut verfügen, egal welchen Wert es hat.

 function add_nofollow_external_links( $content ) { return preg_replace_callback( '||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 ""; } //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 ""; } 

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

Diese Lösung ist etwas umfangreicher 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( '/]*)(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 ''; }, $content ); }