Redirect Halaman Terbatas ke 404

21

Apakah ada cara untuk menampilkan halaman 404 jika pengguna yang masuk saat ini tidak memiliki izin yang tepat untuk melihat halaman? Saya mencari metode PHP, semacamnya

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

Saya telah berpikir tentang menggunakan pengalihan, tetapi saya ingin menjaga url tetap sama.

Evan Yeung
sumber
Jika Anda menolak akses ke pengguna untuk halaman yang ada, 404 adalah kode kesalahan yang salah untuk digunakan. A 401 atau 403 akan lebih masuk akal.
moopet
1
Kamu benar. Saya mendapat kesan dari klien bahwa dia tidak ingin siapa pun tanpa akses untuk mengetahui halaman itu ada, melempar 401 akan mengatakan itu ada tetapi dilarang. Meskipun demikian, itu akan menjadi perubahan yang mudah untuk melempar 401 sebagai gantinya.
Evan Yeung

Jawaban:

52

Saya dapat menampilkan kesalahan 404 dengan menggunakan kode berikut di header saya.

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

Untuk memecahnya
$wp_query->set_404():: memberi tahu wp_query ini adalah 404, ini mengubah judul
status_header(): mengirim header HTTP 404
get_template_part(): menampilkan template 404

Evan Yeung
sumber
Ini adalah jawaban yang baik, tetapi saya juga akan menggunakan http_status_code(404);sebelum mengatur template untuk memastikan bahwa header sudah benar (yang secara signifikan lebih cepat daripada status_header( 404 );fungsi wordpress ). Jika Anda khawatir dengan peringkat halaman, Anda juga harus meletakkan Disallowaturan di robots.txt Anda untuk menunjukkan bahwa itu bukan sumber daya publik.
mopsyd
2

Mengapa Anda tidak membuat halaman yang menampilkan pesan kesalahan dan kemudian mengarahkan pengguna ke halaman itu? Berikut adalah cara sederhana untuk mencapai itu:

Buka 404.phpfile dan tambahkan baris ini di atasnya:

/**
 * Template Name: 404 Page
 */

Buat halaman dengan 404 Pagetemplat. Lalu arahkan ulang pengguna:

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

Alasan Anda harus menggunakan halaman untuk permintaan 404 adalah: di halaman WP 404 sebenarnya adalah halaman yang tidak ada , WP harus mencari semua kontennya sebelum mengembalikan halaman 404 dan pekerjaan itu adalah pemborosan sumber daya. Menggunakan halaman pra-konfigurasi yang dapat membantu Anda menjalankan blog Anda lebih cepat.

Anh Tran
sumber
Saya sudah berpikir untuk menggunakan ini. Tetapi beberapa kekurangan yang saya lihat adalah bahwa dua 404 templat harus dibuat dan dipelihara (halaman dan nyata). Klien harus membuat halaman 404. Dan saya ingin menjaga URL tetap sama. Contoh, jika saya pergi ke example.com/restricted , saya tidak akan dialihkan ke ... / 404 /
Evan Yeung
Sebenarnya saya baru menyadari bahwa 404.php adalah templat. Kesalahanku.
Evan Yeung
Tidak, itu ide yang sangat buruk jika Anda suka memiliki peringkat halaman apa pun. Mesin pencari hanya menganggap halaman yang mengembalikan 404 atau header rentang 4xx sebagai kesalahan penampil, dan dengan senang hati akan mengindeks apa pun yang mengembalikan 200 halaman. Jika Anda melakukan redirect, maka Anda memberi tahu crawler bahwa halaman yang tidak Anda temukan adalah halaman yang valid, dan itu akan mengacaukan peringkat halaman Anda dengan buruk. Yang perlu Anda lakukan saat mendapatkan halaman 404 adalah mengerjakannya http_response_code(404); exit();. Jika Anda menginginkan halaman, maka gunakan get_template_part( 404 );sebelum keluar. Itu juga jauh lebih cepat daripada fungsi wordpress.
mopsyd
0

Anda dapat menulis kode ini ke file 404.php di direktori tema yang sebenarnya digunakan (wp-content / themes /..../ 404.php) :

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

Kode ini harus dimulai dari awal file (tanpa karakter apa pun sebelumnya) .

Tautan ke asli: Cara Mengarahkan halaman 404 Anda ke Halaman Beranda di WordPress

Jan Čejka
sumber
OP sebenarnya mencari cara agar 404 ditampilkan untuk pengguna yang tidak memenuhi kriteria tertentu, misalnya "Jika pengguna A tidak memiliki kemampuan 'can_edit', maka tampilkan halaman 404."
phatskat
Jangan mengarahkan 404s. Location: xxxmenetapkan header 301, yang memberitahu crawler bahwa sebenarnya ada sumber daya yang valid, dan membunuh peringkat Anda ketika mereka menentukan bahwa tidak ada.
mopsyd
0

Saya memiliki persyaratan yang sama di mana saya tidak boleh membiarkan pengguna mengakses halaman author.php berdasarkan peran yang digunakan pengguna. Saya mendaftarkan tindakan template_redirect untuk melakukan pemeriksaan dan mengarahkan ke halaman 404 bahkan sebelum halaman yang sebenarnya dimuat.

Pendaftaran:

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

Jika Anda memilih untuk hanya menggunakan snipet kode berikut di tengah-tengah bagian templat, halaman mungkin telah dirender sebagian dan Anda tidak benar-benar diarahkan ke halaman 404. Jadi lebih baik melakukannya dalam template_redirectaksi -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
Kalyan
sumber