Estructura de enlaces permanentes personalizada causa error 404 en paginación

22 dic 2014, 09:25:43
Vistas: 14.2K
Votos: 8

Tengo un problema con los enlaces permanentes. Para su información, hay varias categorías diferentes dentro de un sitio web y hay muchas publicaciones en una sola categoría.

Mi configuración de enlaces permanentes es:

Estructura personalizada: /%category%/%postname%/

Base de categoría: .

Después de guardar esta configuración, mi URL será:

www.midominio.com/slug-de-categoria/

en lugar de

www.midominio.com/categoria/slug-de-categoria/

He configurado Las páginas del blog muestran como máximo: 8 publicaciones en Ajustes > Lectura. La paginación aparecerá cuando haya más de 8 publicaciones en una página de categoría.

Hice clic en "página 2", y noté que www.midominio.com/slug-de-categoria/page/2/ me llevó a una página de error 404.

Originalmente, la URL de cualquier "página2" de categoría es www.midominio.com/categoria/slug-de-categoria/page/2/, funciona bien si hay "categoria" dentro de la URL como URL original. De lo contrario, sería una página de error 404.

Mi principal preocupación es que no quiero que la categoría aparezca en la URL. Pero quiero que el slug de la categoría aparezca en la URL cuando veo la publicación seleccionada. Y que "/page/2/" y el resto funcionen correctamente.

Espero que este problema no se resuelva con plugins recomendados. Porque no quiero que el sitio web sea demasiado pesado.

¿Alguna sugerencia?

0
Todas las respuestas a la pregunta 5
11
17

Ese es un comportamiento totalmente normal. Si deseas eliminar la base de categoría, necesitarás escribir algunas reglas de reescritura personalizadas, no son reglas simples debo decir. Desde mi punto de vista, eliminar la base de categoría requiere un trabajo extra en cada solicitud que no vale la pena porque no proporciona ninguna ventaja para SEO o para una mejor navegación del sitio. Algunos plugins populares, como WordPress SEO de Yoast, tenían esta opción en el pasado y la eliminaron hace algún tiempo. Pero esto es solo una opinión.

Configura la base de categoría como . (punto), coloca este código en el functions.php de tu tema, o mejor en un plugin, y limpia las reglas de reescritura (código de este post en Daily Web Kit):

add_filter( 'category_rewrite_rules', 'vipx_filter_category_rewrite_rules' );
function vipx_filter_category_rewrite_rules( $rules ) {
    $categories = get_categories( array( 'hide_empty' => false ) );

    if ( is_array( $categories ) && ! empty( $categories ) ) {
        $slugs = array();
        foreach ( $categories as $category ) {
            if ( is_object( $category ) && ! is_wp_error( $category ) ) {
                if ( 0 == $category->category_parent ) {
                    $slugs[] = $category->slug;
                } else {
                    $slugs[] = trim( get_category_parents( $category->term_id, false, '/', true ), '/' );
                }
            }
        }

        if ( ! empty( $slugs ) ) {
            $rules = array();

            foreach ( $slugs as $slug ) {
                $rules[ '(' . $slug . ')/feed/(feed|rdf|rss|rss2|atom)?/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules[ '(' . $slug . ')/(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules[ '(' . $slug . ')(/page/(\d)+/?)?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[3]';
            }
        }
    }
    return $rules;
}
22 dic 2014 10:21:56
Comentarios

He seguido tus instrucciones al pie de la letra. Pero, la "/page/2" todavía no funciona. ¿Hay alguna otra solución para hacer que funcione? ¡Gracias!

Jornes Jornes
22 dic 2014 10:47:13

Probé el código antes de publicarlo y funciona. Por favor, como se menciona en la respuesta, recuerda vaciar las reglas de reescritura (después de copiar y guardar el código, ve a ajustes->enlaces permanentes y haz clic en "guardar". Esto hará que WordPress reconstruya las reglas de reescritura tomando en cuenta las nuevas).

cybmeta cybmeta
22 dic 2014 10:52:06

¡Hola! Lo intenté. Tu código para la función funciona. Pero, no puedo poner el "punto" en la base de la categoría, y necesito usar el "Redireccionamiento 301" para redirigir todos los "dominio.com/categoria/slug-de-categoria/" a "dominio.com/categoria/slug-de-categoria/". Solo la "/page/2/" funciona por ahora.

Jornes Jornes
22 dic 2014 12:00:06

Probé con el "punto" en la base de la categoría como ves en la respuesta, de hecho ese punto es necesario. No mencionaste ninguna redirección y la forma en que has implementado la redirección me es desconocida, ese es otro problema que necesita otro hilo.

cybmeta cybmeta
22 dic 2014 12:04:36

Hola Cybmeta, el punto realmente no funciona en mi caso. ¡Está bien! Por cierto, gracias por tu ayuda también. Aún así votaré por tu respuesta ya que me ayudaste. :)

Jornes Jornes
23 dic 2014 04:21:51

Sería mejor si encontramos la solución ;). Dijiste en la pregunta que el "punto" funciona y no entiendo por qué no funciona ahora; el código publicado en la respuesta maneja la paginación y los feeds pero no tiene nada que ver con el "punto". Cuando dices que no funciona, ¿quieres decir que no funciona si usas el código de la respuesta o que no funciona incluso sin ese código?

cybmeta cybmeta
23 dic 2014 10:35:01

Las páginas "/page/2/ y más" no funcionan (redirigen a 404) si inserto el "punto" dentro del campo de "Base de categoría" después de aplicar tu código a mi archivo functions.php. Las páginas "/page/2/ y más" funcionan bien después de quitar el "punto" del campo "Base de categoría". Pero, la condición para que funcione es que necesito usar la regla de reescritura en mi archivo htaccess para redirigir "/category/nombre-del-slug-de-categoria" a "/nombre-del-slug/".

Jornes Jornes
24 dic 2014 16:01:11

¿Has vaciado las reglas de reescritura después de aplicar el código? Como dije, el código publicado funciona bien aquí. Tal vez tienes más código afectando las reglas de reescritura de categorías. Prueba con todos los plugins desactivados y con un tema predeterminado. Por cierto, la redirección en el archivo htaccess solo debería hacerse únicamente si estás en un sitio en vivo que estaba usando la estructura de URL antigua en el pasado, para no perder posicionamiento SEO y no perder usuarios que vienen desde una URL antigua; hacer esa redirección en un sitio nuevo no tiene sentido.

cybmeta cybmeta
25 dic 2014 20:04:23

¡Sí! Lo intenté según tus instrucciones. Pero no funcionó.

Jornes Jornes
26 dic 2014 18:31:23

Funcionó como se anunciaba para mí. También gracias por poner el código directamente en tu respuesta ya que el enlace al blog ya no es válido.

The Unknown Dev The Unknown Dev
3 nov 2016 21:31:59

Hay un error en esta respuesta si la paginación no funciona para ti - página 10 y más => solución: cambia esto (\d)+ por esto (\d+) y ve a los ajustes de Enlaces permanentes y guarda de nuevo... (vacía las reglas de reescritura)

jave.web jave.web
23 mar 2017 18:59:00
Mostrar los 6 comentarios restantes
1

Esto funcionó para mí, Agrega esta función en tu archivo functions.php de WordPress y esta función cambiará tus enlaces:

Anterior: http://www.example.com/advice/category/category_name/page/3/

A: http://www.example.com/advice/category_name/page/3/

function remove_category_slug_url($query_string){ 
    if ($query_string['name'] == 'page' && isset($query_string['page'])) {
        unset($query_string['name']);
        list($delim, $page_index) = explode('/', $query_string['page']);
        $query_string['paged'] = $page_index;
    }      
    return $query_string;
}
add_filter('request', 'remove_category_slug_url');
8 abr 2017 08:06:27
Comentarios

de alguna manera solo muestra las publicaciones de la primera página en todas mis demás páginas siguientes...

André Kelling André Kelling
18 dic 2020 10:45:28
0
function 
 remove_category_slug_url($query_string){ 
// Elimina el slug de categoría de la URL
if ($query_string['name'] == 'page' && isset($query_string['page'])) {
    unset($query_string['name']);
    list($delim, $page_index) = split('/', $query_string['page']);
    $query_string['paged'] = $page_index;
}      
return $query_string;
 }
 add_filter('request', 'remove_category_slug_url');

Esto funcionó para mí, agrega este código de función en tu archivo functions.php de WordPress

Nota: ve a ajustes->enlaces permanentes y haz clic en "guardar". Esto hará que WordPress reconstruya las reglas de reescritura tomando en cuenta las nuevas

8 abr 2017 08:27:09
0

Esto funcionó para mí.

function remove_page_from_query_string($query_string){ 
   if ($query_string['name'] == 'page' && isset($query_string['page'])) {
       unset($query_string['name']);
       // 'page' en query_string luce como '/2', así que lo separo
      list($delim, $page_index) = split('/', $query_string['page']);
      $query_string['paged'] = $page_index;
   }      
   return $query_string;
} 
add_filter('request', 'remove_page_from_query_string');
23 sept 2015 18:28:34
0

Para cualquier otra persona que tenga este problema con las redirecciones en páginas paginadas, lo siguiente me funcionó:

En tus enlaces permanentes, cambia: /%category%/%postname%/

por

/%category%/%postname%

Observa la eliminación de la barra inclinada final "/".

Rob

16 abr 2018 14:37:33