制限されたページを404にリダイレクト


21

現在ログインしているユーザーにページを表示するための適切なクリアランスがない場合に404​​ページを表示する方法はありますか?私は次のようなPHPメソッドを探しています

if( !current_user_can('administrator') ) { show_404(); exit(); }

リダイレクトを使用することを考えましたが、URLは同じままにしたいと思います。


存在するページのユーザーへのアクセスを拒否している場合、404は間違ったエラーコードです。401または403の方が理にかなっています。
moopet

1
あなたが正しいです。クライアントからは、アクセス権のない人にはページが存在することすら知りたくないという印象を受けていました。それでも、代わりに401をスローするのは簡単な変更です。
エヴァン・ヨン

回答:


50

ヘッダーで次のコードを使用すると、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にルールを入れて、それがパブリックリソースではないことを示す必要もあります。
-mopsyd

2

エラーメッセージを表示するページを作成してから、そのページにユーザーをリダイレクトしないのはなぜですか?これを実現する簡単な方法を次に示します。

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ページを返す前にすべてのコンテンツを検索する必要があり、その作業はリソースの無駄です。ブログをより速く実行するのに役立つ可能性のある、事前に構成されたページを使用します。


これを使うことを考えました。しかし、私が目にするいくつかの欠点は、2つの404テンプレートを作成して維持する必要があることです(ページと実際)。クライアントは404ページを作成する必要があります。そして、URLを同じにしたいと思います。たとえばexample.com / restrictedにアクセスすると、... / 404 /にリダイレクトされません。
Evan Yeung

実際、404.phpがテンプレートであることに気付きました。私の間違い。
エヴァン・ヨン

いいえ、何らかの種類のページランキングが必要な場合、それはかなりひどい考えです。検索エンジンは、404または4xxの範囲ヘッダーを返すページのみをビューアーエラーと見なし、200ページを返すものはすべてインデックスに登録します。リダイレクトを行うと、見つからないページが有効なページであることをクローラーに伝えているため、ページのランキングがひどく乱れます。404ページを取得するときに本当に必要なことは、行うことだけですhttp_response_code(404); exit();。ページが必要な場合は、get_template_part( 404 );終了前に使用します。これは、ワードプレスの機能よりもはるかに高速です。
-mopsyd

0

このコードを、実際に使用されるテーマディレクトリ(wp-content / themes /..../ 404.php)のファイル404.phpに書き込むことができます。

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>

このコードは、ファイルの先頭から開始する必要があります(前に文字はありません

オリジナルへのリンク:404ページをWordPressのホームページにリダイレクトする方法


OPは、特定の基準を満たさないユーザーに404を表示する方法を実際に探しています。たとえば、「ユーザーAに「can_edit」機能がない場合、404ページを表示します。
phatskat

404をリダイレクトしないでください。Location: xxxクローラーに実際に有効なリソースがあることを伝える301ヘッダーを設定し、存在しないと判断した場合はランキングを強制終了します。
mopsyd

0

ユーザーの役割に基づいてユーザーに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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.