¿Hay algún gancho que altere la lógica 404?

27

Siempre que tenga una página 404 definida en su tema, Wordpress mostrará una página 404 si "etiqueta" está definida en $ wp_query-> query_vars, y no hay publicaciones que coincidan con esa etiqueta.

Estoy escribiendo un complemento que muestra información en cada página, además de las publicaciones. Me gustaría alterar la lógica 404 para que la página 404 se muestre si no hay publicaciones que coincidan con una etiqueta y el complemento no pueda extraer ningún dato que coincida con esa etiqueta. Si el complemento puede encontrar datos, me gustaría mostrar una página normal, independientemente de si hay publicaciones en esa página o no ...

He estado buscando en Google, leyendo código, leyendo el códice y hurgando por aquí, y no he podido averiguar dónde Wordpress activa ese 404 y cómo puedo anularlo. (Tengo la sensación de que podría tener algo que ver con status_header () en functions.php, pero no está claro cómo y cuándo necesito conectarme a él).

Cualquier ayuda / ideas / iluminación apreciada.

Gracias,

~ Parche

Parche
fuente

Respuestas:

29

Después de un poco más de trabajo a través del código y Google, encontré la respuesta. Está contenido en este hilo (vea la publicación de Otto42), pero para el registro, agregar lo siguiente a su complemento anulará el manejo 404 para las condiciones que especifique:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (<some condition is met>) {
        status_header( 200 );
        $wp_query->is_404=false;
    }
}

Tenga en cuenta que debe establecer "is_404" en falso antes de que PHP genere encabezados, por lo que es una buena idea conectarlo a la lógica template_redirect.

~ Parche

Parche
fuente
5

Necesitaba hacer lo mismo para un proyecto personalizado donde siempre había una página de 200, y descubrí que también puede simplemente agregar esto a la parte superior de su archivo de plantilla (arriba de get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;
sin entrada
fuente
1
¡Excelente! Esto funcionó para mí. Estaba haciendo mi script y generó 404. Traté de ejecutar scripts desde wp-> main pero esa no era una solución muy limpia. Esto funcionó para mí:// configuration require('./wp-load.php'); // init WP (inits objects, language and stuff). wp(); // fix title (this is not 404) $wp_query->is_404 = false; // doesn't fix the actual 404 status status_header( 200 ); // but this does :-)
Nux
1

Cree un 404.phparchivo de plantilla en su tema y personalícelo según sea necesario (agregando la salida de su complemento o lo que sea). Mencionas definido en tu tema , ¿qué es exactamente lo que está mal con este enfoque para ti?

Codex Creando una Página de Error 404

Rarst
fuente
Lo que estoy buscando es una forma de alterar las circunstancias bajo las cuales se activa esa página 404. En este momento, si Wordpress no puede encontrar ninguna publicación que coincida con una etiqueta en las variables de consulta, aparece la página 404. Me gustaría agregar un código adicional que garantice que la página 404 solo aparezca si Wordpress no puede encontrar ninguna publicación y mi complemento no puede encontrar ninguna información adicional para mostrar.
Parche el
El propósito de 404 es que el visitante sepa que el enlace es incorrecto y que usted lo registre y lo repare (si es necesario). No quiere decirle al visitante que está usando un enlace roto ni estar al tanto de eso usted mismo. Mostrar información en 404 funciona bien, secuestrarlo no es un requisito, entonces ¿por qué molestarse? Solo trato de comprender su lógica y / o tecnicismos.
Rarst
1
Lo que estaba buscando era una forma de cambiar la definición de qué páginas están "mal". El sitio que estoy construyendo tiene un componente de blog, pero eso no es todo el sitio. Estoy usando etiquetas de Wordpress para mostrar publicaciones de Wordpress y extraer contenido adicional a través del complemento. Quiero devolver un código de estado 200 si a) hay publicaciones ob) mi complemento puede encontrar cosas para mostrar que coincidan con la etiqueta. De ahí la necesidad de volver a cablear la lógica. De todos modos, gracias por tomarse el tiempo para escribir una respuesta. Lamento que mi problema fuera lo suficientemente extraño como para necesitar una respuesta más complicada :-)
Parche el