コンテンツへスキップ

WordPress: noindexあれこれ

今回はロボットメタタグをプラグイン無しで実装する方法を調べてみました。

参考にしたコードと、チャットで作ったコードです。執筆時点でテスト環境、自分のブログ、このサイトで使用しています。

□執筆時点
WP 6.4.3
テーマ デフォルトテーマ Twenty Twenty-Four

実装したかった事として、noindexを出力するのが、カテゴリー、アーカイブ、投稿者、検索結果、404。投稿タグは使わないのでタグページは必要ないかと。あと、投稿ごとにnoindexにするかをカスタムフィールドで設定できること。

書くページにnoindex

まず、ページでnoindexを指定する方法を複数試しましたが、次の参考ページが自分の環境では合っていたので利用させていただきました。

参考ページ;[WordPress] 特定のページでnoindexを出力する方法 | Takemi Blog


// 特定ページでnoindexを出力
add_filter( 'wp_robots', function( array $robots ) {
  if ( is_archive() || is_paged() || is_attachment() || is_date() || is_author() || is_search() || is_404() || is_page( array('') ) ) {
    $robots['noindex'] = true;
    $robots['follow']  = true;
        remove_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
  }

  return $robots;
}, 2 );

まず、トップページは noindex でなくてもいいので「is_home()」を削除して、固定ページも今のところ noindex でなくていいので、「is_page( array(”)」の「”」の中を削除、そして、自分の環境ではデフォルトで出力される?max_image_preview_largeを出力させないように「 remove_filter( ‘wp_robots’, ‘wp_robots_max_image_preview_large’ );」を追加。

これで、トップページ、投稿ページ、固定ページ以外は noindex になるように設定できました。次はカスタムフィールドで投稿ページごとに noindex を設定する方法です。

投稿ごとにnoindex

まず、下記のコードを functions.php に追加する。次に、投稿作成ページでカスタムフィールドを追加。

カスタムフィールド名; noindex
値; 「オン」の時は noindex を出力する、カスタムフィールドを設定していない時は max_image_preview_large が出力される。


// カスタムフィールドでnoindexを選択
function custom_noindex_page() {
    if (is_home()) {
        // is_home の場合はカスタムフィールドの設定を無視する
        return;
    }
    
    // ページのカスタムフィールドから値を取得
    $noindex_value = get_post_meta(get_the_ID(), 'noindex', true);

    if ($noindex_value === 'オン') {
        // noindex フィールドがオンの場合は add_filter
        add_filter('wp_robots', 'wp_robots_no_robots');
        remove_filter('wp_robots', 'wp_robots_max_image_preview_large');
    } else {
        // noindex フィールドがオフの場合は remove_filter
        remove_filter('wp_robots', 'wp_robots_no_robots');
        add_filter('wp_robots', 'wp_robots_max_image_preview_large');
    }
}

add_action('wp', 'custom_noindex_page');

参考ページ;WordPressでnoindexを設定する方法(functions.phpからの設定) | push.tokyo

色々なコードを試しましたが、ロボットタグが2個出力されたりとなかなかうまくいかず、参考ページのコードをチャットに投げつけて、既存のコードと合体させたらうまく実装できたので採用
「 remove_filter(‘wp_robots’, ‘wp_robots_no_robots’);が良かったのかな。分からないままだけど結果良し。

そして、ここで noindex に設定した投稿が最新の投稿としてブログの1番上にあると、トップページが noindex になってしまう現象が起きたので、トップページ(is_home)では、このカスタムフィールドを無視するように修正してもらいました。チャット君ありがとう。

というわけで、トップページ、投稿ページ、固定ページに加え、カスタムフィールドで「オン」にした投稿のみ noindex になるように設定できました。

フィードにもnoindex

最後に、Googleサーチコンソールに フィードをindex させないようにする方法があったので functions.php に追加してみた。


// X-Robots-Tagを利用して feed に noindex を付与する
add_action('template_redirect', function(){
    if ( is_feed() && headers_sent() === false ) {
        header( 'X-Robots-Tag: noindex, follow', true );
    }
});

以上です。お疲れ様でした(^^)

注意

この記事で記述されているコードは執筆時点での話です。 テストサイトで試してはいますが、それぞれ環境が異なりますので変更を加える前に、 確実にバックアップを取得し、変更がサイトの動作に与える影響を十分にテストしてください。 あまり詳しくない方はプラグインを推奨します!自己責任でお願いします!!