Сторінка з обмеженим перенаправленням до 404


21

Чи є спосіб відобразити сторінку 404, якщо поточний користувач, який увійшов у систему, не має права отримати доступ до сторінки? Я шукаю метод PHP, щось подібне

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

Я думав про використання переспрямування, але хотів би, щоб URL-адреса була такою ж.


Якщо ви забороняєте користувачеві доступ до наявної сторінки, 404 - це неправильний код помилки. 401 або 403 мали б більше сенсу.
moopet

1
Ти правий. У мене від клієнта було враження, що він не хоче, щоб хтось без доступу навіть знав, що сторінка існує, кинувши 401, він би сказав, що вона існує, але заборонена. Тим не менш, було б легко змінити замість цього 401.
Evan Yeung

Відповіді:


52

Мені вдалося відобразити помилку 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, щоб вказати, що це не державний ресурс.
мопсид

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 /
Еван Єун

Насправді я просто зрозумів, що шаблон 404.php - це шаблон. Моя помилка.
Evan Yeung

Ні, це дуже жахлива ідея, якщо вам подобається мати будь-який вид сторінки. Пошукові системи розглядають лише сторінки, які повертають заголовок діапазону 404 або будь-який 4xx діапазон, як помилку глядача, і вони із задоволенням індексують все, що поверне 200 сторінок. Якщо ви переспрямовуєте, то скажете сканерам, що не знайдена сторінка - це дійсна сторінка, і це зіпсує ваш рейтинг погано. Все, що вам дійсно потрібно зробити, коли ви отримуєте сторінку 404 - це зробити http_response_code(404); exit();. Якщо вам потрібна сторінка, використовуйте її get_template_part( 404 );перед виходом. Це також набагато швидше, ніж будь-яка функція wordpress.
мопсид

0

Ви можете написати цей код у файл 404.php у фактично використовуваному каталозі тем (wp-content / themes /..../ 404.php) :

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

Цей код повинен починатися з початку файлу (без жодних символів раніше) .

Посилання на оригінал: Як перенаправити сторінку 404 на головну сторінку в WordPress


ОП насправді шукає спосіб відображення 404 для користувачів, які не відповідають певним критеріям, наприклад, "Якщо користувач A не має можливості" can_edit ", тоді відобразити сторінку 404".
phatskat

Не перенаправляйте 404. Location: xxxвстановлює заголовок 301, який повідомляє сканерам, що насправді є дійсним ресурсом, і вбиває ваш рейтинг, коли вони визначать, що його немає.
мопсид

0

У мене була подібна вимога, коли я не повинен дозволяти користувачам отримувати доступ до сторінки avtor.php на основі ролі, в якій був користувач. Я реєструю дію template_redirect, щоб робити перевірки та перенаправляти на сторінку 404 ще до завантаження фактичної сторінки.

Реєстрація:

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

Обробник:

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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.