Tout savoir sur WordPress

Rediriger vers l’article lorsque la recherche ne retourne qu’un résultat

Cette astuce permet d’améliorer la navigation de votre site en redirigeant vers le seul article d’une recherche fructueuse.

Voici une astuce sympa qui améliorera la navigation de l’utilisateur sur votre site. Lors d’une recherche, il arrive parfois qu’il n’y ait qu’un seul résultat retourné.

Au lieu de rediriger l’utilisateur vers la page de résultats de recherche et le laisser cliquer sur le lien de l’article, on va directement le rediriger vers l’article correspondant à sa recherche.

Si l’utilisateur cherchait un article en particulier et qu’il tombe directement sur l’article souhaité, je pense qu’il gardera une bonne image du site en partant.

Ajoutez cette fonction dans functions.php présent à la racine de votre thème :

add_action('template_redirect', 'redirect_search_to_single_post_result');
function redirect_search_to_single_post_result() {
    if( is_search() ) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            if( $wp_query->posts['0']->post_type == 'post' )
            	wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
        }
    }
}

template_redirect permet d’intercepter le choix d’affichage du template selon son contenu.

Ici, on intercepte la recherche et si on trouve ne qu’un seul article correspondant au résultat, on redirige vers ce dernier.

Cet article a été publié il y a 4321 jours - Il n'est peut être plus à jour !

Article écrit par Jean-David

20 Commentaires

  1. Merci pour l’astuce très efficace !
    Est-ce que dans le même esprit il serait possible lorsque qu’un internaute arrive via une recherche google sur une page de tag ne contenant qu’un résultat, de le rediriger directement sur la page ?

  2. Change juste is_search() par is_tag().

    is_tag() va faire la même chose que pour is_search, sauf que c’est pour les tags :)

  3. J’ai une “fatal error” en faisant çà. Il faut aussi modifier le add_action non ? Dsl je n’y connais pas grand chose…

  4. add_action('template_redirect', 'redirect_search_to_single_post_result');
    function redirect_search_to_single_post_result() {
        if( is_search() || is_tag() ) {
            global $wp_query;
            if ($wp_query->post_count == 1) {
                if( $wp_query->posts['0']->post_type == 'post' )
                	wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
            }
        }
    }
    
  5. tu as du avoir une fatal error car peut être as tu enlevé une parenthèse par inadvertance ?

  6. Pourtant je fais bien gaffe aux parenthèses… Voila le message d’erreur que j’obtiens :

    Fatal error: Cannot redeclare redirect_search_to_single_post_result() (previously declared in /homez.403/cheminverslefichier/functions.php:117) in /homez.403/cheminverslefichier/functions.php on line 136

  7. Je précise juste que j’ai déjà l’astuce de cet article dans le fichier function.php… Du coup, l’ “action” doit être en double dans la base de données j’imagine

  8. Cela veut dire que tu as mis deux fois la même fonction. Supprime tout ce que tu as ajouté, et rajoute ce code :

    add_action('template_redirect', 'redirect_search_to_single_post_result');
    
    function redirect_search_to_single_post_result() {
        if( is_search() || is_tag() ) {
            global $wp_query;
            if ($wp_query->post_count == 1) {
                if( $wp_query->posts['0']->post_type == 'post' ){
                    wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
                }
            }
        }
    }
    
  9. En suivant ton dernier conseil, aucune des 2 ne fonctionnent… Du coup je vais me contenter de la fonction première de ton article ! merci pour ton aide

  10. J’ai testé moi-même en ajoutant is_tag() avant de te proposer la solution, et cela fonctionne très bien. Si tu as une fatal error, c’est du à un conflit de doublon ou de parenthèse. Ce n’est pas bien grave, c’est juste dommage ^^, tant mieux si la première fonction te convient!

  11. Un dernier espoir peut-être, essaye de remplacer tous les guillemets de mon code par tes propres guillemets. Il y a sûrement une erreur de formatage.

  12. Fatal error: Cannot redeclare redirect_search_to_single_post_result() (previously declared in /homez.403/cheminverslefichier/functions.php:117) in /homez.403/cheminverslefichier/functions.php on line 136

    Cette erreur signifie que vous avez ajouté deux fois la même fonction. En PHP, on ne peut pas appeler deux fonctions avec le même nom :)

  13. En terme d’ergonomie c’est quand même – en l’état – une mauvaise idée : l’internaute n’a aucune idée de ce qu’il s’est passé entre sa saisie dans la recherche et son arrivée sur l’article… Serait-il possible d’ajouter un feedback pour l’utilisateur ( i.e. lui signaler qu’il a été redirigé car il n’y avait qu’un seul résultat, en ajoutant un sous-titre dans le contenu par exemple ) ?