【プラグインなし】WordPressでnofollowを追加する方法

プログラミング
※このページの内容に広告・PRが含まれます。

WordPressのサイトを運営していて「rel=”nofollow”」をつけようと思って検索してもプラグインを使用した記事ばかりが表示されます。

僕も、もともと「WP External Links」というプラグインを使用してましたが、記事の編集画面で更新すると

更新に失敗しました。 返答が正しい JSON レスポンスではありません。

と表示され、WordPressが正常に動作しなくなりました。プラグインを追加すると不具合が起こることもあるので、極力追加したくないものですね。

プラグインを使用せずにnofollowを付ける方法を探して、なんとか見つけましたので紹介します。

サイト全体に追加する場合

サイト全体に追加する場合はバックエンド側で処理しましょう。functions.phpに以下のコードを追加します。nofollowと一緒に、「rel=”noopener”」と「target=”_blank”」も付けるようにしました。

  • rel=”noopener”:「target=”_blank”」のセキュリティ上の脆弱性を補うためのもの
  • target=”_blank”:外部リンクは別タブで開くようにするためのもの

また、すでに「rel=”nofollow”」がついているリンクには何も追加しません。

add_filter( 'the_content', function( $content ) {
  preg_match_all( '/<a[^>]+?href[^>]+?>/i', $content, $link_array );

  $my_url = preg_quote( rtrim( get_bloginfo('url'), '/' ) . '/', '/' );

  foreach( array_unique( $link_array[0] ) as $link ) {
    $replaced = $link;

    if( !preg_match( '/href=[\'|\"]?\s?' . $my_url . '[^>]+?[\'|\"]/i', $link ) ) {
      if( !preg_match( '/.+?rel\s?=[\'|\"]?\s?nofollow\s?/i', $link ) ) {
        $replaced = str_replace( '>', ' rel="nofollow noopener" target="_blank">', $replaced );
      }
      $content = str_replace( $link, $replaced, $content );
    }
  }
    return $content;
}

参考元:WordPress でプラグイン使わず外部リンクにアイコンつける| Thought is free

処理量を減らす方法(テーマの機能を利用)

先ほどのコードだと、

  1. 記事に設置しているリンクを1個ずつ抜き出して配列に格納
  2. 格納したリンクが外部リンクかどうかを判別
  3. 外部リンクにnofollowがついているかどうかを判別
  4. 外部リンクの場合「rel=”nofollow noopener”」と「target=”_blank”」を追加

といった処理をしているので、外部リンクが多いページだと処理量が多くページ表示速度が遅くなる可能性があります。そうなると、SEOのためにnofollowを付けているのに、本末転倒になりかねません。

また、サイトによっては先ほどのコードではうまく動作しないこともあると思いますし、下手にコードを追加すると、のちのち不具合が起こりやすくもなります。

そんなときは、テーマの機能をうまく利用してあげるといいです。

 

以下は、Cocoonという無料のテーマを利用した場合を例にして紹介してますが、同様の機能を持つテーマでも同じことができるはずです(コードの書き換えは必要かもしれません)。

まず、「Cocoon設定」->「本文」を開きます。

次に、外部リンク設定を以下のように変更します。

  • 外部リンクの開き方:新しいタブで開く(_blank)
  • 追加rel属性:noopenerを追加にチェック

そして、内部リンク設定 -> 追加rel属性 -> noopenerを追加 にチェックがついていれば外します。

 

ここまでで、

  1. 記事に設置しているリンクを1個ずつ抜き出して配列に格納
  2. 格納したリンクが外部リンクかどうかを判別
  3. 外部リンクにnofollowがついているかどうかを判別

と、「target=”_blank”」の追加まで完了している状態です。

あとはfunctions.phpに以下のコードを追加して、

add_filter( 'the_content', function( $content ) {
  $content = str_replace( 'noopener', 'noopener nofollow', $content );
  return $content;
});

で置換してあげることでnofollowを追加すればいいだけです。

 

特定の記事にのみ追加する場合

特定の記事の外部リンクのみにnofollowを追加する方法も紹介します。

ここではCocoonの機能を用いた方法を紹介しますが、コードを少し書き換えれば、一番最初に紹介したテーマの機能を使用しないコードでも同様のことができます。

add_filter( 'the_content', function( $content ) {
  $post_id = get_the_ID(); //投稿IDを取得
  $add_nofollow = array( xxxx ); //nofollowを追加する投稿のIDを指定
  if ( in_array( $post_id, $add_nofollow ) ) {
    $content = str_replace( 'noopener', 'noopener nofollow', $content );
  }
  return $content;
});
タイトルとURLをコピーしました