WordPressの標準仕様では、作者が書いた投稿の一覧ページを表示すると、URLが「サイトURL/author/ユーザー名」となり、サイトログイン時のユーザー名が案外簡単に丸裸になっているのをご存じでしょうか?

素人の方ならたまたま作者一覧を開いて「あれ?これってユーザー名じゃん」と気づく方もいると思いますが、WordPressで少しでもコードカスタマイズやセキュリティに興味を持った方なら、この不都合は周知の事実で、ログインセキュリティ対策の肝とも言えます。

このあからさまになっているURLのユーザー名の部分を日本語での正式名称では「作者スラグ」と言います。

この「作者スラグ」を任意の文字列に変更する有名なプラグインに、Edit Author Slugというのがあり、このプラグインは、複数のユーザーが自由に登録できるようなサイトで、ノーメンテナンスで作者スラグを設定法則に則って変更してくれるところが秀逸なのですが、個人で運営するサイトや、登録ユーザーが決まっているサイトではわざわざこのプラグインに頼らなくても、作者スラグの変更ができます。

今回はWordPressのログインセキュリティ対策の1つとして、プラグインなしで作者スラグを作者プロフィールから変更させる機能を持たせる方法を紹介します。

このカスタマイズを行うには、テーマのfunctions.phpへの追記が必要です。スキルが不安な方は、前述したプラグインの使用をおすすめします

なお、この機能は私が制作していたクラシックテーマ【HABONE】に実装されている機能を流用して、TT2他のテーマでも動作するようにしたです。

本サイトで使用しているTT2(Twenty Twenty-Two)テーマでの動作確認はしていますが、中には正常に動作しない場合もありますのでご了承の上、コードを使用ください。

プラグインなしで作者スラグを変更可能にする方法

きちんと動作するかの確認も兼ねて、現状の作者の投稿一覧ページを開いておきましょう。URLは

サイトのトップページURL/author/ユーザー名

です。上記のURLを自身のサイトURLとユーザー名に変えて表示されることを確認しておいてください。

最終的に作者スラグ変更によってこのページがサイト内に見つからない「404ページ」ようになりますので、一旦開いたままにしておくといいでしょう

作者の投稿一覧ページが表示されるのを確認したら、管理画面から、以下のコードを、テーマのfunctions.phpへ追加します。

/***** 作者スラグの任意変更 *****/
/* 管理者権限を持つユーザーだけが変更できるようにする */
if (current_user_can('manage_options')) {
/* ユーザープロフィール画面へ処理を追加 */
if ( !function_exists( 'sample_author_slug_edit_ob_start' ) ){
function sample_author_slug_edit_ob_start() {
	ob_start();
}
}
add_action( 'personal_options', 'sample_author_slug_edit_ob_start' );

/* ユーザープロフィールに項目を表示 */
if ( !function_exists( 'sample_insert_author_slug_input' ) ){
function sample_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__( 'ユーザースラグ(オプション)','' ),
		esc_attr( $user->user_nicename ),
		esc_html__( '作者の投稿一覧などでURLに表示されるユーザー名を任意の文字列へ変更できます。半角英数字と「-」「_」が使用できます。','')
	);
	echo preg_replace( $regex, '\0' . $nicename_row, $content );
}
}
add_action( 'show_user_profile', 'sample_insert_author_slug_input' );
add_action( 'edit_user_profile', 'sample_insert_author_slug_input' );

/* 入力したユーザースラグへ書き換える */
if ( !function_exists( 'sample_author_slug_profile_update' ) ){
function sample_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', 'sample_author_slug_profile_update', 10, 3 );
}

コードの追加が終わったら、ユーザープロフィール画面(「ユーザー」→「プロフィール」)を開いてください。

以下のような項目がプロフィール画面に追加されています。

【TT2】作者スラグを任意の文字列へ変更できるようにする方法(プラグインなし)|Twenty Twenty-Two (TT2)のカスタマイズ情報

未設定の状態では「ユーザースラグ」欄は、ユーザー名がそのまま入っていますので、別の文字列(半角英数字と「-」「_」が使えます)に変え、更新してください。

先ほど開いておいた、作者の投稿一覧ページを開いてみて、以下のような404ページが表示されるのを確認してください(サイトやテーマによってページの内容は異なります)。

【TT2】作者スラグを任意の文字列へ変更できるようにする方法(プラグインなし)|Twenty Twenty-Two (TT2)のカスタマイズ情報

次に、先ほど入力した作者スラグを使ってページを開いてみてください。

サイトのトップページURL/author/ユーザースラグに入力した文字列

正常に表示されれば、機能の追加は完了です。

コードの簡単な説明

このコードはHow to Change Author URL Slug and Base with or without Pluginで掲載されているコードを参考にしています。

上から順に以下のようなプログラムの組み合わせでできています。

  1. ユーザースラグを変更できる権限を管理ユーザーのみにする
  2. プロフィール欄へ「ユーザースラグ」項目を追加する
  3. 入力された文字列を作者スラグとして保存する

以上、プラグインを使わなくてもできる、作者スラグを任意に変更する方法でした。

ちなみに、この措置をした後で、「Ultimate Login History, Last Login(旧WordPress Login History)」など、ログインの履歴を記録してくれるプラグインを使ってログを取ると、ユーザー名でログインしようとした形跡がいっぱい出てきて、いかにこの作者スラグでユーザー名がバレているのかが一目瞭然になって、ちょっとびっくりします(笑)。

冒頭で紹介したように、不特定のユーザーが登録するような会員制サイトなどでは、本ページの方法はメンテナンス性に欠けるのでプラグインを使った方がいいですし、そもそもユーザー名でのログインをやめたいと考える方は、以下のページを参考に、メールアドレスとパスワードでのログインに限定するとよいでしょう。

サイトへのログインをメールアドレスに限定する方法

もちろん、本ページの作者スラグ変更と併用することもできますしね。