【WordPress】投稿者ページのURLを変更する(プラグイン or PHP)

セキュリティ的に影響がある、投稿者ページ(author archive、投稿者アーカイブ)の URL を変更する方法について説明します。デフォルトでは、ログインユーザー名が投稿者ページの URL に使われてしまっています。
はじめに
投稿者ページ(投稿者アーカイブ)をご存じでしょうか?投稿者ごとの記事をまとめたページなのですが、サイト内の投稿者が一人の場合でも、WordPress ではこのページが出力されるような仕様になっています。基本的にはどのテーマも author.php というファイルが含まれていて、このファイルが投稿者ページを生成しています。仮に author.php がなくても、index.php (これは絶対に存在する) というファイルが投稿者ページを生成します。
投稿者ページが生成されるうえでどんなリスクがはらんでいるかというと、それは投稿者ページの URL にあります。デフォルト設定だと、投稿者ページの URL は以下のようになっています。
http://サイト名/author/ユーザー名/
URL に WordPress のログインに用いるユーザー名が使われてしまっています。WordPress のログインにはユーザー名とパスワードが必要ですが、そのうちユーザー名が特定されるということは、ログイン攻撃を受けやすくなるということを意味しています。
投稿者ページへのリンクがサイト内になくても、例えば以下のような URL にアクセスすると、自動的に投稿者ページにリダイレクト(転送)されます。
http://サイト名/?author=1
WordPress 的には、ユーザー名が表示されるのは仕様なので、パスワードを複雑にしてくださいという方針のようですが、やっぱりログインユーザー名が表示されるのはセキュリティ的に良くはないので、以下では投稿者ページの URL を変更する方法について紹介します。
プラグインを使う方法
プラグインを使って、投稿者ページの URL を変更する方法を説明します。
プラグインには「Edit Author Slug」を使用します。「Edit Author Slug」をダウンロードして有効化すると、「ユーザー」→「プロフィール」の欄に、「投稿者スラッグ編集」が現れます。投稿者スラッグを「カスタム設定」にすると、下図の場合だと、投稿者ページの URL が http://サイト名/author/hogehoge-testman/ に変わります。

なお、このプラグインを削除しても、投稿者ページの URL を変えっぱなしで、元に戻してはくれない点ご注意ください。(逆に言うと消しても設定残るので、投稿者ページの URL を設定したらプラグインを削除しちゃっても大丈夫です。)
PHP を使う方法
PHP (functions.php) から、投稿者ページの URL を変更する方法です。
実は、データベースの中にある wp_users テーブルの user_nicename を書き換えると、投稿者スラッグ(投稿者ページの URL の末尾)は書き換えられます。なので、レンタルサーバーの管理画面から phpMyAdimin を開き、user_nicename を書き換えれば、投稿者ページの URL は変更できます。
PHP で user_nicename の書き換えを行うとすると、以下のようになります。
$wpdb->update($wpdb->users, ['user_nicename' => $user_slug], ['ID' => $user_id], ['%s'], ['%d']);
functions.php に書くなら以下のような感じになります。プロフィールを更新した場合、ユーザーID が 1(管理者)なら user_nicename を書き換える、といった具合です。コピペで動きますが、PHP がわかる方のみ使用してください。
add_action('profile_update', 'change_user_url', 10, 2);
function change_user_url($user_id, $old_user_data){
global $wpdb;
if($user_id == 1){
$user_slug = '新しい投稿者スラッグ(投稿者ページの URL の末尾)';
$wpdb->update($wpdb->users, ['user_nicename' => $user_slug], ['ID' => $user_id], ['%s'], ['%d']);
}
}
あとよく見るのは、http://サイト名/?author=1 等といった URL を入力されたら、トップ画面にリダイレクトする、といった方式ですね。とりあえず投稿者ページの URL を見せない、といった目的は満たせると思います。
add_action('init', 'add_author_archive_rule');
function add_author_archive_rule(){
// author=? で検索したら、Home ページへリダイレクトする
if(preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])){
wp_safe_redirect(esc_url(home_url()));
exit;
}
// wp/v2/users で検索したら、Home ページへリダイレクトする
if(preg_match('/wp\/v2\/users/i', $_SERVER['REQUEST_URI']) || preg_match('/wp\/v2\/users/i', $_SERVER['QUERY_STRING'])){
wp_safe_redirect(esc_url(home_url()));
exit;
}
}
当サイトは自作テーマを使用しているので、上記のどちらも実装しています。特に前者の user_nicename の書き換えは、プロフィール画面から行えるようにしています。後者は必ずしも必要ないのですが、何となく残している感じです。
おわりに
投稿者ページ(投稿者アーカイブ)の URL を変更する方法について説明してきました。セキュリティ的には URL を変更しておくに越したことはないですが、いずれユーザー名はばれる可能性があるので、結局のところ強固なパスワードを設定しておくのが一番重要だと思います。
少し宣伝
当サイトは WordPress 自作テーマを用いた海外旅ブログまとめサイトとなっています。トップページに地図がありますが、地名を押すと画像が開き、画像を押すと関連記事一覧(クリック数順)が開きます。記事数が多い国ほど赤く、地名もその国で記事が多い都市の文字が大きくなるようにしています。ぜひ覗いてみてください。
当サイトで海外旅ブログを執筆することも可能です(もちろん無料です)! また既にブログをお持ちの方も、当サイトからリンクを貼ることができるようになっています。パントレ開発部までお気軽にお問い合わせください。
このページが皆様のサイト運営の一助となりますことをお祈りいたします
パントレ開発部