Chuyển hướng trang bị giới hạn sang 404


21

Có cách nào để hiển thị trang 404 nếu người dùng đã đăng nhập hiện tại không có giải phóng mặt bằng đúng để xem trang không? Tôi đang tìm kiếm một phương thức PHP, một cái gì đó như

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

Tôi đã nghĩ về việc sử dụng một chuyển hướng, nhưng tôi muốn giữ cho url giống nhau.


Nếu bạn đang từ chối quyền truy cập vào người dùng cho một trang tồn tại, 404 là mã lỗi sai để sử dụng. Một 401 hoặc 403 sẽ có ý nghĩa hơn.
moopet

1
Bạn đúng rồi. Tôi đã có ấn tượng từ khách hàng rằng anh ta không muốn bất kỳ ai mà không truy cập thậm chí biết trang này tồn tại, ném một cái 401 sẽ nói rằng nó tồn tại nhưng bị cấm. Tuy nhiên, thay vào đó sẽ là một thay đổi dễ dàng để ném một chiếc 401.
Evan Yeung

Câu trả lời:


50

Tôi đã có thể hiển thị lỗi 404 bằng cách sử dụng đoạn mã sau trong tiêu đề của mình.

<?php
  global $wp_query;
  $wp_query->set_404();
  status_header( 404 );
  get_template_part( 404 ); exit();
?>

Để phá vỡ nó
$wp_query->set_404():: nói với wp_query đây là 404, điều này thay đổi tiêu đề
status_header(): gửi tiêu đề HTTP 404
get_template_part(): hiển thị mẫu 404


Đây là một câu trả lời tốt, nhưng tôi cũng sẽ sử dụng http_status_code(404);trước khi đặt mẫu để đảm bảo rằng tiêu đề là chính xác (nhanh hơn đáng kể so với status_header( 404 );chức năng wordpress ). Nếu bạn quan tâm đến thứ hạng trang, bạn cũng nên đặt một Disallowquy tắc trong tệp robots.txt của mình để cho biết rằng đó không phải là tài nguyên công khai.
mopsyd 15/03/18

2

Tại sao bạn không tạo một trang hiển thị thông báo lỗi và sau đó chuyển hướng người dùng đến trang đó? Đây là một cách đơn giản để đạt được điều đó:

Mở 404.phptệp và thêm các dòng này vào đầu tệp:

/**
 * Template Name: 404 Page
 */

Tạo một trang với 404 Pagemẫu. Sau đó chuyển hướng người dùng:

if ( !current_user_can('administrator') ) {
    $404_page = get_permalink( $404_page_id );
    wp_redirect( $404_page );
    exit();
}

Lý do bạn nên sử dụng một trang cho yêu cầu 404 là: trong trang WP 404 thực sự là một trang không tồn tại , WP phải tìm kiếm tất cả nội dung của nó trước khi trả lại trang 404 và công việc đó là một sự lãng phí tài nguyên. Sử dụng một trang được cấu hình sẵn có thể giúp bạn chạy blog nhanh hơn.


Tôi đã nghĩ về việc sử dụng này. Nhưng một vài nhược điểm mà tôi thấy là hai mẫu 404 sẽ phải được tạo và duy trì (trang và thực). Khách hàng sẽ phải tạo một trang 404. Và tôi muốn giữ URL như cũ. Ví dụ: nếu tôi truy cập example.com/restricted , tôi sẽ không được chuyển hướng đến ... / 404 /
Evan Yeung

Thật ra tôi chỉ nhận ra rằng 404.php là mẫu. Lỗi của tôi.
Evan Yeung

Không, đó là một ý tưởng khá khủng khiếp nếu bạn thích có bất kỳ loại xếp hạng trang nào. Các công cụ tìm kiếm chỉ coi các trang trả về 404 hoặc bất kỳ tiêu đề phạm vi 4xx nào là lỗi người xem và sẽ vui vẻ lập chỉ mục bất cứ điều gì trả về 200 trang. Nếu bạn thực hiện chuyển hướng, thì bạn đang nói với các trình thu thập thông tin rằng trang không tìm thấy của bạn là một trang hợp lệ và nó sẽ làm rối loạn thứ hạng trang của bạn. Tất cả những gì bạn thực sự cần làm khi bạn nhận được một trang 404 là làm http_response_code(404); exit();. Nếu bạn muốn một trang, sau đó sử dụng get_template_part( 404 );trước khi thoát. Điều đó cũng nhanh hơn nhiều so với bất kỳ chức năng wordpress.
mopsyd 15/03/18

0

Bạn có thể viết mã này vào tệp 404.php trong thư mục chủ đề thực sự được sử dụng (wp-content / Themes /..../ 404.php) :

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

Mã này phải bắt đầu từ đầu tệp (không có bất kỳ ký tự nào trước đó) .

Liên kết đến bản gốc: Cách chuyển hướng trang 404 của bạn đến Trang chủ trong WordPress


OP thực sự đang tìm cách để hiển thị 404 cho người dùng không đáp ứng một tiêu chí nhất định, ví dụ: "Nếu người dùng A không có khả năng 'can_edit', thì hãy hiển thị trang 404."
phatskat

Không chuyển hướng 404s. Location: xxxđặt tiêu đề 301, thông báo cho các trình thu thập thông tin rằng thực sự có tài nguyên hợp lệ và giết chết thứ hạng của bạn khi họ xác định rằng không có.
mopsyd 15/03/18

0

Tôi có một yêu cầu tương tự khi tôi không nên cho phép người dùng truy cập trang Author.php dựa trên vai trò của người dùng. Tôi đăng ký hành động template_redirect để kiểm tra và chuyển hướng đến trang 404 ngay cả trước khi trang thực sự được tải.

Đăng ký:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

Xử lý:

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();
        }
    }
}

Nếu bạn chọn chỉ sử dụng đoạn mã sau ở giữa phần mẫu, trang có thể đã được hiển thị một phần và bạn không thực sự được chuyển hướng đến trang 404. Vì vậy, tốt hơn để làm điều đó trong template_redirecthành động -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.