Мне нужно заставить 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
был отправлен.
200
с этим.Ответы:
Вы можете попробовать функцию Wordpress,
status_header()
чтобы добавитьHTTP/1.1 404 Not Found
заголовок;Таким образом, ваш пример кода 2 будет:
Эта функция, например, используется в этой части:
из
wp
класса в/wp-includes/class-wp.php
.Поэтому попробуйте использовать этот модифицированный пример Code 2 в дополнение к вашему
template_include
коду.источник
Code 2
вами фрагмент отлично работает. Этоset_header()
было то, чего не хватало.set_header()
добавить,HTTP/1.1 404 Not Found
но использовалиstatus_header()
в своем коде?Этот код работал для меня:
источник
global $wp_query;
$wp_query->is_404 = true;
Я бы не рекомендовал форсировать 404.
Если вы беспокоитесь о поисковых системах, почему бы просто не создать мета «без индекса, без подписки» на этих страницах и заблокировать ее с помощью robots.txt?
Это может быть лучшим способом заблокировать просмотр контента
Возможно, вы также можете использовать этот метод для загрузки,
404.php
но я чувствую, что использование шаблона страницы может быть лучшим вариантом.источник
источник
locate_template()
вместо этого. Я думаю, чтоrobots.txt.
это не гарантированный способ защиты от индексации. Некоторые поисковые системы могут все еще поднять страницу. Я хочу, чтобы страница выглядела как обычная страница 404. Также посты будут добавляться динамически, редактированиеrobots.txt
файла добавит больше проблем.Мое решение:
источник
Коды состояния отправляются в заголовках HTTP-запросов. Ваша текущая функция подключена к ловушке, которая будет вызвана слишком поздно.
Вы должны попытаться подключить свою функцию
rr_404_my_event()
к действиюsend_headers
.Я не уверен, что в этот момент можно даже проверить идентификатор сообщения, но попробуйте:
источник
404.php
вы можете загрузить другоеheader.php
, например,<?php get_header('404'); ?>
загрузитьheader-404.php
. В этом заголовке вы добавитеheader('HTTP/1.0 404 Not Found');
в<head>
раздел.Я хотел бы поделиться тем, как я использовал отмеченное решение
Я сделал это, чтобы отделить все типы пользователей от администратора , в этом проекте только администратор может видеть
author.php
страницу.Я надеюсь, что это может помочь кому-то еще.
источник