Làm cách nào để lập trình 404?


7

Làm thế nào tôi có thể làm một cái gì đó như thế này để làm việc?

// in a plugin / theme:
// This imaginary function will make WordPress think that the 
// current request is a 404. 
// Ideally this function could be ran anywhere, but realistically it
// will probably have to be before the template_redirect hook runs.
generate_404_somehow();

// later...
add_action('template_redirect', function() {
    // should be "true"
    var_dump(is_404());
});

Về cơ bản trong một số điều kiện nhất định, tôi muốn bảo WordPress hiển thị mẫu 404 của nó (mà tôi có thể nối vào sau nếu tôi muốn) thay vì mẫu mà nó sắp tải (ví dụ: trang hoặc kho lưu trữ).

Tôi biết tôi chỉ có thể 302chuyển hướng đến một trang không tồn tại nhưng điều đó rất lộn xộn. Tôi cũng có thể gửi 404tiêu đề HTTP theo cách thủ công, nhưng sau đó tôi không thể sử dụng trang 404 đẹp của WP (Tôi đã có những thứ liên quan đến is_404()nhu cầu đó để được kích hoạt vào đúng thời điểm).


Có lẽ tôi có thể sửa đổi truy vấn để tìm kiếm một trang không tồn tại.
dave1010

Bạn có thể làm rõ câu hỏi ở đây? Bạn đang cố chạy mã trên trang 404 của chủ đề hay bạn cố tình muốn tạo lỗi 404?
Steve

Tôi muốn tạo 404. Tôi sẽ chỉnh sửa câu hỏi một chút ...
dave1010

trong trường hợp nào / khi nào và tại sao bạn muốn tạo trang 404?
fischi

Tôi cần phải làm điều này trong ít nhất 2 dịp khác nhau. Gần đây nhất là làm cho các trang tác giả kế thừa cho một 404. Đó cũng là điều mà tôi chắc chắn tôi sẽ cần một lần nữa trong tương lai.
dave1010

Câu trả lời:


6
function generate_404_somehow() {
   global $wp_query;
   $wp_query->is_404 = true;
}
add_action('wp','generate_404_somehow');

Tất nhiên, điều đó sẽ gửi tất cả các trang của bạn đến mẫu 404. Tôi không biết điều kiện gì là thứ này nên bắn hay không bắn.

Hoặc để thận trọng hơn (xem bình luận) ...

function generate_404_somehow() {
   global $wp_query;
   $wp_query->set_404();
}
add_action('wp','generate_404_somehow');

Điều này hoạt động nhưng $wp_query->set_404()cũng chạy $wp_query->init_query_flags(), mà đặt tất cả các is_*cờ khác thành sai.
dave1010

Đúng, nhưng tôi không thấy sự cần thiết của chi phí (rất nhỏ). Tôi sẽ quan tâm để biết nếu có trường hợp này không hoạt động. Tôi không thể tìm thấy một.
s_ha_dum

Tôi cần đảm bảo rằng những thứ như is_single()is_archive()trả về false, vì vậy mọi móc nối kiểm tra chúng là chính xác và không thêm nội dung bổ sung vào trang 404 (như liên kết "Tiếp theo" và "Trước đó"). Điều này phụ thuộc vào plugin và chủ đề mặc dù.
dave1010

1
Tôi hiểu sự thận trọng. Sử dụng $wp_query->set_404()bên trong chức năng của tôi nên bao gồm nó. Tôi cho rằng đó là những gì bạn quyết định làm.
s_ha_dum

1

Các câu trả lời khác của s_ha_dum không đặt Trạng thái tiêu đề HTTP thành 404 Không tìm thấy . Để làm điều này thêm status_header( 404 )vào chức năng.

function generate_404_somehow() {
    global $wp_query;
    $wp_query->set_404();
    status_header( 404 );
}
add_action('wp','generate_404_somehow');

Bạn cũng có thể thêm nocache_headers()như đã thấy trong WP::handle_404().
Nicolai

0

Những gì dường như làm việc:

global $wp_query;
$wp_query->set_404();
$wp_query->max_num_pages = 0; // stop theme from showing Next/Prev links

Điều này dường như để đặt các tiêu đề HTTP và tải đúng mẫu (với is_404()sự thật).

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.