Tout savoir sur WordPress
Tutoriel WordPress

Améliorer les résultats de recherche des liens internes

La fonctionnalité des liens internes de WordPress comporte quelques inconvénients. Découvrez la démarche à suivre pour améliorer et d’affiner les résultats de recherche de liens internes.

Depuis la version 3.1 de WordPress, il est possible de créer des liens internes entre vos articles de façon simple et intuitive. A partir d’un module de recherche, il suffit d’indiquer un mot pour trouver l’un de vos articles et d’insérer un lien vers cet article dans celui que vous êtes entrain de rédiger.

Malgré tous les avantages que cette fonctionnalité apporte, elle présente quelques inconvénients non-négligeables.

Tout d’abord, la recherche s’effectue uniquement par rapport au contenu de nos articles. Cela explique que les résultats sont souvent nombreux et sans correspondre à la recherche initiale. En effet, dans la plupart des cas, on recherche surtout un mot présent dans le titre d’un article et non pas dans son contenu.

Ensuite, quand on crée un article en avance, on ne peut pas lier un article en attente de publication car seuls ceux qui sont déjà publiés se trouvent dans les résultats.

Dans cette astuce, je vous propose de modifier le comportement de la recherche afin de pouvoir trouver un article par rapport à son titre. Puis, je ferai en sorte que les articles en attente de publication soient aussi présents dans les résultats.

Pour cela, copier le code ci-dessous dans le fichier functions.php présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

if( is_admin() ):
function baw_better_internal_link_search( $search, &$wp_query ) {
	
    global $wpdb;
    
    // si pas de recherche, je la renvoie vide
    if( !isset( $_POST['action'] ) || $_POST['action']!='wp-link-ajax' || empty( $search ) )
             return $search;

    // Selon si la recherche est une recherche exacte ou pas, j'ajouterai des % dans mon LIKE
    $n = !empty( $wp_query->query_vars['exact'] ) ? '' : '%';
    
    //Init pour éviter des notices
    $search = '';
    $searchand = '';
        
    /* ASTUCE 1 */
    // Pour chaque term passé dans la recherche, je vais les sanitizer avec esc_sql et like_escape
    // puis je construis ma chaîne de recherche SEULEMENT dans post_title !
    foreach( (array) $wp_query->query_vars['search_terms'] as $term ):
	$term = esc_sql( like_escape( $term ) );
	$search.= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}'))";
	$searchand = ' AND ';
    endforeach;

    // Cette fois si la recherche n'est pas vide, je l'ajoute
    if ( !empty( $search ) )
	 $search = " AND ({$search}) ";

    /* ASTUCE 2 */
    // Je récupère les status des posts filtrés dans la requête et j'ajoute si besoin le status "FUTURE"
    // afin de pouvoir faire des liens vers mes articles prévus dans le futur.
    $post_status = (array)$wp_query->query_vars['post_status'];
    if ( !in_array( 'future', $post_status ) ):
	$post_status[] = 'future';
	$wp_query->set( 'post_status', $post_status );
    endif;
    
    // Et on renvoie la recherche
    return $search;
}
add_filter('posts_search', 'baw_better_internal_link_search', 10, 2 );
endif;

[/pastacode]
Les 2 astuces se trouvent dans le même code et c’est plutôt court. Pour la première, j’ai repris la requête d’origine pour supprimer le $wpdb->posts.post_content LIKE. Pour la seconde, j’ajoute le statut “future” si il n’est pas déjà ajouté par un autre hack ou plugin.

Voici quelques captures d’écran pour vous montrer la différence des résultats. Pour ces exemples, le titre de mon article est “Mon premier article !” et qu’il contient “Super !” dans son contenu.

Maintenant, je décide de modifier la date de l’article “Mon premier article !”. Pour l’exemple, j’ai choisi une date de publication prévue pour l’année 2013 :

Pour terminer, voici le résultat quand on met en place l’astuce :

Avec astuce

Je trouve que cette recherche est plus logique et plus agréable. Qu’en pensez-vous ?

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

Article écrit par Julio P.

Fondateur de SecuPress, l’extension de sécurité WordPress, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

19 Commentaires

  1. C’est pas mal… même si je n’utilise pas la recherche interne -comme j’écris en Markdown, les manip pour transformer le code prend autant de temps qu’une recherche directe sur le blog.

  2. Très bonne astuce. Je vais la mettre sur le blog parce qu’elle risque de me servir régulièrement :) Surtout pour me permettre de faire un lien vers un article en attente de publication.

  3. Han ! Twingo double bug fail tourniquet infernal Marilyn Manson.
    1 – Le script tue la recherche disponible dans le listing des articles (wp-admin/edit.php en haut à droite).
    2 – $wp_query->query_vars[‘post_status’] n’est pas défini dans mon cas, donc Notice (peut-être lié au bug précédant).

  4. Code mis à jour suite à la découverte du tourniquet evanescence fallen bug de Greg. Merci à toi !
    Si vous aviez déjà utilisé le code, mettez vous à jour :)

  5. Superbe astuce. Je met ça en place des demain. Pas grand chose à dire à part: merci et push it to the core

  6. @leslie : Ce n’est pas le sujet de cette astuce. Ici je parle bien des résultats de recherches des liens internes, nous sommes dans l’administration, création/édition d’un article, puis création d’un lien interne dans l’article. Les captures montrent bien ces écrans, rien à voir avec la recherche par défaut de WordPress.
    Sommes nous sur la même longueur d’ondes ?

  7. Bonjour,
    Merci pour cette astuce. Je vais tester sur mon blog car cela peut faire gagner un temps précieux mais je me pose juste des questions sur la pertinence du choix des liens internes.

    amicalement

  8. Plusieurs mois après, je découvre l’astuce. Bravo pour ce bout de code très utile. Comme le dit FxB, cela mériterait de le mettre dans le core ;)

  9. Tout le système de recherche est à refaire dans WP, le jour où les devs s’y pencheront, on glissera ça :p
    merci à toi

  10. Je n’ai plus aucun problème avec la recherche classique mais quand même, il faut ne pas manque le gain en temps tiré à partir de cette astuce.
    Bon codage!

  11. J’ai mis ce code et c’est top !!
    comment on pourrai faire pour avoir ces mêmes résultats de recherche avec le widget search de WP ?
    merci