วิธีการบังคับ 404 บน WordPress


40

ฉันต้องการบังคับ 404 ในบางโพสต์ตามเงื่อนไข ฉันจัดการเพื่อทำมัน (แม้ว่าฉันไม่ทราบว่าฉันทำถูกวิธี) และฉันได้รับ404.phpแม่แบบของฉันโหลดตามที่คาดไว้

รหัสของฉัน:

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

รหัส 2 จากคำถามที่เกี่ยวข้อง - ปัญหาเดียวกัน:

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' );

ปัญหาของฉัน:

แม้ว่าจะดูดี แต่ฉันได้รับสถานะ200 OKถ้าฉันตรวจสอบแท็บเครือข่าย เนื่องจากเป็นสถานะ200ฉันกลัวว่าเครื่องมือค้นหาอาจจัดทำดัชนีหน้าเว็บเหล่านั้นด้วย

พฤติกรรมที่คาดหวัง:

ฉันต้องการสถานะ404 Not Foundที่จะส่ง


จากคำถามที่เกี่ยวข้อง: wordpress.stackexchange.com/questions/73738/… - คุณอ่านมาแล้วเหรอ?
fuxia

ใช่ฉันยังได้รับสถานะ200ด้วย
RRikesh

คำตอบ:


50

คุณสามารถลองใช้ฟังก์ชั่น Wordpress status_header()เพื่อเพิ่มHTTP/1.1 404 Not Foundส่วนหัว;

ดังนั้นตัวอย่างรหัส 2ของคุณคือ:

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' );

ฟังก์ชั่นนี้เป็นตัวอย่างที่ใช้ในส่วนนี้:

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

จากการเรียนในwp/wp-includes/class-wp.php

ดังนั้นลองใช้ตัวอย่างโค้ด 2 ที่ได้รับการดัดแปลงนี้เพิ่มเติมจากtemplate_includeโค้ดของคุณ


Code 2snippet คุณโพสต์ผลงานได้อย่างสมบูรณ์แบบ set_header()คือสิ่งที่ขาดหายไป
RRikesh

@ Birgire คุณอ้างถึงset_header()การเพิ่มHTTP/1.1 404 Not Foundแต่ได้ใช้status_header()ในรหัสของคุณ?
henrywright

@henrywright ดูเหมือนว่าพิมพ์ผิดมีฉันปรับปรุงคำตอบขอบคุณ ;-)
birgire

15

รหัสนี้เหมาะกับฉัน:

add_action ('wp', 'force_404');
ฟังก์ชั่น force_404 () {
    $ wp_query ทั่วโลก; // $ โพสต์ (ถ้าจำเป็น)
    if (is_page ()) {// เงื่อนไขของคุณ
        status_header (404);
        nocache_headers ();
        รวม (get_query_template ('404'));
        ตาย();
    }
}

มีประโยชน์ ฉันกำลังตรวจสอบพารามิเตอร์คิวรีที่กำหนดเองดังนั้นฉันจึงไม่ได้ใช้แอคชัน แต่ทำเพื่อเป็นวิธีที่มีประโยชน์มากในคลาสปลั๊กอินของฉัน
John Reid

2
เพิ่มสิ่งต่อไปนี้เพื่อแก้ไขชื่อหน้า:global $wp_query; $wp_query->is_404 = true;
developerbmw

2

ฉันไม่แนะนำให้บังคับ 404

หากคุณกังวลเกี่ยวกับเครื่องมือค้นหาทำไมไม่เพียงแค่ทำเมตา "ไม่ต้องทำดัชนีไม่ต้องติดตาม" ในหน้าเหล่านั้นและบล็อกด้วย robots.txt

นี่อาจเป็นวิธีที่ดีกว่าในการปิดกั้นการดูเนื้อหา

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

คุณอาจใช้วิธีนี้ในการโหลด404.phpแต่ฉันรู้สึกว่าการใช้เทมเพลตหน้าอาจเป็นตัวเลือกที่ดีกว่า

แหล่ง


ขอบคุณมากสำหรับลิงค์ฉันจะเปลี่ยนไปใช้locate_template()แทน ฉันคิดว่านั่นrobots.txt.ไม่ใช่วิธีที่รับประกันได้ในการปกป้องจากการจัดทำดัชนี เครื่องมือค้นหาบางอย่างอาจยังรับหน้า ฉันต้องการให้หน้าเว็บดูเหมือนปกติ 404 หน้า นอกจากนี้โพสต์จะถูกเพิ่มแบบไดนามิกการแก้ไขrobots.txtไฟล์จะเพิ่มปัญหามากขึ้น
RRikesh

1

ทางออกของฉัน:

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
การเปลี่ยนเส้นทางจากข้อผิดพลาดเป็นสิ่งที่แย่มากสำหรับการจัดอันดับหน้า เพียงแสดงเทมเพลตในตำแหน่งเดียวกันกับคำขอที่ไม่ดี จะเกิดอะไรขึ้นเมื่อคุณตั้งค่าเริ่มต้น 404 จากนั้นการเปลี่ยนเส้นทางจะเปลี่ยนเป็น 301 หรือ 302 ซึ่งจะเปลี่ยนเส้นทางไปยังหน้าเว็บที่ส่งคืนค่า 200 ซึ่งจะได้รับการจัดทำดัชนีโดยเครื่องมือค้นหาว่าเป็นหน้าที่ถูกต้อง เป็นสิ่งที่ OP บอกอย่างชัดเจนว่าเขาไม่ต้องการ
mopsyd

0

รหัสสถานะจะถูกส่งในส่วนหัวของคำขอ HTTP ฟังก์ชั่นปัจจุบันของคุณถูกต่อเข้ากับตะขอที่จะเรียกว่าช้าไป

คุณควรพยายามที่จะขอการทำงานของคุณไปสู่การปฏิบัติrr_404_my_event()send_headers

ฉันไม่แน่ใจว่าในเวลานั้นมันเป็นไปได้ที่จะตรวจสอบรหัสโพสต์ แต่ให้ทำสิ่งนี้:

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

ฉันแก้ไขข้อผิดพลาดทางไวยากรณ์จากรหัสของคุณ ฉันไม่ได้รับแม่แบบ 404 ของฉันที่จะโหลดด้วย
RRikesh

บางทีในของคุณ404.phpคุณสามารถโหลดที่แตกต่างกันheader.phpเช่นการโหลด<?php get_header('404'); ?> header-404.phpในส่วนหัวนั้นคุณจะเพิ่มheader('HTTP/1.0 404 Not Found');ใน<head>ส่วน
Marc Dingena

0

ฉันต้องการแบ่งปันวิธีที่ฉันใช้โซลูชันที่ทำเครื่องหมายไว้

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");

ฉันทำสิ่งนี้เพื่อแยกผู้ใช้ทุกประเภทออกจากผู้ดูแลระบบในโครงการนี้มีเพียงผู้ดูแลระบบเท่านั้นที่สามารถดูauthor.phpหน้าได้

ฉันหวังว่ามันจะช่วยคนอื่นได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.