Incluir category-base en el enlace permanente de una publicación resulta en error 404
Tengo una página frontal estática y una página separada /noticias/
como página de publicaciones. Me gustaría tener URLs para publicaciones individuales como esta:
www.ejemplo.com/noticias/nombredecategoria/subcategoria/nombredepublicacion/
y para los archivos de categoría:
www.ejemplo.com/noticias/nombredecategoria/
Lo que ya he intentado:
Si agrego
noticias
como base de categoría y/noticias/%category%/%postname%/
como estructura personalizada de enlaces permanentes, obtengo las URLs deseadas pero también un error 404 para publicaciones individuales (tanto connoticias/
en la URL como sin él). Todas las demás páginas (ej. archivos de categoría, páginas, etc.) son accesibles.Si dejo la base de categoría vacía y los enlaces permanentes como
/noticias/%category%/%postname%/
, no hay errores 404, pero las URLs de categoría contienen adicionalmente el slug predeterminadocategory
, así:www.ejemplo.com/noticias/category/nombredecategoria/
Si uso plugins para eliminar la base de categoría predeterminada o simplemente configuro la base de categoría como
.
, se elimina junto con la parte denoticias
Si configuro los enlaces permanentes como
/%category%/%postname%/
y agrego solo la base de categoríanoticias
, tampoco hay errores 404, pero los enlaces a publicaciones no comienzan connoticias
:www.ejemplo.com/nombredecategoria/subcategoria/nombredepublicacion/
Hay algunas preguntas similares sin respuesta: Las publicaciones no se muestran con categorybase personalizado y subcategorías y ajustes en los enlaces permanentes de wordpress

Solo necesitas agregar "/." después de la base de categoría:
Base de categoría: news/.
(/. es requerido ya que evita errores 404 para las publicaciones).
Esto funcionó perfectamente para mí :)
EDITADO: Este campo eliminará las barras al principio o al final a menos que incluyas el "."

Recientemente volví a este problema y ¡finalmente encontré la solución! Puede que funcione o no para ti - hay dos posibles casos:
Si algunas publicaciones en tu sitio están colocadas bajo categorías principales y otras en subcategorías (categorías hijas), o las categorías tienen diferentes niveles de anidamiento (algunas categorías principales solo tienen subcategorías mientras que otras tienen sub-subcategorías), entonces no hay solución. Es imposible distinguir
noticias/categoria/nombre-de-publicacion/
denoticias/categoria/subcategoria/
con expresiones regulares en las reglas de reescritura.Si tienes un nivel de anidamiento fijo para todas las categorías y publicas solo en las subcategorías del último nivel, ¡entonces estás de suerte! Existe una solución bastante simple:
La razón de esas páginas 404 con noticias
tanto en la base de categoría como en la estructura de enlaces permanentes personalizados es que la regla interna de reescritura de la base de categoría tiene prioridad sobre las reglas de estructura de enlaces permanentes. Así que noticias/categoria/subcategoria/nombre-de-publicacion/
se interpreta como index.php?category_name=categoria/subcategoria/nombre-de-publicacion
y, obviamente, WordPress no puede encontrar tal categoría, devolviendo una página 404.
Lo que necesitas hacer es agregar una nueva regla de reescritura en la parte superior de la lista de reglas. Coloca este código en tu functions.php
o donde consideres apropiado:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// ¡Recuerda vaciar las reglas manualmente una vez después de agregar este código!
add_rewrite_rule(
// La expresión regular para coincidir con la URL entrante
'noticias/([^/]+)/([^/]+)/([^/]+)(/[0-9]+)?/?$',
// La URL interna resultante
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Agrega la regla en la parte superior de la lista de reescritura
'top' );
}
y luego actualiza la estructura de enlaces permanentes desde la página de Opciones Generales de WordPress. El código anterior es para un anidamiento de dos niveles, si tienes más o menos niveles en la estructura de categorías, entonces edita la expresión regular y la URL resultante en consecuencia.
P.D.: gracias a los contribuidores de estas respuestas útiles: ayuda con add_rewrite_rule y herramienta para analizar reglas de reescritura.

Aunque no hay una solución usando regex en las reglas de reescritura, todavía existe una forma de tener esta funcionalidad: http://wordpress.stackexchange.com/questions/98083/how-can-you-load-the-categories-page-from-a-hook/98095#98095

Estructura personalizada de enlaces permanentes: /media/%category%/%postname%/
Base para categorías: .
Funcionó para mí en WordPress 3.4.1, sin necesidad de plugins relacionados.
Actualización: Posteriormente noté que wp_list_categories
genera enlaces sin "media" en la URL. Sin embargo, los posts son accesibles con la estructura de URL deseada, y los archivos de categorías están en el lugar correcto.
Actualmente estoy investigando cómo modificar el comportamiento de wp_list_categories.

Gracias por la respuesta, pero hay 2 problemas: no puedo acceder a los archivos de categorías (tanto con media
como sin él, usando la misma versión 3.4.1), y los enlaces generados realmente contienen /./
en sus direcciones.

Eso es extraño. Supongo que puede haber 2 razones: 1. Alguno de tus plugins está causando efectos secundarios. 2. Mi configuración inicial de WordPress es de alguna manera diferente. Estoy usando http://qwordpress.ru/ con actualización inmediata a la versión actual de WP. Y en ese caso lo primero en lo que trabajé fue la estructura de categorías y URLs, así que la configuración era bastante limpia.

Mejor publicaría un comentario, pero por ahora no puedo. Tu código funciona perfectamente, pero si no quieres romper los feeds RSS por categoría, debería verse así:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Recuerda vaciar las reglas manualmente una vez después de agregar este código!
add_rewrite_rule(
// La expresión regular para coincidir con la URL entrante
'news/([^/]+)/([^/]+)/([^/][^f][^e][^e][^d]+)(/[0-9]+)?/?$', //aquí mis cambios para excluir 'feed'
// La URL interna resultante
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Agrega la regla al principio de la lista de reescritura
'top' );
}
De cualquier forma, gracias por el gran ejemplo de código. :)
