Luciano
En primer lugar, quiero dejar en claro que sé cuáles son las mejores prácticas cuando se trata de manejar errores 404. Sin embargo, tengo este caso específico en el que puedo necesitar un enfoque personalizado.
Estoy manejando un sitio de periódico que tiene más de 10 años de archivos, con más de 150k piezas de contenido trabajado arduamente y muchos enlaces en los que todavía se hace clic. También pasó por muchos problemas: 3 CMS diferentes antes de WP, cada uno con su propia estructura de enlaces y redirección incorrecta en cada cambio. Así que ahora los archivos están casi “perdidos” desde el punto de vista de SEO.
Con más del 90% del contenido extraviado, mostrar los 404 clásicos no es realmente una opción. La salida de emergencia fue redirigir las palabras en la URL a una consulta de búsqueda (después de filtrar las constantes) y esperar lo mejor. En la mayoría de los casos, el resultado relevante aparece en la parte superior, pero no siempre. Por esta razón, supongo que está mal pretender que el 404 simplemente no está allí.
El otro enfoque que pensé fue este: mantener la URL palabra por palabra, enviar el estado 404, pero usar la plantilla 404 para mostrar una consulta de búsqueda (WP_query
con el parámetro ‘s’) en las palabras relevantes.
Esto tiene la ventaja de que, en coincidencias sólidas (aquellas que seguramente serán “Me siento con suerte”), puedo decidir forzar una redirección 301 real. Sin embargo, ese no es siempre el caso: a veces, el artículo buscado real está muy abajo en la lista. Aún así, funcionaría casi bien, excepto que, por alguna razón, la paginación no funciona en 404. Así que ahora creo que hay que hacer una de dos cosas:
-
La solución simple, si solo es posible: de alguna manera hacer que la paginación funcione en la plantilla 404, ya que no tengo idea de por qué no lo hace ya, no sé si se puede hacer o cómo. (Actualización: lo más probable es que la consulta de paginación var/slug se trate como parte de la búsqueda)
-
La solución complicada, si solo es factible: use la plantilla de búsqueda en sí. El slug de ‘búsqueda’ se puede eliminar por completo conectando las reglas de reescritura con un
$wp_rewrite->search_base="";
En teoría, esto convierte casi cualquier URL que se le arroje en una búsqueda. El gran problema es que también lo hace para los nombres de las publicaciones y todo lo demás, excepto las categorías y las etiquetas. Entonces, lo que obtengo de esto es lo siguiente: siempre que haya una solicitud de URL, WordPress buscará si hay una categoría que coincida, luego una etiqueta y luego realizará una búsqueda. Solo después de eso buscará autores, archivos, publicaciones, etc. que coincidan. Si tan solo pudiera engancharme de alguna manera a las reglas internas de wordpress con respecto a la prioridad de análisis de URL y mover la búsqueda al final de la lista, el problema estaría resuelto.
Tendré que admitir que no probé ningún código real. No sé por dónde empezar, no sé exactamente qué buscar y también parece haber poca documentación para lo que quiero. Todo lo que pude hacer hasta ahora fue una prueba a ciegas, como se describe anteriormente.
Entonces, la pregunta es si hay alguna forma de hacer cualquiera de las anteriores y cómo.
Mateo Tinsley
La solución simple, si solo es posible: de alguna manera hacer que la paginación funcione en la plantilla 404, ya que no tengo idea de por qué no lo hace ya, no sé si se puede hacer o cómo.
Es difícil decir por qué la paginación no funciona sin ver el código de su plantilla 404.
La solución complicada, si solo es factible: use la plantilla de búsqueda en sí.
Puedes usar el template_include
filtro para cambiar la plantilla. También deberá cambiar manualmente la consulta principal a una consulta de búsqueda:
add_filter('template_include', function($template) {
if(!is_404()) {
return $template;
}
$search_query = new WP_Query(array('s' => get_query_var('name')));
if($search_query->have_posts()) {
// Replace the main query with the search query
global $wp_query;
$wp_query = $search_query;
// Change the response code
status_header(200);
// Use the search template
return get_search_template();
}
return $template;
});
Tenga en cuenta que, en circunstancias normales, la mejor práctica para modificar la consulta principal es utilizar el pre_get_posts
filtrar. Sin embargo, en este caso, no sabemos si se trata o no de un 404 hasta que después se ejecuta la consulta.
Además, estoy usando status_header
para cambiar el código de respuesta de 404 a 200 si la búsqueda arroja resultados. Si todo lo que intenta hacer es ofrecer el contenido correcto a los usuarios, entonces el código de respuesta probablemente no importe.
En la mayoría de los casos, el resultado relevante aparece en la parte superior, pero no siempre
Si decide que solo desea mostrar el primer resultado de la búsqueda, puede actualizar el código anterior para redirigir:
if($search_query->have_posts()) {
$url = get_permalink( $search_query->posts[0]->ID );
wp_redirect($url);
exit;
}
Actualización: Además, puede redirigir la solicitud a una búsqueda sin tener que preocuparse por modificar la plantilla 404 o cargar una plantilla diferente:
if($search_query->have_posts()) {
$url = get_search_link( get_query_var('name') );
wp_redirect($url);
exit;
}
-
“Es difícil decir por qué la paginación no funciona sin ver el código de su plantilla 404”. Probé con el bucle de wordpress predeterminado y funciona en todas las demás plantillas, excepto en esta. Empecé a sospechar que podría tener que ver con los argumentos/slug de consulta de paginación que se tratan como parte de la búsqueda. “Puede usar el filtro template_include para cambiar la plantilla. También tendrá que cambiar manualmente la consulta principal a una consulta de búsqueda” Lo intentaré, parece que puede ser.
– Luciano
7 de julio de 2015 a las 4:37
-
Aparentemente, la paginación no se puede hacer en este punto a menos que wordpress cambie las prioridades de análisis de URL o documente algún gancho para eso. Sin embargo, este es un buen paso adelante de lo que estaba usando.
– Luciano
11 de julio de 2015 a las 2:39
Podrías modificar tu idea original:
En la mayoría de los casos, el resultado relevante aparece en la parte superior, pero no siempre. Por esta razón, supongo que está mal pretender que el 404 simplemente no está allí.
Puede redirigir al usuario a una copia de su página de búsqueda con algún mensaje adicional como “Esta página se ha movido, ¿es una de estas?” (O, mejor aún, agregue dinámicamente ese mensaje a su página de búsqueda estándar si el usuario fue redirigido).
Dependiendo de cómo esté configurada su búsqueda, puede enviar la URL original como una variable POST de php para ejecutar la búsqueda, o analizarla en la página 404 y enviarla como una serie de variables GET.
¿O estoy malinterpretando alguna limitación al analizar su URL y enviarla en la búsqueda de wordpress?
-
Sí, nunca pensé en duplicar una plantilla existente, eso abre bastantes posibilidades. De hecho, estas cosas se pueden hacer con WordPress. La limitación está en que WP tiene su propia lista interna de prioridades con una solicitud de URL. Entonces, primero probará si es una categoría, si coincide con el servicio, de lo contrario, probará si es una etiqueta, si coincide con el servicio, de lo contrario, intentará una búsqueda, y a partir de este punto ya nada importa, como cualquier cosa (autor, fecha, taxonomía personalizada, publicación, etc.). ) se analiza en una búsqueda. En mi opinión, la búsqueda siempre debe ser la última, ya sea de forma predeterminada o al menos a través del truco que estoy buscando.
– Luciano
7 de julio de 2015 a las 4:43
¿Esa “plantilla 404” es algo específico de WP? De todos modos, ¿por qué no hacer la “paginación” a través de ajax? Cuando alguien se desplaza hacia abajo, ajax cargará los siguientes X resultados en la página activa sin recargar ni cambiar la URL…
– Marki555
3 de julio de 2015 a las 20:36
La plantilla no es específica, supongo que la forma en que funciona sí lo es. La paginación en realidad se realiza a través de ajax, pero las páginas de destino aún deben crearse en primer lugar, lo que no sucede.
– Luciano
5 de julio de 2015 a las 20:47