皆さんはWordpressのSEO設定の際、どのプラグインを使用していますか?

私は「YoastSEO(WordpressSEO)」を使用しています。

何かと便利なんですよねYoastSEO。

今回はそんなYoastSEOを導入した際にfunctionsに必ず入れる2つのことをご紹介します。

# この記事で解決すること

  • archiveの2ページ目以降を検索結果に反映させない
  • メインタクソノミー取得の関数化

前提

functions.phpに書くので、FTPに入れない方や、functions.phpないしcustom_functions.phpを触れない方にはできません。

また、メインタクソノミーを取得しなくても良い方や、archiveの2ページ目以降もindexさせたい方にとってはゴミ記事です。

編集ファイル

  • theme_name
    • functions.php

archiveの2ページ目以降を検索結果に反映させない

いつの頃からだろう。

YoastSEOからこの設定が抜けたのは。。。

ということで、昔は2ページ目以降を反映させるか否かの設定があったYoastSEOですが、いつの間にかなくなっているので実装してみましょう。

functions.php

add_filter( 'wpseo_robots', 'robots_paged_noindex' );
function robots_paged_noindex($link) {
  if (is_paged()) {
    return "noindex,follow";
  } else {
    return $link;
  }
}

wpseo_robotsに対してフィルターフックをかけています。

is_paged(…/page/x/)の時はnoindexfollowを、それ以外の時はよしなにしてねという内容です。

nofollowにすると2ページ目以降にあるリンクすら辿ってくれなくなるのでfollowにしておきましょう。

メインタクソノミー取得の関数化

YoastSEOのいいところベスト3に入るであろうメインタクソノミーですが、取得が面倒なので関数化してしまいましょうということです。

メインタクソノミー自体は、テーマを作ったり、カスタマイズしたりしない限り取得することもないのですが、私はテーマを作るタイプの人間ですので、すごく使います。

メインタクソノミーってそもそも何?

メインタクソノミーは【管理画面->YoastSEO->検索での見え方->コンテンツタイプ】の「ポストタイプのSEO設定を表示」をオンにした場合に出てくるメインとなるタクソノミーの選択機能となります。

ちなみに先日「ポストタイプのSEO設定を表示」をオフにしていたため、メインタクソノミーが出て来ず、1時間ぐらい無駄時間を過ごしました。

関数を書く

では、書いていきましょう。

functions.php

function get_main_category($ID, $taxonomy_name = 'category' ) {
  
  // 記事などにタクソノミーが設定されていない場合
  if(!get_the_terms( $ID, $taxonomy_name )) {
    return false;
  
  // 記事などのタクソノミーが1つだけ設定されている場合
  } elseif( count(get_the_terms( $ID, $taxonomy_name )) == 1 ) {
    return get_the_terms( $ID, $taxonomy_name )[0];
  
  // 記事などのタクソノミーが複数設定されている場合  
  } elseif ( count(get_the_terms( $ID, $taxonomy_name )) != 0 ) {

    // WPSEO_Primary_Termがclassに存在する場合(機能がオンの場合)
    if (class_exists('WPSEO_Primary_Term')) {
      
      // メインタクソノミーObjectを変数に代入
      $primary_term_object = new WPSEO_Primary_Term($taxonomy_name, $ID);
      
      // メインタクソノミーObjectからメインタクソノミーが取得できる場合
      if($primary_term_object->get_primary_term()){

        // メインタクソノミーを取得してreturn
        $primary_term = $primary_term_object->get_primary_term();
        $term = get_term($primary_term);
        return $term;
  
      // 一括編集の場合はメインタクソノミーが設定されないので、設定し忘れたときのために対処
      } else {
        return get_the_terms( $ID, $taxonomy_name )[0];
      }
    }
  
  } else {
    return false;
  }
}

1行目の$taxonomy_name = 'category'は、カスタムタクソノミーでもない限り、カテゴリーしか使わず、毎回categoryを書くのが面倒なので初期値に設定しています。

9行目に関しては、無駄な処理をなくしたいので書いてます。

30行目は、投稿の一括編集でカテゴリーなどのタクソノミーを操作すると、メインタクソノミーが設定されず保存されてしまいます。
そのため、「タクソノミーは複数設定されている」が「メインがない」という、どの条件分岐にも当てはまらない事態に陥ります。
ですので、一括編集時にメインを設定し忘れた時用に用意してあります。

実際に使用する

使用する際はこんな感じです。

<?php
  // categoryの場合
  get_main_category($post->ID);

  // カスタムタクソノミー(hoge)の場合
  get_main_category($post->ID, 'hoge');
?>

返り値はget_termと同一ですので、詳しくはリファレンスを御覧ください。

最後に

YoastSEOに限らず、TinyMCEなどのプラグインを使用する際に、毎度同じ機能を実装する場合があります。

その時はfunctionを溜め込んでおくと、それだけで1案件につき1時間ぐらいは無駄な時間を削り取ってくれるのではないでしょうか。

上記はfunctions.phpに書く想定で話しましたが、私は案件に使用する固有のfunction以外は全て一つのフォルダにまとめて読み込むようにしています。

またそのあたりも記事にしますね。

では、よいWPライフを!