web-dev-qa-db-fra.com

La structure de permalien personnalisée conduit à être 404 sur la pagination

J'ai un problème de permalien. Pour votre information, il existe plusieurs catégories dans un site Web et plusieurs publications dans une seule catégorie.

Mon paramètre de permalien est:

Structure personnalisée: /%category%/%postname%/

Catégorie de base:.

Après avoir enregistré ce paramètre, mon URL sera

www.mydomain.com/category-slug-name/

au lieu de

www.mydomain.com/category/category-slug-name/

J'ai défini les Les pages de blog affichent au plus: 8 messages sous Paramètres> Lecture . La pagination apparaîtra lorsqu'il y a plus de 8 articles dans une page de catégorie.

J'ai cliqué sur "page 2" et j'ai remarqué que www.mydomain.com/category-slug-name/page/2/ m'a amené à la page d'erreur 404.

À l'origine, l'URL de n'importe quelle catégorie "page2" est www.mydomain.com/category/category-slug-name/page/2/, il fonctionne bien s'il y a "catégorie" dans l'URL sous la forme de l'URL d'origine. Ou bien, ce serait la page d'erreur 404.

Mon souci principal est, je ne veux pas que la catégorie apparaisse dans l'URL. Mais je veux que le nom de slug de la catégorie apparaisse dans l’URL lorsque j affiche le message sélectionné. Et "/ page/2 /" et le reste fonctionnera bien.

Espérons que ce problème ne sera pas résolu avec les plugins recommandés. Parce que je ne veux pas que le site web soit trop lourd.

Aucune suggestion?

5
Jornes

C'est un comportement tout à fait normal. Si vous souhaitez supprimer la catégorie de base, vous devrez écrire des règles de réécriture personnalisées, et non des règles simples, je dois le dire. De mon point de vue, la suppression de la catégorie de base nécessite un travail supplémentaire dans chaque requête qui ne vaut rien car cela ne présente aucun avantage en termes de référencement ou de meilleure navigation sur le site. Certains plugins populaires, tels que WordPres SEO by Yoast, avaient cette option dans le passé et l'ont supprimée il y a quelque temps. Mais ce n'est qu'un avis.

Configurez la catégorie de base avec . (point), placez ce code dans le functions.php de votre thème, ou mieux dans un plugin, et videz les règles de réécriture (code de ce message dans 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;
}
10
cybmeta

Cela a fonctionné pour moi, ajoutez cette fonction à votre page functions.php dans wordpress et cette fonction changera comme ceci:

Précédent: http://www.example.com/advice/category/category_name/page/3/

Pour: 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');
2
Avinash Shukla
function 
 remove_category_slug_url($query_string){ 
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');

Cela a fonctionné pour moi, ajoutez ce code de fonction dans votre functions.php dans wordpress

remarque: allez dans paramètres-> permaliens et cliquez sur "enregistrer". Cela fera que WordPress reconstruira les règles de réécriture en tenant compte des nouvelles

1
ghanshyam v

Pour quiconque ayant ce problème, avec les redirections sur les pages paginées, les éléments suivants ont fonctionné pour moi:

Dans vos permaliens, changez: /% category% /% postname% /

à

/% catégorie% /% postname%

Notez la suppression de la barre oblique de fin "/".

Rob

0
robireland

Cela a fonctionné pour moi.

function remove_page_from_query_string($query_string){ 
   if ($query_string['name'] == 'page' && isset($query_string['page'])) {
       unset($query_string['name']);
       // 'page' in the query_string looks like '/2', so i'm spliting it out
      list($delim, $page_index) = split('/', $query_string['page']);
      $query_string['paged'] = $page_index;
   }      
   return $query_string;
} 
add_filter('request', 'remove_page_from_query_string');
0
Jhony Penagos