WordPressの投稿者アーカイブと WP REST API の`users`を隠す

デフォルト状態のWordPressだと未ログイン状態でもユーザ名を知る方法がいくつかあります。
  • 投稿者アーカイブ
    • サイトURL/?author=Nにアクセスする(IDがNに該当するユーザが存在する場合はそのユーザの投稿者アーカイブにリダイレクトされる)
  • WP REST API
    • サイトURL/wp-json/wp/v2/usersサイトURL/?rest_route=/wp/v2/usersにアクセスすると、ユーザ情報のJSONがレスポンスとして返却される
複数人で運営するブログやメディアサイトの場合は投稿者アーカイブは有用ですし、プラグインでユーザ情報を使って処理を行ったりする場合に WP REST API のユーザ情報を使用するケースもありますので、この事象自体が悪いわけではありません。 ただし、通常のコーポレートサイトのような特にユーザ情報を必要としないケースでは、セキュリティを高めるためにユーザ名を隠匿したいというケースもあるかと思います。 そうしたケースについていくつかの記事をググってメモしておきます。

投稿者アーカイブ

シンプルなコードとしては以下をfunctions.phpに記述するというもの。
add_filter( 'author_rewrite_rules', '__return_empty_array' );
※記述後は管理画面の「設定」→「パーマリンク設定」を開き、で何も変更せずに「変更を保存」をクリックして変更の反映を行います。
※このコードでは投稿者アーカイブは404ページになるものの、URLは投稿者アーカイブにリダイレクトされてしまうのでURLも変更したい場合は他の対策が必要です。
function disable_author_archive() {
    if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
        wp_redirect( home_url('/404.php') );
        exit;
    }
}
add_action( 'init', 'disable_author_archive' );
こちらはGETパラメータまたはURLにauthorが含まれている場合に404ページにリダイレクトするもの。こちらであればURL自体404ページへのリダイレクトなのでURLも隠匿できますね。

WP REST API

function l_ile_mysterieuse( $result, $wp_rest_server, $request ) {
    // oembed, Contact Form 7, Akismet の3つは許可
    $permitted_routes = [ 'oembed', 'contact-form-7', 'akismet'];
    $route = $request->get_route();
    foreach ( $permitted_routes as $r ) {
        if ( strpos( $route, "/$r/" ) === 0 ) {
            return $result;
        }
    }
    // ユーザーが投稿やページの編集が可能な場合にブロックエディタを許可
    if ( current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' )) {
        return $result;
    }
    return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'l_ile_mysterieuse', 10, 3 );
こちらのケースでは、
  • 管理画面の機能が WP REST API に依存しているため完全無効化は推奨されていない
  • Contact Form 7 など、一部プラグインで使用しているケースがある
ということで、これらのケースを除いて WP REST API を無効化する、という形になっていますね。 最後に、以上の情報をまとめて自分用のプラグインの形にしました。 ご参考までに。

参考

両方への言及

投稿者アーカイブ

WP REST API

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。