Cara memaksa 404 di WordPress


40

Saya perlu memaksa 404 pada beberapa posting berdasarkan kondisi. Saya berhasil melakukannya (walaupun saya tidak tahu apakah saya melakukannya dengan cara yang benar) dan saya mendapatkan 404.phptemplate saya untuk memuat seperti yang diharapkan.

Kode saya:

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

Kode 2 dari pertanyaan terkait ini - masalah yang sama:

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

Masalah saya:

Meskipun terlihat bagus, saya mendapatkan status 200 OKjika saya memeriksa tab jaringan. Karena ini adalah status 200, saya khawatir mesin pencari akan mengindeks halaman-halaman itu juga.

Perilaku yang Diharapkan:

Saya ingin status 404 Not Founddikirim.


Dari pertanyaan terkait: wordpress.stackexchange.com/questions/73738/… - apakah Anda membacanya?
fuxia

Ya, saya masih mendapatkan status 200dengan itu.
RRikesh

Jawaban:


50

Anda bisa mencoba fungsi Wordpress status_header()untuk menambahkan HTTP/1.1 404 Not Foundheader;

Jadi contoh Kode 2 Anda adalah:

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

Fungsi ini misalnya digunakan di bagian ini:

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

dari wpkelas di /wp-includes/class-wp.php.

Jadi coba gunakan contoh Kode 2 yang dimodifikasi ini selain template_includekode Anda .


The Code 2potongan Anda diposting bekerja sempurna. Itu set_header()yang hilang.
RRikesh

@birgire yang Anda rujuk untuk set_header()ditambahkan HTTP/1.1 404 Not Foundtetapi telah digunakan status_header()dalam kode Anda?
henrywright

@henrywright sepertinya salah ketik di sana, saya memperbarui jawabannya, terima kasih ;-)
birgire

15

Kode ini berfungsi untuk saya:

add_action ('wp', 'force_404');
function force_404 () {
    global $ wp_query; // $ post (jika diperlukan)
    if (is_page ()) {// kondisi Anda
        status_header (404);
        nocache_headers ();
        termasuk (get_query_template ('404'));
        mati();
    }
}

Berguna. Saya memeriksa parameter kueri khusus sehingga saya tidak menggunakan tindakan, tetapi itu membuat metode yang sangat berguna di kelas plugin saya.
John Reid

2
Tambahkan yang berikut untuk memperbaiki judul halaman:global $wp_query; $wp_query->is_404 = true;
developerbmw

2

Saya tidak akan merekomendasikan memaksa 404.

Jika Anda khawatir tentang mesin pencari, mengapa tidak melakukan meta "no-index, no-follow" di halaman-halaman itu dan memblokirnya dengan robots.txt?

Ini mungkin cara yang lebih baik untuk memblokir konten agar tidak dilihat

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

Anda mungkin juga dapat menggunakan metode ini untuk memuat 404.phptetapi saya merasa bahwa menggunakan templat halaman mungkin merupakan opsi yang lebih baik.

sumber


Terima kasih banyak untuk tautannya, saya akan beralih menggunakan locate_template(). Saya pikir itu robots.txt.bukan cara yang dijamin untuk melindungi dari indeksasi. Beberapa mesin pencari mungkin masih mengambil halaman. Saya ingin halaman terlihat seperti halaman 404 normal. Juga posting akan ditambahkan secara dinamis, mengedit robots.txtfile akan menambah lebih banyak masalah.
RRikesh

1

Solusi saya:

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
Mengarahkan kembali kesalahan sangat buruk untuk peringkat halaman Anda. Cukup tampilkan templat di lokasi yang sama dengan permintaan yang buruk. Apa yang akan terjadi ketika Anda melakukan itu adalah Anda awalnya menetapkan 404, dan kemudian redirect mengubahnya ke 301 atau 302, yang kemudian dialihkan ke halaman yang mengembalikan 200. Itu kemudian diindeks oleh mesin pencari sebagai halaman yang valid, yang secara eksplisit apa yang OP katakan tidak dia inginkan.
mopsyd

0

Kode status dikirim di tajuk permintaan HTTP. Fungsi Anda saat ini terhubung ke hook yang akan dipanggil terlambat.

Anda harus mencoba menghubungkan fungsi Anda rr_404_my_event()menjadi tindakan send_headers.

Saya tidak yakin apakah pada saat itu bahkan mungkin untuk memeriksa ID Posting, tetapi coba ini:

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

Saya memperbaiki beberapa kesalahan sintaksis dari kode Anda. Saya bahkan tidak mendapatkan template 404 untuk dimuat dengan itu.
RRikesh

Mungkin, di Anda, 404.phpAnda dapat memuat yang berbeda header.php, misalnya <?php get_header('404'); ?>untuk memuat header-404.php. Di tajuk itu, Anda akan menambahkan header('HTTP/1.0 404 Not Found');di <head>bagian.
Marc Dingena

0

Saya ingin membagikan cara saya menggunakan solusi yang ditandai

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

Saya melakukan ini untuk memisahkan semua jenis pengguna dari administrator , dalam proyek ini, Hanya admin yang dapat melihat author.phphalaman.

Saya harap ini bisa membantu orang lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.