Fermer

mars 6, 2024

WordPress : Comment rediriger 301 les pages de pagination vers l’URL parent

WordPress : Comment rediriger 301 les pages de pagination vers l’URL parent


C’est peut-être anecdotique, mais je trouve que Console de recherche Google devient plus complet dans ses rapports. À tel point que j’ai commencé à m’y appuyer de plus en plus… notamment pour identifier les pages introuvables sur le site qui pourraient avoir un impact négatif sur les classements de recherche.

Le thème de mon site intègre une approche où les visiteurs peuvent cliquer charger plus s’ils souhaitent voir des publications supplémentaires pour la page d’accueil, les archives de catégories, les archives de balises ou même les résultats de recherche. Cette expérience utilisateur (UX) l’amélioration supprime la pagination, où un utilisateur (ou un robot de recherche) parcourrait les pages et les résultats des articles de blog.

Cependant, malgré l’activation de cette fonctionnalité sur mon site, Google pense toujours que j’ai une pagination et qu’il y a des erreurs sur le site où ces pages ne se trouvent plus. Si j’allais sur l’une de ces pages répertoriées dans Google Search Console, cela aboutissait à un 404. Google pense qu’il y a un problème avec mon site alors que ce n’est pas le cas.

Pour remédier à cela, j’avais besoin de créer une redirection personnalisée dans mon thème enfant functions.php qui prend n’importe lequel de ces /pages/# et les redirige vers leur parent. Une exception dont j’avais besoin était mon type de publication personnalisé pour mon acronymes.

Aujourd’hui, j’ai étendu cette amélioration à mon thème enfant qui s’adapte à l’un des scénarios ci-dessus :

  • /page/{number} – Ma page d’accueil est l’archive de mon blog, cela donnerait donc un 404 avec ma fonctionnalité de chargement supplémentaire. Désormais, n’importe quelle page sera redirigée vers ma page d’accueil.
  • /tag/{tag-slug}/page/{number} – Mes pages de balises donneraient lieu à un 404 avec ma fonction de chargement. Désormais, n’importe quelle page sera redirigée vers le parent /tag/{tag-slug}/
  • /category/{category-slug}/page/{number} – Mes pages de catégorie donneraient lieu à un 404 avec ma fonction de chargement. Désormais, n’importe quelle page de catégorie sera redirigée vers le parent /category/{category-slug}/
  • /{category-slug}/page/{number} – Mes pages de catégories se suppriment /category/ et cela donnerait un 404 avec ma fonction de chargement. Désormais, n’importe quelle page de catégorie sera redirigée vers le parent /{category-slug}/

Cependant, mes pages d’acronymes sont toujours indexables :

  • /acronym/page/{number} existe toujours et peut être exploré et indexé.

Code du thème enfant

add_action('init', 'custom_redirect_with_exceptions');
function custom_redirect_with_exceptions() {
    // Regular expression to match paths ending with /page/number
    if (preg_match('/^(\/[^\/]+)\/page\/\d+/', $_SERVER['REQUEST_URI'], $matches)) {
        $base_path = $matches[1]; // Capture the base path
        
        // List of base paths to exclude from redirection (e.g., custom post types)
        $exclusions = ['/acronyms']; // Replace with your actual base paths

        // Check if the base path is not in the exclusions list
        if (!in_array($base_path, $exclusions)) {
            // Check for tag or general slug
            if (preg_match('/^\/tag/', $_SERVER['REQUEST_URI'])) {
                // Specific logic for tag redirection: remove '/tag' prefix
                $redirect_base = str_replace('/tag', '', $base_path);
            } else {
                // General slug logic: use the base path as is
                $redirect_base = $base_path;
            }
            
            // Construct the new URL to redirect to the base path without pagination
            $new_url = home_url($redirect_base);
            
            // Redirect to the new URL with a 301 permanent redirect status
            wp_redirect($new_url, 301);
            exit;
        }
        // No action is taken if the URL is in the exclusions list
    }
    // Check if the URL is just a paginated home URL
    else if (preg_match('/^\/page\/\d+/', $_SERVER['REQUEST_URI'])) {
        // Redirect paginated home URLs to the home page
        wp_redirect(home_url("https://martech.zone/"), 301);
        exit;
    }
}

Le code vérifie d’abord si l’URL correspond à un format paginé excluant les chemins spécifiés. Si c’est le cas et qu’il ne s’agit pas d’un chemin exclu, il redirige vers une version non paginée de ce chemin. Si l’URL est une URL d’accueil paginée, elle redirige vers la page d’accueil. Explication:

  • add_action('init', 'custom_redirect_with_exceptions');: Accroche la fonction custom_redirect_with_exceptions dans le processus d’initialisation de WordPress.
  • function custom_redirect_with_exceptions() { ... }: Définit la fonction qui gérera la logique de redirection.
  • À l’intérieur de la fonction :
  • preg_match('/^(\/[^\/]+)\/page\/\d+/', $_SERVER['REQUEST_URI'], $matches): utilise une expression régulière pour vérifier si l’URL actuelle suit le modèle d’un chemin de base suivi de /page/ et un nombre (par exemple, /category-name/page/2). Si tel est le cas, le chemin de base est capturé et stocké dans $matches[1].
  • $base_path = $matches[1];: stocke le chemin de base capturé depuis l’URL dans la variable $base_path.
  • $exclusions = ['/acronyms'];: définit un tableau de chemins de base qui ne doivent pas être redirigés s’ils correspondent au chemin de base de l’URL actuelle.
  • if (!in_array($base_path, $exclusions)) { ... }: Vérifie si le chemin de base capturé n’est pas dans la liste des exclusions.
    • À l’intérieur de ce conditionnel :
    • if (preg_match('/^\/tag/', $_SERVER['REQUEST_URI'])) { ... }: Détermine si l’URL commence par /tag/indiquant qu’il s’agit d’une URL de balise.
      • Si vrai: $redirect_base = str_replace('/tag', '', $base_path);: Supprime /tag à partir du chemin de base, en le préparant pour la redirection vers la page principale de la balise.
      • Autre: $redirect_base = $base_path;: s’il ne s’agit pas d’une URL de balise, utilise le chemin de base tel quel pour la redirection.
    • $new_url = home_url($redirect_base);: Construit la nouvelle URL vers laquelle rediriger, en supprimant la pagination mais en préservant le chemin de base.
    • wp_redirect($new_url, 301);: redirige l’utilisateur vers l’URL construite avec un code d’état 301 (déplacé de manière permanente).
    • exit;: arrête la suite du traitement pour garantir que la redirection prend effet immédiatement.
  • else if (preg_match('/^\/page\/\d+/', $_SERVER['REQUEST_URI'])) { ... }: Vérifie si l’URL est un format d’URL d’accueil paginée, comme /page/2.
    • À l’intérieur de ce conditionnel :
    • wp_redirect(home_url("https://martech.zone/"), 301);: redirige les URL d’accueil paginées vers la page d’accueil.
    • exit;: arrête le traitement ultérieur, garantissant que la redirection est exécutée.




Source link