Как заставить 404 на WordPress

Мне нужно заставить 404 на некоторых постов на основе условий. Мне удалось это сделать (хотя я не знаю, правильно ли я это сделал), и я получаю шаблон 404.php для загрузки, как ожидалось.

Мой код:

  функция rr_404_my_event () {
  глобальные $ post;
  if (is_singular ('event') & amp;! rr_event_should_be_available ($ post-> ID)) {
    include (get_query_template ('404'));
    Выход; #, так что нормальная страница не загружается после 404 страницы
  }
}

add_action ('template_redirect', 'rr_404_my_event', 1);
 

Код 2 из этот связанный вопрос - та же проблема

  функция rr_404_my_event () {
  глобальные $ post;
  if (is_singular ('event') & amp;! rr_event_should_be_available ($ post-> ID)) {
    глобальный $ wp_query;
    $ Wp_query- & GT; set_404 ();
  }
}

add_action ('wp', 'rr_404_my_event');
 

Мой вопрос:

Хотя он выглядит хорошо, я получаю статус 200 OK , если я проверяю вкладку сети. Поскольку это код 200 , я боюсь, что поисковые системы также могут индексировать эти страницы.

Ожидаемое поведение:

Я хочу отправить статус 404 Not Found .

33 голоса | спросил RRikesh 22 MaramFri, 22 Mar 2013 10:53:33 +04002013-03-22T10:53:33+04:0010 2013, 10:53:33

5 ответов


38

Вы можете попробовать Wordpress функцию status_header () , чтобы добавить заголовок HTTP /1.1 404 Not Found ;

Таким образом, ваш пример Code 2 :

  функция rr_404_my_event () {
  глобальные $ post;
  if (is_singular ('event') & amp;! rr_event_should_be_available ($ post-> ID)) {
    глобальный $ wp_query;
    $ Wp_query- & GT; set_404 ();
    status_header (404);
  }
}
add_action ('wp', 'rr_404_my_event');
 

Эта функция, например, используется в этой части:

  function handle_404 () {
    ...порез...
    //Угадайте, что пришло время 404.
    $ Wp_query- & GT; set_404 ();
    status_header (404);
    nocache_headers ();
    ...порез...
}
 

из класса wp в /wp-includes/class-wp.php .

Поэтому попробуйте использовать этот модифицированный пример Code 2 в дополнение к вашему коду template_include .

ответил birgire 24 MarpmSun, 24 Mar 2013 22:17:28 +04002013-03-24T22:17:28+04:0010 2013, 22:17:28
10

Этот код работал для меня:

add_action ('wp', 'force_404');
function force_404 () {
    глобальный $ wp_query; //$ posts (если требуется)
    if (is_page ()) {//ваше условие
        status_header (404);
        nocache_headers ();
        include (get_query_template ('404'));
        умереть();
    }
}
ответил golchha21 24 MarpmSun, 24 Mar 2013 22:42:04 +04002013-03-24T22:42:04+04:0010 2013, 22:42:04
2

Я бы не рекомендовал форсировать 404.

Если вы беспокоитесь о поисковых системах, почему бы просто не мета-мета на этих страницах и не блокировать его с помощью файла robots.txt?

Это может быть лучший способ заблокировать просмотр содержимого

  add_filter ('template_include', 'nifty_block_content', 99);

функция nifty_block_content ($ template) {
  if (is_singular ('event') & amp;! rr_event_should_be_available ($ post-> ID)) {
        $ template = locate_template (массив ('nifty-block-content.php'));
     }
    return $ template;
}
 

Возможно, вы также можете использовать этот метод для загрузки 404.php , но я считаю, что использование шаблона страницы может быть лучшим вариантом.

источник

ответил BandonRandon 22 MarpmFri, 22 Mar 2013 12:47:21 +04002013-03-22T12:47:21+04:0012 2013, 12:47:21
1

Мое решение:

  add_action ('wp', 'my_404');
функция my_404 ()
{
    if (is_404 ())
    {
        header («Статус: 404 Not Found»);
        $ GLOBALS [ 'WP_Query'] - & GT; set_404 ();
        status_header (404);
        nocache_headers ();
        //var_dump (getallheaders ()); var_dump (headers_list ()); умереть();
    }
}
 
ответил T.Todua 21 J000000Monday14 2014, 16:24:48
0

Коды состояния отправляются в заголовках HTTP-запросов. Ваша текущая функция подключена к крюку, который будет вызван слишком поздно.

Вы должны попытаться подключить функцию rr_404_my_event () к действию send_headers .

Я не уверен, что в этот момент даже можно проверить идентификатор сообщения, но дайте ему повод:

  add_action ('send_headers', 'rr_404_my_event');
функция rr_404_my_event () {
    глобальные $ post;
    if (is_singular ('event') & amp;! rr_event_should_be_available ($ post-> ID)) {
        include (get_query_template ('404'));
        header ('HTTP /1.0 404 Not Found');
        Выход;
    }
}
 
ответил Marc Dingena 22 MarpmFri, 22 Mar 2013 14:42:35 +04002013-03-22T14:42:35+04:0002 2013, 14:42:35

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132