ライブドアからWordPressへ移行、投稿IDの自動リダイレクト設定方法

2016年1月3日

「ライブドアからWordPressに移行したいけどURLの引き継ぎが大変そう」

ブログ移転時に気になるのは、それまでに積み重ねてきた記事の引き継ぎ(リダイレクト)です。せっかく移転するのだから、それまでの記事を見てくれていた人にも新しく移転した先で記事を見て欲しいですよね。

今回は”ライブドアブログ(livedoor Blog)”から”WordPress”へ移転した際の、投稿IDによるリダイレクト設定を紹介します。

  • 本記事では独自ドメインを所有していることを前提としています。
  • 画像データのインポートについては触れません。
  • パーマリンク設定を「%postname%」ではなく「%post_id%」で行っていきます。

これまでの記事データをWordPressへインポートする

まずはライブドアブログにて書き溜めてきたこれまでの記事データを、WordPressへ移行するためにバックアップ機能を使ってローカル環境へダウンロードします。

手順
ライブドアブログ管理画面 > ブログ設定 > バックアップ > ブログのデータを書き出す

記事データを保存することができたら、次にそのデータをWordPressへとインポートします。

手順
WordPress管理画面 > ツール > インポート > Movable Type と TypePad

WordPressへの記事データのインポートが終了したら、WordPressの投稿一覧から正常にインポートが完了しているかを確認しましょう。投稿一覧にこれまでのキジたちが表示されていれば正常です。

パーマリンク設定の違い

ライブドアブログではカスタムURL機能を利用していない限り、記事のURLは「http://example.com/archives/1234567.html」といった形式で設定されています。

それに対してWordPressでは「http://example.com/?p=1234567」といった形式がデフォルト設定となっています。WordPressではこの1234567という数字の羅列は”post_id”と呼ばれる一意の文字列で管理されています。

当然、記事へアクセスするためのURL構造が変わっているため、従来のライブドアブログ時代のURLへアクセスした場合、目当ての記事へアクセスすることはできません。目当ての記事が見つからなかったことを示す404エラーが表示されてしまいます。

インポート記事のスラッグ情報

従来URLへアクセスした場合に404エラーが表示されるということは、言い換えてしまえば404エラーが表示された際に従来URLに対応する新URLへと転送(リダイレクト)を行うことで、ユーザー側からは自然に新URLへと誘導されることになります。

投稿一覧ページからインポートした記事のスラッグを確認してみてください。

eyecatch-redirectToWordpress2

通常WordPressではスラッグには記事タイトルが自動設定されていきますが、ライブドアブログからインポートした記事についてはスラッグは「/archives/1234567.html」における数字部分が挿入されています。今回はこのスラッグを利用してリダイレクト設定を行っていきます。

従来URLから新URLへのリダイレクト設定

WordPressでは指定されたURLが見つからなかった場合には”404.php”を優先して表示する特徴があります。ライブドアブログでは無かった機能ですね。この機能を使うことで404エラー発生時にページ遷移の処理を場合分けすることができます。

従来URLであれば新URLへ転送し、従来URLで無ければ(本当に無関係なURLであれば)404エラーである旨を表示しましょう。具体的には404.phpに従来URLへのアクセスかどうかを判断する処理を追加します。

404.phpを編集

従来URLへのアクセスかどうかを判断する処理は、以下のコードを404.phpの一行目に挿入することで実装できます。

<?php
$mystring = $_SERVER["REQUEST_URI"]; // 現在のURL
$url = home_url(); //else分岐で利用しない場合は消してよい
 
// 旧URLチェック
if (strpos($mystring, ".html") !== FALSE){
  // 旧URLの場合
  $temp = substr($mystring, strrpos($mystring, "/") + 1); // postname(スラッグ名).html
  $temp = str_replace(".html","", $temp); // .htmlを削除
  $id = get_page_by_path($temp, OBJECT, 'post')->ID; // page_idを取得
  $url = get_permalink($id); // 新URL
  header("HTTP/1.1 301 Moved Permanently"); 
  header("Location: ".$url);
}
?>

コードの解説

紹介したコードのポイントとなる動作について、簡単な解説を行います。

細かい原理が気にならず、とりあえず動けばいいという方は読み飛ばして問題ありません。

$mystring = $_SERVER["REQUEST_URI"];

変数$mystring にリクエストURI、つまりアクセスしようとしたURLの文字列を代入しています。今後はこの変数に対して分解処理を行い、従来URLと一致するかどうかを調べます。

$url = home_url();

WordPressに実装されているテンプレートタグhome url() を利用して、ホームURLを変数$url に代入しています。この変数は転送先のURLとして利用し、初期値としてホームURLを設定しています。

if (strpos($mystring, ".html") !== FALSE){

指定した文字列が最初に現れる場所を返す関数strpos を利用し、「.html」という文字列が$mystring に含まれているかを判定しています。含まれていればif文内の処理を実行し、含まれていなければ何も処理を実行しません。

$temp = substr($mystring, strrpos($mystring, "/") + 1);

旧URLへのアクセスであることが判明しているため、変数$mystring には「http://example.com/archives/1234567.html」のような文字列が代入されていると想定します。

変数$temp に関数strrpos を用いて、$mystring 中で最後に「/」が現れる位置から最終文字までを切り出して代入しています。このとき変数$temp には「1234567.html」が代入されていると想定しています。

$temp = str_replace(".html","", $temp);

指定した文字列を置換する関数str_replace を用いて、変数$temp から「.html」を取り除きます。

$id = get_page_by_path($temp, OBJECT, 'post')->ID;

WordPressに実装されているテンプレートタグget page by path を用いて、スラッグから一意の投稿オブジェクト、この場合は新URLの記事を受け取ります。受け取った投稿オブジェクトからIDのみを変数$id に代入しています。

$url = get_permalink($id); // 新URL
header("HTTP/1.1 301 Moved Permanently"); 
header("Location: ".$url);

投稿IDから一意のパーマリンクを出力するWordPressのテンプレートタグget_permalinkを用いて、変数$urlに転送したい先のURLを代入します。

そしてヘッダー情報に「301 Moved Permanently」(内容の恒久的な移動)を送出するのと同時に、新URLへと転送します。

終わりに

以上で存在しないURLへアクセスされた場合に、新URLへと自動で転送することができます。自分がWordPressへ移転した際にはパーマリンク設定を「/archives/%postname%.html」と変更する方法しか、URLの引き継ぎ方法が見つからなかったため少し苦労しました。

パーマリンク設定の変更のみで対応する方法が一番手間はかからないのですが、今後新規に記事を作成するたびに「postname」という一意の名前を考えなければならなくなってしまうため、少し手間なのが難点でした。

今回紹介した方法では”.htaccess”といった扱いの難しいファイルを編集する必要もありません。もしこの方法が気に入ってもらえて参考になれば幸いです。