จำกัด การเปลี่ยนเส้นทางหน้าเป็น 404


21

มีวิธีแสดงหน้า 404 หรือไม่หากผู้ใช้ที่ล็อกอินปัจจุบันไม่มีช่องว่างด้านขวาเพื่อดูหน้า? ฉันกำลังมองหาวิธี PHP สิ่งที่ชอบ

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

ฉันคิดว่าจะใช้การเปลี่ยนเส้นทาง แต่ฉันต้องการเก็บ URL ไว้เหมือนเดิม


หากคุณปฏิเสธการเข้าถึงผู้ใช้สำหรับหน้าที่มีอยู่ 404 เป็นรหัสข้อผิดพลาดที่ไม่ถูกต้องที่จะใช้ 401 หรือ 403 น่าจะสมเหตุสมผลมากกว่า
moopet

1
คุณพูดถูก ฉันอยู่ภายใต้การแสดงผลจากลูกค้าว่าเขาไม่ต้องการให้ใครไม่สามารถเข้าถึงได้รู้ว่ามีหน้าเว็บอยู่แล้วการขว้าง 401 จะบอกว่ามันมีอยู่ แต่ไม่ได้รับอนุญาต อย่างไรก็ตามมันจะเป็นการง่ายที่จะเปลี่ยน 401 แทน
Evan Yeung

คำตอบ:


50

ฉันสามารถแสดงข้อผิดพลาด 404 โดยใช้รหัสต่อไปนี้ในส่วนหัวของฉัน

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

หากต้องการแยกย่อย
$wp_query->set_404():: บอก wp_query ว่านี่คือ 404 นี่เป็นการเปลี่ยนชื่อ
status_header(): ส่งส่วนหัว HTTP 404
get_template_part(): แสดงแม่แบบ 404


นี่เป็นคำตอบที่ดี แต่ฉันจะใช้http_status_code(404);ก่อนการตั้งค่าเทมเพลตเพื่อให้แน่ใจว่าส่วนหัวนั้นถูกต้อง (ซึ่งเร็วกว่าstatus_header( 404 );ฟังก์ชั่นwordpress ) หากคุณเกี่ยวข้องกับอันดับของหน้าคุณควรวางDisallowกฎไว้ใน robots.txt ของคุณเพื่อระบุว่าไม่ใช่ทรัพยากรสาธารณะ
mopsyd

2

ทำไมคุณไม่สร้างหน้าเว็บที่แสดงข้อความแสดงข้อผิดพลาดจากนั้นเปลี่ยนเส้นทางผู้ใช้ไปยังหน้านั้น นี่เป็นวิธีง่ายๆในการบรรลุเป้าหมายดังกล่าว:

เปิด404.phpไฟล์และเพิ่มบรรทัดเหล่านี้ที่ด้านบนของไฟล์:

/**
 * Template Name: 404 Page
 */

สร้างเพจด้วย404 Pageเทมเพลต จากนั้นเปลี่ยนเส้นทางผู้ใช้:

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

เหตุผลที่คุณควรใช้หน้าสำหรับคำขอ 404 คือ: ในหน้า WP 404 จริง ๆ แล้วเป็นหน้าที่ไม่มีอยู่จริง WP ต้องค้นหาเนื้อหาทั้งหมดก่อนที่จะส่งคืนหน้า 404 และงานนั้นเป็นการสิ้นเปลืองทรัพยากร การใช้หน้ากำหนดค่าล่วงหน้าที่อาจช่วยให้คุณเรียกใช้บล็อกได้เร็วขึ้น


ฉันคิดเกี่ยวกับการใช้สิ่งนี้ แต่ความล้มเหลวสองสามอย่างที่ฉันเห็นคือเทมเพลต 404 สองรายการจะต้องสร้างและดูแลรักษา (หน้าและจริง) ลูกค้าจะต้องสร้างหน้า 404 และฉันต้องการเก็บ URL ไว้เหมือนเดิม ตัวอย่างถ้าฉันไปที่example.com/restrictedฉันจะไม่ถูกเปลี่ยนเส้นทางไปที่ ... / 404 /
Evan Yeung

ที่จริงฉันเพิ่งรู้ว่า 404.php เป็นแม่แบบ ความผิดพลาดของฉัน.
Evan Yeung

ไม่นั่นเป็นความคิดที่แย่มากหากคุณต้องการให้มีการจัดอันดับหน้าใด ๆ เสิร์ชเอ็นจิ้นพิจารณาเฉพาะหน้าเว็บที่ส่งคืน 404 หรือส่วนหัวช่วง 4xx ใด ๆ เป็นข้อผิดพลาดของผู้ดูและยินดีที่จะจัดทำดัชนีสิ่งที่ส่งกลับ 200 หน้า หากคุณทำการเปลี่ยนเส้นทางแสดงว่าคุณกำลังบอกโปรแกรมรวบรวมข้อมูลว่าหน้าเว็บที่ไม่พบของคุณเป็นหน้าที่ถูกต้องและจะทำให้หน้าเว็บของคุณเรียงลำดับไม่ดี ทั้งหมดที่คุณต้องการจริงๆจะทำอย่างไรเมื่อคุณได้รับ 404 http_response_code(404); exit();หน้าเป็นทำ หากคุณต้องการหน้าให้ใช้get_template_part( 404 );ก่อนออก ที่เร็วกว่าฟังก์ชั่น wordpress อื่น ๆ อีกมาก
mopsyd

0

คุณสามารถเขียนรหัสนี้ไปยังไฟล์404.phpในไดเรกทอรีธีมที่ใช้งานจริง(wp-content / themes /..../ 404.php) :

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

รหัสนี้จะต้องเริ่มต้นจากการเริ่มต้นของไฟล์(ไม่มีตัวอักษรใดมาก่อน)

เชื่อมโยงไปยังต้นฉบับ: วิธีเปลี่ยนเส้นทางหน้า 404 ของคุณไปยังหน้าแรกใน WordPress


OP กำลังมองหาวิธีที่จะแสดง 404 สำหรับผู้ใช้ที่ไม่ตรงตามเกณฑ์ที่กำหนดเช่น "หากผู้ใช้ A ไม่มีความสามารถ 'can_edit' ให้แสดงหน้า 404"
phatskat

ห้ามเปลี่ยนเส้นทาง 404s Location: xxxตั้งค่าส่วนหัว 301 ซึ่งจะบอกโปรแกรมรวบรวมข้อมูลว่าจริงๆแล้วมีทรัพยากรที่ถูกต้องและฆ่าการจัดอันดับของคุณเมื่อพวกเขาพบว่าไม่มี
mopsyd

0

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

การลงทะเบียน:

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

handler:

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

หากคุณเลือกที่จะใช้ข้อมูลโค้ดต่อไปนี้เฉพาะในส่วนของเทมเพลตหน้าอาจมีการแสดงผลบางส่วนแล้วและคุณไม่ได้เปลี่ยนเส้นทางไปยังหน้า 404 ดังนั้นดีกว่าที่จะทำในการtemplate_redirectดำเนินการ -

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