現在ログインしているユーザーにページを表示するための適切なクリアランスがない場合に404ページを表示する方法はありますか?私は次のようなPHPメソッドを探しています
if( !current_user_can('administrator') ) { show_404(); exit(); }
リダイレクトを使用することを考えましたが、URLは同じままにしたいと思います。
現在ログインしているユーザーにページを表示するための適切なクリアランスがない場合に404ページを表示する方法はありますか?私は次のようなPHPメソッドを探しています
if( !current_user_can('administrator') ) { show_404(); exit(); }
リダイレクトを使用することを考えましたが、URLは同じままにしたいと思います。
回答:
ヘッダーで次のコードを使用すると、404エラーを表示できました。
<?php
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
?>
分解するに
$wp_query->set_404()
は::これが404であることをwp_queryに伝え、これによりタイトルが変更されます:
status_header()
HTTP 404ヘッダーを送信します
get_template_part()
:404テンプレートを表示します
http_status_code(404);
、テンプレートを設定する前に使用して、ヘッダーが正しいことを確認します(ワードプレスstatus_header( 404 );
機能よりもかなり高速です)。ページランクに関心がある場合Disallow
は、robots.txtにルールを入れて、それがパブリックリソースではないことを示す必要もあります。
エラーメッセージを表示するページを作成してから、そのページにユーザーをリダイレクトしないのはなぜですか?これを実現する簡単な方法を次に示します。
404.php
ファイルを開き、次の行をファイルの先頭に追加します。
/**
* Template Name: 404 Page
*/
404 Page
テンプレートを使用してページを作成します。次に、ユーザーをリダイレクトします。
if ( !current_user_can('administrator') ) {
$404_page = get_permalink( $404_page_id );
wp_redirect( $404_page );
exit();
}
404リクエストにページを使用する理由は、WP 404ページは実際には存在しないページであるため、WPは404ページを返す前にすべてのコンテンツを検索する必要があり、その作業はリソースの無駄です。ブログをより速く実行するのに役立つ可能性のある、事前に構成されたページを使用します。
http_response_code(404); exit();
。ページが必要な場合は、get_template_part( 404 );
終了前に使用します。これは、ワードプレスの機能よりもはるかに高速です。
このコードを、実際に使用されるテーマディレクトリ(wp-content / themes /..../ 404.php)のファイル404.phpに書き込むことができます。
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>
このコードは、ファイルの先頭から開始する必要があります(前に文字はありません)。
オリジナルへのリンク:404ページをWordPressのホームページにリダイレクトする方法
Location: xxx
クローラーに実際に有効なリソースがあることを伝える301ヘッダーを設定し、存在しないと判断した場合はランキングを強制終了します。
ユーザーの役割に基づいてユーザーにauthor.phpページへのアクセスを許可しないという同様の要件がありました。実際のページが読み込まれる前でも、template_redirectアクションを登録してチェックを行い、404ページにリダイレクトします。
登録:
add_action( 'template_redirect', [ $this, 'handle_inactive_users']);
ハンドラ:
public function handle_inactive_users() {
global $wp_query;
if ( $wp_query->is_author() ) {
$user = $wp_query->get_queried_object();
if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
}
}
}
テンプレートパーツの途中で次のコードスニペットのみを使用することを選択した場合、ページはすでに部分的にレンダリングされている可能性があり、実際には404ページにリダイレクトされません。template_redirect
アクションでそれを行う方が良い-
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();