Cách buộc 404 trên WordPress


40

Tôi cần buộc 404 trên một số bài viết dựa trên các điều kiện. Tôi đã xoay sở để làm điều đó (mặc dù tôi không biết liệu tôi đã làm đúng cách chưa) và tôi nhận được 404.phpmẫu của mình để tải như mong đợi.

Ma cua toi:

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    include( get_query_template( '404' ) );
    exit; # so that the normal page isn't loaded after the 404 page
  }
}

add_action( 'template_redirect', 'rr_404_my_event', 1 );

Mã 2 từ câu hỏi liên quan này - cùng một vấn đề:

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
  }
}

add_action( 'wp', 'rr_404_my_event' );

Vấn đề của tôi:

Mặc dù có vẻ tốt, tôi vẫn nhận được trạng thái 200 OKnếu tôi kiểm tra tab mạng. Vì đó là một trạng thái 200, tôi sợ rằng các công cụ tìm kiếm cũng có thể lập chỉ mục các trang đó.

Hành vi dự kiến:

Tôi muốn một trạng thái 404 Not Foundđược gửi.


Từ những câu hỏi liên quan: wordpress.stackexchange.com/questions/73738/ Khăn - bạn đã đọc nó chưa?
fuxia

Vâng, tôi vẫn nhận được một trạng thái 200với điều đó.
RRikesh

Câu trả lời:


50

Bạn có thể thử chức năng Wordpress status_header()để thêm HTTP/1.1 404 Not Foundtiêu đề;

Vì vậy, ví dụ về Mã 2 của bạn sẽ là:

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
    status_header(404);
  }
}
add_action( 'wp', 'rr_404_my_event' );

Hàm này được sử dụng ví dụ trong phần này:

function handle_404() {
    ...cut...
    // Guess it's time to 404.
    $wp_query->set_404();
    status_header( 404 );
    nocache_headers();
    ...cut...
}

từ wplớp trong /wp-includes/class-wp.php.

Vì vậy, hãy thử sử dụng ví dụ Mã 2 đã sửa đổi này ngoài template_includemã của bạn .


Các Code 2đoạn mã bạn được đăng tác phẩm hoàn hảo. Đó set_header()là những gì đã mất.
RRikesh

@birgire bạn tham khảo để set_header()thêm HTTP/1.1 404 Not Foundnhưng đã sử dụng status_header()trong mã của bạn?
henrywright

@henrywright Nó trông giống như một lỗi đánh máy ở đó, tôi đã cập nhật câu trả lời, cảm ơn ;-)
birgire

15

Mã này làm việc cho tôi:

add_action ('wp', 'force_404');
hàm lực_404 () {
    $ wp_query toàn cầu; // $ bài viết (nếu cần)
    if (is_page ()) {// điều kiện của bạn
        status_header (404);
        nocache_headers ();
        bao gồm (get_query_template ('404'));
        chết();
    }
}

Tiện dụng. Tôi đang kiểm tra các tham số truy vấn tùy chỉnh vì vậy tôi không sử dụng hành động, nhưng nó tạo ra một phương thức rất hữu ích trong lớp plugin của tôi.
John Reid

2
Thêm phần sau để sửa tiêu đề trang:global $wp_query; $wp_query->is_404 = true;
developerbmw

2

Tôi không khuyên bạn nên buộc 404.

Nếu bạn lo lắng về các công cụ tìm kiếm, tại sao không thực hiện meta "không chỉ mục, không theo dõi" trên các trang đó và chặn nó bằng robot.txt?

Đây có thể là một cách tốt hơn để chặn nội dung khỏi bị xem

add_filter( 'template_include', 'nifty_block_content', 99 );

function nifty_block_content( $template ) {
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        $template = locate_template( array( 'nifty-block-content.php' ) );
     }
    return $template;
}

Bạn có thể cũng có thể sử dụng phương pháp này để tải 404.phpnhưng tôi cảm thấy rằng sử dụng mẫu trang có thể là một lựa chọn tốt hơn.

nguồn


Cảm ơn rất nhiều về liên kết, tôi sẽ chuyển sang sử dụng locate_template()thay thế. Tôi nghĩ đó robots.txt.không phải là một cách đảm bảo để bảo vệ khỏi việc lập chỉ mục. Một số công cụ tìm kiếm vẫn có thể chọn trang. Tôi muốn trang này trông giống như một trang 404 bình thường. Ngoài ra các bài viết sẽ được thêm động, chỉnh sửa robots.txttập tin sẽ thêm rắc rối.
RRikesh

1

Giải pháp của tôi:

add_action( 'wp', 'my_404' );
function my_404() 
{
    if ( is_404() ) 
    {
        header("Status: 404 Not Found");
        $GLOBALS['wp_query']->set_404();
        status_header(404);
        nocache_headers();
        //var_dump(getallheaders()); var_dump(headers_list()); die();
    }
}

1
Chuyển hướng về lỗi là khủng khiếp cho xếp hạng trang của bạn. Chỉ cần hiển thị một mẫu tại cùng một vị trí với yêu cầu xấu. Điều gì sẽ xảy ra khi bạn làm điều đó là ban đầu bạn đặt 404 và sau đó chuyển hướng thay đổi nó thành 301 hoặc 302, sau đó chuyển hướng đến một trang trả về 200. Sau đó, được các công cụ tìm kiếm lập chỉ mục là một trang hợp lệ. rõ ràng là những gì OP nói anh ấy không muốn.
mopsyd 15/03/18

0

Mã trạng thái được gửi trong các tiêu đề của yêu cầu HTTP. Chức năng hiện tại của bạn được nối vào một hook sẽ được gọi là quá muộn.

Bạn nên cố gắng móc chức năng của bạn rr_404_my_event()thành hành động send_headers.

Tôi không chắc tại thời điểm đó thậm chí có thể kiểm tra ID bài viết hay không, nhưng hãy thử xem:

add_action( 'send_headers', 'rr_404_my_event' );
function rr_404_my_event() {
    global $post;
    if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        include( get_query_template( '404' ) );
        header('HTTP/1.0 404 Not Found');
        exit; 
    }
}

Tôi đã sửa một số lỗi cú pháp từ mã của bạn. Tôi thậm chí không nhận được mẫu 404 của mình để tải với điều đó.
RRikesh

Có lẽ, trong 404.phpbạn có thể tải khác header.php, ví dụ <?php get_header('404'); ?>để tải header-404.php. Trong tiêu đề đó, bạn sẽ thêm header('HTTP/1.0 404 Not Found');vào <head>phần.
Marc Đinhena

0

Tôi muốn chia sẻ cách tôi sử dụng giải pháp được đánh dấu

function fail_safe_for_authors() {
    if ((is_user_logged_in()) && (is_author()) && ($_COOKIE["user_role"] !== "administrator")) {
            global $wp_query;
            $wp_query->set_404();
            status_header(404);
        }
}
add_action("wp", "fail_safe_for_authors");

Tôi đã làm điều này để tách tất cả các loại người dùng khỏi quản trị viên , trong dự án này, Chỉ quản trị viên mới có thể xem author.phptrang.

Tôi hy vọng nó có thể giúp đỡ người khác.

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.