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 haciendo que mi 404.phpplantilla se cargue 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 - 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 OKsi reviso la pestaña de red. Como es un estado 200, me temo que los motores de búsqueda también pueden indexar esas páginas.
Comportamiento esperado:
Quiero 404 Not Foundque se envíe un estado .

200con eso.Respuestas:
Puede probar la función Wordpress
status_header()para agregar elHTTP/1.1 404 Not Foundencabezado;Entonces su ejemplo de Código 2 sería:
Esta función se usa, por ejemplo, en esta parte:
de la
wpclase en/wp-includes/class-wp.php.Intente usar este ejemplo modificado del Código 2 además de su
template_includecódigo.fuente
Code 2fragmento que publicaste funciona perfectamente. Elset_header()era lo que faltaba.set_header()agregarHTTP/1.1 404 Not Foundpero has usadostatus_header()en tu códigoEste código funcionó para mí:
add_action ('wp', 'force_404'); función force_404 () { global $ wp_query; // $ posts (si es necesario) if (is_page ()) {// su condición status_header (404); nocache_headers (); include (get_query_template ('404')); morir(); } }fuente
global $wp_query;$wp_query->is_404 = true;No recomendaría forzar un 404.
Si le preocupan los motores de búsqueda, ¿por qué no simplemente hacer un meta "sin índice, sin seguimiento" en esas páginas y bloquearlo con robots.txt?
Esta puede ser una mejor manera de bloquear la visualización del contenido.
Probablemente también podría usar este método para cargar,
404.phppero creo que usar una plantilla de página podría ser una mejor opción.fuente
fuente
locate_template(). Creo que esarobots.txt.no es una forma garantizada de protegerse de la indexación. Algunos motores de búsqueda aún pueden recoger la página. Quiero que la página se vea como una página 404 normal. Además, las publicaciones se agregarán dinámicamente, editar elrobots.txtarchivo agregará más problemas.Mi solución:
fuente
Los códigos de estado se envían en los encabezados de las solicitudes HTTP. Su función actual está enganchada en un gancho que se llamará demasiado tarde.
Debes intentar conectar tu función
rr_404_my_event()a la acciónsend_headers.No estoy seguro de si en ese momento es posible verificar la ID de la publicación, pero inténtelo:
fuente
404.phppodría cargar una diferenteheader.php, por ejemplo,<?php get_header('404'); ?>para cargarheader-404.php. En ese encabezado, agregaríaheader('HTTP/1.0 404 Not Found');en la<head>sección.Quería compartir la forma en que usé la solución marcada
Hice esto para separar todos los tipos de usuarios del administrador , en este proyecto, solo el administrador puede ver la
author.phppágina.Espero que pueda ayudar a alguien más.
fuente