Cómo forzar un 404 en WordPress

36

Necesito forzar un 404 en algunas publicaciones según las condiciones. Logré hacerlo (aunque no sé si lo hice de la manera correcta) y estoy obteniendo la plantilla 404.php para cargar como se esperaba.

Mi 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 pregunta relacionada : el mismo 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' );

Mi problema:

Aunque se ve bien, obtengo un estado 200 OK si reviso la pestaña de la red. Dado que es un estado 200 , me temo que los motores de búsqueda también podrían indexar esas páginas.

Comportamiento esperado:

Quiero que se envíe un estado 404 Not Found .

    
pregunta RRikesh 22.03.2013 - 07:53

5 respuestas

42

Puedes probar la función de WordPress status_header() para agregar el encabezado HTTP/1.1 404 Not Found ;

Por lo tanto, su ejemplo de Código 2 sería:

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 función se utiliza, por ejemplo, en esta parte:

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

de la clase wp en /wp-includes/class-wp.php .

Intente usar este ejemplo modificado de Code 2 además de su código template_include .

    
respondido por el birgire 24.03.2013 - 19:17
12

Este código me funcionó:

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();
    }
}
    
respondido por el golchha21 24.03.2013 - 19:42
2

No recomendaría forzar un 404.

Si estás preocupado por los motores de búsqueda, ¿por qué no solo haces un meta de "no indexar, no seguir" en esas páginas y bloquearlo con robots.txt?

Esta puede ser una mejor manera de bloquear la visualización del contenido

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

Probablemente también puedas usar este método para cargar 404.php , pero creo que usar una plantilla de página podría ser una mejor opción.

source

    
respondido por el BandonRandon 22.03.2013 - 09:47
1

Mi solución:

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();
    }
}
    
respondido por el T.Todua 21.07.2014 - 14:24
0

Los códigos de estado se envían en los encabezados de las solicitudes HTTP. Su función actual está enganchada a un gancho que se llamará demasiado tarde.

Debes intentar enlazar tu función rr_404_my_event() en la acción send_headers .

No estoy seguro de que en ese momento sea posible verificar la ID de publicación, pero dale una oportunidad:

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; 
    }
}
    
respondido por el Marc Dingena 22.03.2013 - 11:42

Lea otras preguntas en las etiquetas