Có bất kỳ hook nào làm thay đổi logic 404 không?


27

Với điều kiện bạn có một trang 404 được xác định trong chủ đề của mình, Wordpress sẽ hiển thị trang 404 nếu "thẻ" được xác định trong $ wp_query-> query_vars và không có bài đăng nào khớp với thẻ đó.

Tôi đang viết một plugin hiển thị một số thông tin trên mỗi trang, ngoài các bài đăng. Tôi muốn thay đổi logic 404 để trang 404 được hiển thị nếu không có bài đăng nào khớp với thẻ plugin không thể lấy bất kỳ dữ liệu nào khớp với thẻ đó. Nếu plugin có thể tìm thấy dữ liệu, tôi muốn hiển thị một trang bình thường, bất kể có bài đăng nào trên trang đó hay không ...

Tôi đã Googling, đọc mã, đọc codex và chọc vào đây và không thể tìm ra nơi Wordpress kích hoạt 404 đó và làm thế nào tôi có thể ghi đè lên nó. (Tôi có cảm giác nó có thể có liên quan đến status_header () trong hàm.php, nhưng không rõ làm thế nào và khi nào tôi cần nối vào nó).

Bất kỳ trợ giúp / ý tưởng / giác ngộ đánh giá cao.

Cảm ơn bạn,

~ Bản vá

Câu trả lời:


29

Sau khi thêm một chút slogging thông qua mã và Googling, tôi tìm thấy câu trả lời. Nó được chứa trong chuỗi này (xem bài đăng của Otto42), nhưng đối với bản ghi, việc thêm phần sau vào plugin của bạn sẽ ghi đè xử lý 404 cho các điều kiện bạn chỉ định:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (<some condition is met>) {
        status_header( 200 );
        $wp_query->is_404=false;
    }
}

Lưu ý rằng bạn cần đặt "is_404" thành false trước các tiêu đề đầu ra PHP, đó là lý do tại sao việc nối nó trong logic template_redirect là một ý tưởng hay.

~ Bản vá


5

Tôi cần phải làm tương tự cho một dự án tùy chỉnh trong đó luôn có 200 trang và thấy rằng bạn cũng có thể chỉ cần thêm phần này vào đầu tệp mẫu của bạn (phía trên get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;

1
Tuyệt quá! Điều này làm việc cho tôi. Tôi đã tạo tập lệnh của mình và nó tạo ra 404. Tôi đã thử tập lệnh runnig từ wp-> main nhưng đó không phải là một giải pháp sạch ver. Điều này làm việc cho tôi:// configuration require('./wp-load.php'); // init WP (inits objects, language and stuff). wp(); // fix title (this is not 404) $wp_query->is_404 = false; // doesn't fix the actual 404 status status_header( 200 ); // but this does :-)
Nux

1

Tạo 404.phptệp mẫu trong chủ đề của bạn và tùy chỉnh khi cần (thêm đầu ra plugin của bạn hoặc bất cứ điều gì). Bạn đề cập đến định nghĩa trong chủ đề của bạn , chính xác thì điều gì là sai với cách tiếp cận này đối với bạn?

Codex Tạo trang 404 Lỗi


Điều tôi đang tìm kiếm là một cách để thay đổi hoàn cảnh mà trang 404 được kích hoạt. Ngay bây giờ, nếu Wordpress không thể tìm thấy bất kỳ bài đăng nào khớp với thẻ trong các vars truy vấn, trang 404 sẽ xuất hiện. Tôi muốn thả một số mã bổ sung để đảm bảo trang 404 chỉ xuất hiện nếu Wordpress không thể tìm thấy bất kỳ bài đăng nào plugin của tôi không thể tìm thấy bất kỳ thông tin bổ sung nào để hiển thị.

Mục đích của 404 là để khách truy cập biết liên kết là sai và để bạn đăng nhập và sửa lỗi (nếu cần). Bạn không muốn nói với khách truy cập rằng anh ta đang sử dụng liên kết bị hỏng hoặc tự nhận thức về điều đó. Hiển thị thông tin trên 404 chỉ hoạt động tốt, chiếm quyền điều khiển nó không phải là một yêu cầu, vậy tại sao phải bận tâm? Chỉ cần cố gắng để nắm bắt logic và / hoặc kỹ thuật của bạn.
Hết

1
Điều tôi đang tìm kiếm là một cách để thay đổi định nghĩa về những trang nào "sai". Trang web tôi đang xây dựng có một thành phần blog, nhưng đó không phải là tất cả các trang web. Tôi đang sử dụng các thẻ Wordpress để hiển thị các bài đăng Wordpress và kéo lên nội dung bổ sung thông qua plugin. Tôi muốn trả về 200 mã trạng thái nếu a) có bài đăng hoặc b) plugin của tôi có thể tìm thấy nội dung phù hợp với thẻ. Do đó, cần phải tua lại logic. Bất kể, cảm ơn bạn đã dành thời gian để viết câu trả lời - xin lỗi rằng vấn đề của tôi đủ kỳ lạ để cần một câu trả lời liên quan nhiều hơn :-)
Patch
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.