雑が喰おう

リンクタグに自動で属性を付加する改良版

現在、WordPressのfunction.phpにコードを追加して、リンクタグに自動で属性を付加するよにしています。

ところが、これにはバグがありました。

スポンサード リンク

それは、ページ内リンクに対応していないというもの。
ページ内リンクは通常、#1などとアンカーをつけて行います。

しかし、これにはhttp://b.hishitu.net/が含まれていませんので、先のコードでは、外部リンクだと判断されてしまいtarget="_blank"が付加されてしまうのです。

コードを作った時にも、脚注リンクがあった場合に新しいウインドウが開かれてしまうということがあったのですが、脚注リンクにはWordPressのプラグインを使用しており、その際に自動的にrel属性が付いていたので、それを元にフィルタをかけることで回避できました。

しかし、MarkDown記法で書いたリンクタグにはrel属性は自動的につかないので、それでフィルタを書けることは不可能。

そこで、リンクURLが#で始まる場合にフィルタをかえるようにしたいと思います。
単に#が含まれている場合とすると、外部リンクでも#が含まれていると反応してしまうので、それを回避させます。

また、それだけでは、rel="external"が付加されてしまうので、同じように、リンクURLが#で始まる場合は、rel="external"を削除するように変更しました。

できたコード

もっとスマートに記述する方法があるんでしょうけど、その場その場でやっていった結果がこれw

//---------------------------------------------------------------------------
// 外部リンクに  target="_blank" と rel=”external” をつける
//---------------------------------------------------------------------------

// オプションその1(つけたい部分はコメントアウトする)
add_filter( 'the_content', 'add_external_content', 12 );   // 本文
//add_filter( 'the_excerpt', 'add_external_content', 12 );   // 抜粋
//add_filter( 'widget_text', 'add_external_content', 12 );   // ウィジェット

function add_external_content( $content ) {
  // オプションその2
  $add_blank  = 1;  // target="_blank" 付ける場合は 1 付けない場合は 0
  $add_nofollow = 1;  // rel="external"  付ける場合は 1 付けない場合は 0

  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;

    // target="_blank" がない場合に付ける
    if( $add_blank && !preg_match( "/.+?targets*?=['|"]?s*?_?blank.+?/i", $link ) ) {
      $replaced = str_replace( ">", " target="_blank">", $replaced );

        // リンクURLが#で始まる場合は target="_blank"をのける
        if( preg_match( "/href=['|"]#/i", $link ) ) {
          $replaced = str_replace( " target="_blank">", ">", $replaced );
        }
    }

    if( !preg_match( "/href=['|"]?s*?${my_url}[^>]+?"/i", $link ) ) {

      // 外部リンクに rel="external" を付ける
      if( $add_nofollow && !preg_match( "/.+?rels*?=['|"]?s*?externals*?/i", $link ) ) {
        $replaced = str_replace( ">", " rel="external">", $replaced );

        // リンクURLが#で始まる場合は rel="external" をのける
        if( preg_match( "/href=['|"]#/i", $link ) ) {
        $replaced = str_replace( " rel="external">", ">", $replaced );
        }
      }

      $content = str_replace( $link, $replaced, $content );

    }
  }
  return $content;
}

簡単な動作確認は行いましたが、正規表現が正しいか不安でいっぱいですw

スポンサード リンク

スポンサード リンク

»関連してそうな記事
タグ: ,