/?author=id でアクセスした時の投稿者アーカイブリダイレクトを無効にする

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

?author=1などWordPressサイトのURLの最後に付けてアクセスを行うと投稿者アーカイブページにリダイレクトされます。こちらのリダイレクトを無効にしたい時のカスタマイズ。管理画面と REST API には効かないように、フロントの表示のときだけ(template_redirect で is_author() を見て)止め、トップへ飛ばさず 404 を返します。

functions.php
/*----------------------------------------------------
 /?author=x でアクセスした時のリダイレクトを無効にする
 (フロントの表示だけ。管理画面・REST API には効かない)
----------------------------------------------------*/
if ( !function_exists( 'disable_author_archive_redirect' ) ){
    function disable_author_archive_redirect() {
        // ?author=数字 で開いた投稿者アーカイブだけを 404 にする
        if ( is_author() && isset( $_GET['author'] ) ) {
            global $wp_query;
            $wp_query->set_404();
            status_header( 404 );
            nocache_headers();
        }
    }
    // /archives/author/ユーザー名 へのリダイレクト(redirect_canonical・優先度 10)より先に動かす
    add_action( 'template_redirect', 'disable_author_archive_redirect', 1 );
}

前のコードは init で URL に author= があるとすべてトップへ飛ばしていたため、/wp-json/wp/v2/posts?author=1 のような REST API の呼び出しまで飛ばされ、ブロックエディタなどが動かなくなることがありました。また REST API の /wp-json/wp/v2/users ではユーザー名がそのまま見えます。こちらも隠したいときは、下のコードで、ログインしていないときだけ users の道を外します。

functions.php
/*----------------------------------------------------
 REST API の users(/wp-json/wp/v2/users)を、ログインしていないときだけ外す
----------------------------------------------------*/
if ( !function_exists( 'hide_rest_users_for_guests' ) ){
    function hide_rest_users_for_guests( $endpoints ) {
        // ログイン中はそのまま(ブロックエディタなどが使う)
        if ( is_user_logged_in() ) {
            return $endpoints;
        }
        foreach ( array_keys( $endpoints ) as $route ) {
            if ( strpos( $route, '/wp/v2/users' ) === 0 ) {
                unset( $endpoints[ $route ] );
            }
        }
        return $endpoints;
    }
    add_filter( 'rest_endpoints', 'hide_rest_users_for_guests' );
}

WordPress Developer Resources

関連機能

  1. WordPressテーマディレクトリ名を変更して隠蔽する

  2. WordPress 不正アクセス・攻撃の対象となっているかを簡単に確認する方法

  3. admin_init はログインしていなくても動く:ダッシュボードのウィジェットの保存に、権限と nonce の確かめを足す

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP