概要説明
?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' );
}


