WordPress propose un éditeur WYSIWYG plutôt riche et bien fichu. La possibilité d’insérer un contenu riche (lien, image, etc.) est à portée de tout le monde. Nous allons nous concentrer sur les chemins des liens et des images pour voir comment travaille cet éditeur.

Note : l’article sur Deluxe Tips apporte une solution qui semble bien plus complète à ce « problème » d’url absolue. Je vous invite à le consulter. Je ne supprime pas mon propre article pour archive, mais considérez-le comme obsolète.

Contenu inséré par l’éditeur

WordPress dispose de deux boutons pour insérer médias et liens. Le bouton des médias situé au dessus du cadre de l’éditeur permet l’insertion d’une image, par exemple.
Si l’on regarde l’attribut src du code généré, voici ce qui ressort (code simplifié) :

<img src="http://yourawesomewebsite.us/wp-content/uploads/2012/02/image.png" alt="" />

Pour les liens, le bouton  situé sur la première ligne des outils de l’éditeur permet leur insertion.

En utilisant le nouvel outil de liens internes, il est possible de faire des liens vers d’autres ressources de son propre site web (page et article).
Ces liens ont un attribut href absolu, eux aussi.

<a href="http://yourawesomewebsite.us/a-propos">la page à propos</a>

Inconvénient

Si jamais il vous prenait l’envie de déménager votre blog sur un nouveau domaine ou sous-domaine, vous seriez bien embêtés !
En effet, il vous faudrait créer une petite moulinette (requête SQL par exemple) pour intervenir sur les bases de données de WordPress, ou vous retaper les articles à la main.

Il y a une légende urbaine chez certains experts en référencement qui dit que les liens internes relatifs sont à privilégier aux liens absolus. Mais le seul expert SEO que j’ai consulté m’a dit « tant qu’on arrive sur la bonne page ». Légende, ok, faites-en ce que vous voulez !

Solution ?

Cela n’a rien d’absolu, mais mes premiers essais sont plutôt concluants :

Dans functions.php glisser ce code :

if (!function_exists('juiz_absolute_2_relative')) {
   function juiz_absolute_2_relative($post_ID, $post) {
      // ScreenFeed - suggestion (http://screenfeed.fr)
      if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
         return $post->ID;

      $nonce_action = 'update-' . $post->post_type . '_' . $post->ID;
      if ( !isset($_POST[ '_wpnonce' ]) || !wp_verify_nonce( $_POST[ '_wpnonce' ], $nonce_action ) )
         return $post->ID;

      $post_type = get_post_type_object( $post->post_type );
      if ( !current_user_can( $post_type->cap->edit_post, $post->ID ) )
         return $post->ID;

      // CreativeJuiz - replace absolute by relative link
      $siteurl = get_bloginfo('url');

      // if we are in sub folder installation (/!\) be carefull (/!\)
      $after_domain = preg_replace('#http(s)?://(.+)/(.+)#', '$3', $siteurl);

      // absolute links to relative links
      $new_content = preg_replace('#href="'.$siteurl.'#', 'href="/'.$after_domain, $post->post_content);

      //absolute src to relative src
      $new_content = preg_replace('#src="'.$siteurl.'#', 'src="/'.$after_domain, $new_content);
      
      // save the post
      global $wpdb;
      $wpdb->update( $wpdb->posts, array( 'post_content' => $new_content ), array( 'ID' => $post->ID ) );
   }
   add_action( 'save_post', 'juiz_absolute_2_relative', 10, 2 );
}

Une fois ce code enregistré dans functions.php, lors d’un enregistrement d’un post, le script vérifiera s’il croise une valeur absolue des attributs src ou href et les passera en relative (à condition qu’il reconnaisse la base de l’URL de votre site WordPress).

Attention : cette technique fonctionne dans le cas d’un blog en sous-dossier (comme ici : http://creativejuiz.fr/blog/), mais n’a aucun intérêt puisqu’en cas de déménagement du blog, les URLs conservées auront cette forme : /blog/wp-content[…]

Le code détecte la valeur de bloginfo('url') et prend en compte une installation dans un dossier (avec la nuance précédemment citée) ou en sous-domaine, ainsi qu’une installation plus classique bien évidemment.

Ce script ne modifie pas les URL déjà écrites dans les articles existants.

Une alternative ?

Il existe un plugin qui vous permet d’effectuer un changement d’URL de base pour votre blog.
Ce plugin une fois activé vous offre deux champs texte à renseigner avec : l’ancienne URL, la nouvelle URL.
Il se charge de remplacer dans la base de données toutes les occurences de l’ancienne par la nouvelle URL.
Ce plugin ne vous permet pas d’avoir des liens relatifs !

WordPress.org
Plugin
Velvet blues update

Note : l’article sur Deluxe Tips apporte une solution qui semble bien plus complète à ce « problème » d’url absolue. Je vous invite à le consulter. Je ne supprime pas mon propre article pour archive, mais considérez-le comme obsolète.

Bref…

N’hésitez pas à me faire vos retours si jamais vous rencontrez un bogue, difficile d’avoir toutes les exceptions en tête 😉