Задать вопрос

Как в Wordpress правильно сделать 404 в своём плагине?

Допускаю, что я вообще неверно решил задачу, и буду признателен за правильный подход.

Задача:
1) есть страница /aaa/ , на ней список элементов ( элементы - не посты);
2) у каждого элемента есть детальная страница /aaa/[a-z]+/ . Глубже иерархии нет;
3) для несуществующих элементов надо показывать 404 со статусом 404.

Как сделано:
1) в текущую тему добавлен шаблон template-aaa.php.
2) в шаблоне в нужной части используется экземпляр класса из самописного плагина:
<?php
$publicArea = new MyPlugin\PublicArea();
$publicArea->show();

3) в админке создана страница с ярлыком aaa , ей назначен шаблон template-aaa.php

Теперь плагин:
плагин использует хуки:
init - для add_rewrite_tag() , add_rewrite_rule()
query_vars - как парный к add_rewrite_tag()
get_header - здесь висит метод, который через get_query_var() понимает, что запросили детальную страницу элемента, получает данные элемента. Если не получилось - отрабатывает такой код:
<?php
global $wp_query;
$wp_query->set_404();
status_header(404);


И ещё есть всякие второстепенные хуки, типа get_canonical_url - считаю, что о них не нужно говорить в контексте вопроса.

Каков итог:
При HEAD запросе для несуществующего элемента возвращается статус 200. При GET запросе возвращается статус 404, как и должно быть.

Что нужно исправить, чтобы и для HEAD запроса был статус 404 ?
  • Вопрос задан
  • 105 просмотров
Подписаться 2 Средний 7 комментариев
Решения вопроса 1
yarovikov
@yarovikov
Нужно вешать на правильный хук. Проверил на странице автора, отдает 404

add_action('template_redirect', function (string $template): string {
    global $wp_query;
    if (!$wp_query->is_author()) {
        return $template;
    }
    $wp_query->set_404();
    status_header(404);
});


curl -I https://site.test/author/admin

HTTP/2 404
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы