WordPressでサイト作りをしていて、少しでもログインセキュリティに関する知識や興味のある方なら誰でもご存じの、ユーザー(著者)ページのスラグ(URLの末尾)やサイトマップ(sitemap.xml)の作者一覧ページのスラグがユーザー名になってしまう問題。
試しに自身のサイトで以下のような形のURLを直接入力するか、ユーザー一覧から表示をクリックして開いてみてください。
サイトのトップページURL/author/ユーザー名
または、以下のURLへアクセスして表示されされるURLの末尾を確認してみてください。
サイトのトップページURL/wp-sitemap-users-1.xml
...何も対策してなければバッチリユーザー名が出てしまってますね。
この「ユーザー名」の部分をスラグというのですが、スラグを自由に変更できる「Edit Author Slug」という有名なプラグインがあります。
でも、ユーザーの増減が激しいサイト(会員制サイトなど)でなければ、ユーザー登録と同時に自動でスラグ変更するというプラグインの機能は必要ないですから、自力で機能追加するのも手だと思います。
そこで、テーマのfunctions.phpへコードを追記することで、ユーザープロフィール編集画面から自由に著者スラグを変更できるコードを紹介します。
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
著者スラグを変更できるようにするコード
何をしているかを先に解説しておきます。コード解析はしていませんが、恐らく先のプラグインでも同じことをしています。
著者スラグは、ユーザー用のデータベーステーブルの中の「user_nicename」という項目にデータが格納されています。
この項目は、ユーザー登録時から何もしなければ、ユーザーID(ユーザー名)と同じものがセットされるため、著者スラグ=ユーザーIDとなってしまうのです。
以下のコードは、ユーザープロフィール画面に「作者スラグ」という項目を追加し、この項目を変更することで著者スラグを自由に変更できるというものです(下図赤枠部分)。

また、気づく方は少ないと思いますが、「Edit Author Slug」プラグインでは、スラグ設定を元に戻して更新してからプラグインの停止・削除をしないと、変更された著者スラグ設定がそのまま残ってしまいます。
そこで下記のコードでは、「作者スラグ」欄を空(空白)にして更新すれば、元のユーザーIDに戻るようにしています。
以下はこのような動きをさせるためのコードです。有効化しているテーマのfunctions.phpへ追記してください。
if (current_user_can('manage_options')) {
function ha_author_slug_edit_ob_start() {
ob_start();
}
add_action( 'personal_options', 'ha_author_slug_edit_ob_start' );
function ha_insert_author_slug_input( $user ) {
$content = ob_get_clean();
$regex = '/<tr(.*)class="(.*)\buser-user-login-wrap\b(.*)"(.*)>([\s\S]*?)<\/tr>/';
$nicename_row = sprintf(
'<tr class="user-user-nicename-wrap"><th><label for="user_nicename">%1$s</label></th><td><input type="text" name="user_nicename" id="user_nicename" value="%2$s" class="regular-text" />' . "\n" . '<span class="description">%3$s</span></td></tr>',
esc_html__( '作者スラグ(Optional)' ),
esc_attr( $user->user_nicename ),
esc_html__( '作者スラグを半角英数字、「-」「_」を使って入力してください' )
);
echo preg_replace( $regex, '\0' . $nicename_row, $content );
}
add_action( 'show_user_profile', 'ha_insert_author_slug_input' );
add_action( 'edit_user_profile', 'ha_insert_author_slug_input' );
function ha_author_slug_profile_update( $errors, $update, $user ) {
if ( !$update ) return;
if ( empty( $_POST['user_nicename'] ) ) {
$user->user_nicename = $_POST['user_login'];
} else {
$user->user_nicename = $_POST['user_nicename'];
}
}
add_action( 'user_profile_update_errors', 'ha_author_slug_profile_update', 10, 3 );
}
たったこれだけのコードで実装できるとは...って感じですけど、これだけです(笑)。
追記が終わったら、実際に「作者スラグ」を変更し、
サイトのトップページURL/author/作者スラグ
で著者の投稿一覧ページが表示されることと、
サイトのトップページURL/author/ユーザー名
で、404エラー(ページなし)が出ることを確認してください。
さらに以下のURLを開いて表示されるURLの末尾が変更した文字列になっているかを確認してください。
サイトのトップページURL/wp-sitemap-users-1.xml
上記のURLはWordPress標準のサイトマップのURLです。プラグインなどでサイトマップを出力している場合はそれ用のURLを開いて確認ください
参考:How to Change Author URL Slug and Base with or without Plugin