Incluir category-base en el enlace permanente de una publicación resulta en error 404

14 jul 2012, 09:29:23
Vistas: 17.9K
Votos: 6

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 con noticias/ 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 predeterminado category, 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 de noticias

  • Si configuro los enlaces permanentes como /%category%/%postname%/ y agrego solo la base de categoría noticias, tampoco hay errores 404, pero los enlaces a publicaciones no comienzan con noticias: 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

0
Todas las respuestas a la pregunta 4
0

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 "."

30 may 2017 02:16:45
1

Recientemente volví a este problema y ¡finalmente encontré la solución! Puede que funcione o no para ti - hay dos posibles casos:

  1. 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/ de noticias/categoria/subcategoria/ con expresiones regulares en las reglas de reescritura.

  2. 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.

15 sept 2012 10:28:56
Comentarios

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

Jeremy Jeremy
2 may 2013 20:09:49
2

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.

22 ago 2012 08:40:59
Comentarios

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.

semyonfilippov semyonfilippov
23 ago 2012 09:21:17

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.

Leo Eidinov Leo Eidinov
24 ago 2012 09:55:50
0

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. :)

19 ene 2015 02:55:02