Personal WP Customization Notes (PWCN)

WordPressで実際に行ったカスタマイズの記録、発生した問題への対処時のメモ、ブロックテーマのカスタマイズなど

プラグインなしで、ユーザー(著者)ページのスラグを変更する方法

WordPressでサイト作りをしていて、少しでもログインセキュリティに関する知識や興味のある方なら誰でもご存じの、ユーザー(著者)ページのスラグ(URLの末尾)やサイトマップ(sitemap.xml)の作者一覧ページのスラグがユーザー名になってしまう問題。

試しに自身のサイトで以下のような形のURLを直接入力するか、ユーザー一覧から表示をクリックして開いてみてください。

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

または、以下のURLへアクセスして表示されされるURLの末尾を確認してみてください。

サイトのトップページURL/wp-sitemap-users-1.xml

...何も対策してなければバッチリユーザー名が出てしまってますね。

この「ユーザー名」の部分をスラグというのですが、スラグを自由に変更できる「Edit Author Slug」という有名なプラグインがあります。

でも、ユーザーの増減が激しいサイト(会員制サイトなど)でなければ、ユーザー登録と同時に自動でスラグ変更するというプラグインの機能は必要ないですから、自力で機能追加するのも手だと思います。

そこで、テーマのfunctions.phpへコードを追記することで、ユーザープロフィール編集画面から自由に著者スラグを変更できるコードを紹介します。

著者スラグを変更できるようにするコード

何をしているかを先に解説しておきます。コード解析はしていませんが、恐らく先のプラグインでも同じことをしています。

著者スラグは、ユーザー用のデータベーステーブルの中の「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

WordPressサイトのカスタマイズ方法、機能追加を行うプログラム例など
カスタムフィールド入力窓(メタボックス)の作り方、データ保存の仕方、呼び出し方