ページ目次
検索botに更新日を知らせて効率的なクローリングを目指す
サイトの検索順位を上げるためには、定期的に新しい記事を更新するのも大事ですが、既存記事の編集・調整も大事な作業になります。
しかし、編集して記事を更新しても、それが検索bot(クローラー)に見てもらえないと全く意味がありません。
そこで、クローラーに更新日を分かりやすく伝えられる方法はないか。と、考え、HTTPヘッダー(もしくはMetaタグ)にLast-Modifiedを追加することにしました。
HTTPヘッダー – Last-Modifiedの仕組み
ブラウザは、リクエスト先からLast-Modifiedを一度受け取ると、次回アクセス時にIf-Modified-Sinceをヘッダーに含んで同じリクエスト先にアクセスします。
サーバー側は、ブラウザから送られたIf-Modified-Sinceを見て、コンテンツが更新されていれば、通常のレスポンスを返し、更新されていなければ304レスポンスを返します。304が返ってきたブラウザは前回訪問時に保存したキャッシュを利用してページを表示します。
このようにLast-Modifiedを活用することで通信量減やサイトのレスポンスを高めることにも役立ちます。
HTTPヘッダーにLast-Modified(最終更新日)を追加する
早速、HTTPヘッダーにLast-Modifiedを追加していきます。何もいじっていないヘッダーはこんな感じ。
WordPressでHTTPヘッダーをいじる時は、一般的にwp_headersか、send_headersのフックを用います。
両者の違いは、フィルターフック(wp_headers)で使われるのか、アクションフック(send_headers)で使われるのか、です。
// 例
// send_headersはアクションフック
add_action("send_headers", "add_header_func");
// wp_headersはフィルターフック
add_filter("wp_headers", "add_header_func");
// wp_headersではヘッダ情報の配列を引数で取る
function add_header_func($headers){
$headers["HTTPヘッダ名"] = *****;
return $headers;
}
最終更新日が取得できない
最終更新日を取得するには、WordPressのget_the_modified_time関数を使います。しかし、wp_headersやsend_headersのフックポイントではこの関数は期待通りの働きをせず、最終更新日が取得できません。
get_the_modified_time関数(もしくはget_the_modified_date関数)は本来ループ内での使用を前提とされている関数です。そのため、上記フックポイント(HTTPヘッダーの作成)の段階ではWordPressのメインクエリが読み込まれていないため日付が取得できないのです。
では、どうするのか?
アクションフック「template_redirect」を使う
template_redirectは、WordPressが読み込むべきテンプレートページを決定し、同ページへのリダイレクト直前に実行されるアクションフックです。
WordPress Codex – Plugin API / Action Reference / template redirect
このアクションフックを使って、HTTPヘッダーに値を送信します。
// functions.php
add_action("template_redirect", "add_last_modified");
function add_last_modified(){
if( is_single() ) {
header( sprintf("Last-Modified: %s", get_the_modified_time("r")) );
}
}
これで最終更新日が取得できるようになりました!
日本語で表示されてしまうので
上の例で、「get_the_modified_time(“r”)」としました。これはRFC2822に準拠した日付表示を狙ってのものですが、WordPressでの設定言語が日本語になっていたため、下記のように日本語に変換されて表示されてしまいました。
echo get_the_modified_date("r");
=> 木, 06 4月 2017 10:30:30 +0900
/* 本当はこのように表示してほしい */
=> Thu, 06 Apr 2017 10:30:30 +0900
これを実現するために、一手間加えました。
UNIXタイムスタンプに変換してdate関数をあてる
PHP組み込み関数のdate関数は、設定された言語に関係なく、つねに英数字で日付を返してくれます。
まず、最終更新日を取得し、それをISO8601形式の日付文字列として組み立て、それを元にUNIXタイムスタンプを取得。それをdate関数の引数として渡します。
function get_last_modified_date(){
$date = array(
get_the_modified_time("Y"),
get_the_modified_time("m"),
get_the_modified_time("d")
);
$time = array(
get_the_modified_time("H"),
get_the_modified_time("i"),
get_the_modified_time("s"),
);
$time_str = implode("-", $date) . "T" . implode(":", $time) . "+09:00";
// UNIXタイムスタンプに変換後、日付(RFC2822)を返す
return date( "r", strtotime($time_str) );
}
function add_last_modified(){
if( is_single() ){
header( sprintf( "Last-Modified: %s", get_last_modified_date() ) );
}
}
add_action( "template_redirect", "add_last_modified" );
これでHTTPヘッダを確認してみると、見事Last-Modifiedが追加されています(赤線部分)。
タイムゾーンがGMTになっているのは、php.iniでタイムゾーンが設定されていないか、GMTにセットされているためです。
日本時間に合わせるには、php.iniで”Asia/Tokyo”を指定します。php.iniが編集できない場合は、上述のfunctions.php内でdate_default_timezone_set関数を使用します。
date_default_timezone_set( "Asia/Tokyo" );
ついでにメタタグも追加しておく
メタタグにもLast-Modifiedを追加しておきたいと思います。ここではwp_headフックを使います。
// functions.php
add_action( "wp_head", "add_last_modified_meta" );
function add_last_modified_meta(){
echo '<meta http-equiv="Last-Modified" content="'.
get_last_modified_date().
'">';
}
ちなみにメタタグのLast-Modifiedに関して言えば、プラグインの「Head Cleaner」を使えば、上記コードを追加をしなくても同メタタグの挿入が可能です。
過去記事: WordPressプラグインを「All in One SEO」に変えたのは「Head Cleaner」と「Yoast SEO」の相性がどうもよくないから