Como forçar um 404 no WordPress

36

Preciso forçar um 404 em algumas postagens com base nas condições. Eu consegui fazer isso (embora eu não saiba se fiz isso da maneira certa) e estou recebendo meu modelo 404.php para carregar como esperado.

Meu código:

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

Código 2 de esta questão relacionada - mesmo problema :

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' );

Meu problema:

Embora pareça bom, recebo um status 200 OK se eu verificar a guia "Rede". Como é um status 200 , receio que os mecanismos de pesquisa possam indexar essas páginas também.

Comportamento esperado:

Eu quero que o status 404 Not Found seja enviado.

    
por RRikesh 22.03.2013 / 07:53
fonte

5 respostas

42

Você pode tentar a função Wordpress status_header() para adicionar o cabeçalho HTTP/1.1 404 Not Found ;

Então, o seu exemplo do Código 2 seria:

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();
    status_header(404);
  }
}
add_action( 'wp', 'rr_404_my_event' );

Esta função é usada, por exemplo, nesta parte:

function handle_404() {
    ...cut...
    // Guess it's time to 404.
    $wp_query->set_404();
    status_header( 404 );
    nocache_headers();
    ...cut...
}

da classe wp em /wp-includes/class-wp.php .

Portanto, tente usar este exemplo modificado do Código 2 , além do código template_include .

    
por birgire 24.03.2013 / 19:17
fonte
12

Esse código funcionou para mim:

add_action( 'wp', 'force_404' );
function force_404() {
    global $wp_query; //$posts (if required)
    if(is_page()){ // your condition
        status_header( 404 );
        nocache_headers();
        include( get_query_template( '404' ) );
        die();
    }
}
    
por golchha21 24.03.2013 / 19:42
fonte
2

Eu não recomendaria forçar um 404.

Se você está preocupado com os mecanismos de pesquisa, por que não apenas fazer um meta "no-index, no-follow" nessas páginas e bloqueá-lo com robots.txt?

Esta pode ser uma maneira melhor de impedir que o conteúdo seja visualizado

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

function nifty_block_content( $template ) {
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        $template = locate_template( array( 'nifty-block-content.php' ) );
     }
    return $template;
}

Você provavelmente também pode usar esse método para carregar 404.php , mas acho que usar um modelo de página pode ser uma opção melhor.

source

    
por BandonRandon 22.03.2013 / 09:47
fonte
1

Minha solução:

add_action( 'wp', 'my_404' );
function my_404() 
{
    if ( is_404() ) 
    {
        header("Status: 404 Not Found");
        $GLOBALS['wp_query']->set_404();
        status_header(404);
        nocache_headers();
        //var_dump(getallheaders()); var_dump(headers_list()); die();
    }
}
    
por T.Todua 21.07.2014 / 14:24
fonte
0

Os códigos de status são enviados nos cabeçalhos de solicitações HTTP. Sua função atual é conectada a um gancho que será chamado tarde demais.

Você deve tentar ligar sua função rr_404_my_event() na ação send_headers .

Não tenho a certeza se, a essa altura, é possível verificar o código postal, mas avalie:

add_action( 'send_headers', 'rr_404_my_event' );
function rr_404_my_event() {
    global $post;
    if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        include( get_query_template( '404' ) );
        header('HTTP/1.0 404 Not Found');
        exit; 
    }
}
    
por Marc Dingena 22.03.2013 / 11:42
fonte