パーマリンクを後から変更してリダイレクトする方法

Wordpress

運営開始から4年、70記事あるこのブログのパーマリンク構造を、今更ですが変更しました。変更した理由と、作業内容の記録です。アクセス数がどのように影響するのかも今後観察していき追記していく予定です。

どうして今更になってパーマリンクを変えたんですか?

シップ
シップ

アナリティクスで見たときに、これまでの数字が使われたパーマリンクだと、何の記事かが分からなくて不便だったからです。

今回、「数字ベース」のパーマリンク構造から「投稿名」のパーマリンクに変更しました。

変更前のパーマリンク

数字ベース
https://blog.shipweb.jp/archives/998

変更後のパーマリンク

投稿名
https://blog.shipweb.jp/change-permalink-redirect/

変更した理由は、URLを見ただけでは何の記事か分からないのが不便だったからです。

アナリティクスを見てもトップが何のページかわからない・・・

SEO的には数字ベースでも問題ないとされていて、実際アクセスもある状態でした。変更することでアクセス減になるリスクのほうが大きいので、最初に適切に設定した後は、変更はしないほうが良いのは言うまでもありません。私の場合は不便さのほうが大きかったため、今回思い切ってパーマリンク変更に踏み切りました。

私はブログ開設当初にあまり深く考えずに最初に数字にしてしまい、後から後悔することになってしまいましたので、皆さんはサイトを運営し始めるときにパーマリンク設定はよく考えて設定してください。

作業内容
  • パーマリンク設定の変更
  • リダイレクト設定
  • 内部リンクの変更

パーマリンク設定の変更

WordPressのパーマリンク設定より、「投稿名」に変更するだけです。

リダイレクト設定

旧URLにアクセスがあった場合に、リンク切れになってしまうため、すでに存在する全ての記事に対して、旧URLから新URLへリダイレクトさせる必要があります。

プラグインで設定する方法と、.htaccessで設定する方法がありますが、WordPressを介さず負荷が小さい.htaccessのリダイレクトを用いました。

旧URL→https://blog.shipweb.jp/archives/998
新URL→https://blog.shipweb.jp/change-permalink-redirect/

上記のようなリダイレクトを実現させる場合、次のようなリライトルールを記述します。

RewriteRule ^archives/998(.*)$ /change-permalink-redirect/ [NE,R=301,L]

これを既存の記事分作成するのですが、70記事もあると骨なので、簡単なPHPスクリプトを組んで出力させるようにしました。

<?php
define( 'WP_USE_THEMES', true );

require __DIR__ . '/wp-load.php';

function generate_rewrite_rules() {
    $args = array(
        'posts_per_page' => -1,
        'post_type' => 'post',
        'post_status' => 'publish'
    );
    $posts = get_posts($args);

    echo "<textarea rows=50 cols=100>";
    echo "<IfModule mod_rewrite.c>\nRewriteEngine On\n";
    foreach ($posts as $post) {
        $post_id = $post->ID;
        $post_slug = $post->post_name;
        $post_slug1 = str_replace('%', '\x', $post_slug);
        $post_slug2 = str_replace('%', '\%', $post_slug);
        //echo "archives/{$post_id},{$post_slug2}/\n";
        echo "RewriteRule ^archives/{$post_id}(.*)$ /{$post_slug2}/ [NE,R=301,L]\n";
    }
    echo "</IfModule>";
    echo "</textarea>";
}

generate_rewrite_rules();

このスクリプトをrewrite.phpというファイル名で、ルートディレクトリにアップロードして、https://WordPressのURL/rewrite.phpへアクセスするとテキストボックス内にリライトルールが出力されます。それをコピーして、WordPressのルートディレクトリにある.htaccessの# BEGIN WordPressという行の前に追加することでリダイレクトが行われるようになります。

最終的に.htaccessはこのようになります。(これ以外にも他プラグインの設定が入っている場合があるのでそれらは上書きしないようにしてください)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^archives/967(.*)$ /macos-python-install/ [NE,R=301,L]
# 中略・・・
RewriteRule ^archives/1(.*)$ /hello-world/ [NE,R=301,L]
</IfModule>

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

内部リンクの変更

次に、サイト内の別記事へのリンクを新しいURLに書き換えます。そのままでもリダイレクトは行われるので実害はないのですが、そのままですとずっと変わらないため、せめて自分のサイトだけでもリンクを更新しておきます。

今回はSearch & Replaceというプラグインを使用しました。CSV形式の入力欄にコンマ区切りで置換前と置換後を入力すれば、複数一気に置換が出来るかと思ったのですが、実際には出来なかったため、一つずつ行うことにしました。もし一気に複数行の置換ができる方法があればコメントで教えてください。

それほど内部リンクは多くないことがわかっていたので、一つずつでもそれほど大変ではありませんでした。まず、内部リンクされている記事URLを知るために、「archives/」という文字列で検索し、IDをリストアップします。

次に、リストアップした記事の分だけ、URLの置換を行います。置換前と置換後をカンマで区切り、CSV Format Search/Replace:の欄へ入力します。

例)
archives/998,change-permalink-redirect/

Select tables欄はwp_postsを選択し、Dry Runのチェックを外し、Save changes to Databaseにチェックをして「Do Search & Replace」をクリックします。

最初は「Dry Run」にチェックを入れて実際にデータベースを書き換えない設定で実行しましょう。問題がなさそうであれば、チェックを外して実際に書き換えを行ってください。

SEOへの影響

まだ変更したばかりでアクセスへの影響は未知数ですので、推移を見守っていきたいと思います。調べてみると、変更した直後はやはりアクセスが激減し、その後数週間で戻るということですが、実際にどうなるのか検証してみてまた追記します。

この記事を書いた人

PHPが好物な個人開発プログラマ。フリーランスエンジニアとしてWebサービス作ったりしてます。15年の経験を生かしてMENTAでメンターもやってます。WordPressやPHPでお困りのことがあればご相談に乗りますのでDMください。

Follow on SNS
Wordpress
SOHO MIND

Comments

タイトルとURLをコピーしました