WordPressで、内部リンクがあったら自動的にリンク先のtitleを取得し付与する

SEO対策として内部リンクが大事ということで、このような処理をしたかった。日本語で同じ内容がなかったので、備忘録的に残しておきます。

・記事内に内部リンクがあった場合、自動的にリンク先のタイトルを取得し、hrefにtitle属性を付与する。

基本的にはこちらを参考にしています。

Automatically add title attribute to links in WordPress
https://wordpress.stackexchange.com/questions/19292/automatically-add-title-attribute-to-links-in-wordpress

処理としては、投稿のHTMLを取得→リンク部分(href)を見つけて、URLをチェック→URLが内部リンクであれば、リンク先のタイトルを取得→titleタグをつけてHTMLを返す。function.phpに入れてあげてください。

function auto_add_link_titles( $the_content ) {

//もし内容が何もなかったら何もしない
  if ( empty( $the_content ) ) {
      return $the_content;
  }
//リンクを取得するための変数
  $links = array();

//HTMLを取得
  $html = new DomDocument;
  $html->loadHTML(mb_convert_encoding( $the_content, 'HTML-ENTITIES', 'utf-8') );
  $html->preserveWhiteSpace = false;

  // リンクタグ(aタグ)を取得する
  foreach( $html->getElementsByTagName( 'a' ) as $link ) {

      // もしタイトルが既に入っていたらスキップ
      if ( ! empty( $link->getAttribute( 'title' ) ) ) {
          continue;
      }
      // リンク先が内部リンクだった場合
      $home_url = home_url(); 
  
      if ( strpos($link->getAttribute( 'href' ), $home_url) !== 0 ){
        continue;
      }
      // URLからリンク先のテキストを取得
      $link_title = get_the_title(url_to_postid($link->getAttribute( 'href' )));
     
      // タイトル保存
      if ( $link_title ) {
          $links[$link_title] = $link->getAttribute( 'href' );
      }
   
  // タイトルをつける
  if ( ! empty( $links ) ) {
      foreach ( $links as $text => $link ) {
          if ( $link && $text ) {
              $replace = $link .'" title="'. $text .'"'; 
              $the_content = str_replace( $link .'"', $replace, $the_content ); 
          }

      }
    }
  }
  return $the_content;

}

add_filter( 'the_content', 'auto_add_link_titles' );

最初にloadHTMLで何も処理をせずにHTML取得したところ、見事に文字化けしてしまったのでutf-8に変換する処理を入れています。下記の部分です。

mb_convert_encoding( $the_content, 'HTML-ENTITIES', 'utf-8')

例えばタイトルが取得できなかった時などのエラー処理がもう少し必要かもしれません。実はプラグインでも実装できるみたいですが、今回はこれだけのコードですみそうだったのでこれで。

この記事の内容が役に立ったと思ったら、SNSで記事を共有してもらえると幸いです。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)