[WordPress] Utiliser des URL relatives pour vos ressources et liens


L’utilisation d’URL relatives (c’est à dire commençant par / plutôt que par http://tondomaine.tld/) est un vieux serpent de mer avec WordPress. J’ai lu une tonne de forums sur le sujet, avec des solutions crados et certaines relativement propres.

Jusqu’au jour où je me suis aperçu que WordPress propose, comme bien souvent, une solution native dans l’API : wp_make_link_relative().

Cette fonction se trouve dans le fichier wp-includes/formatting.php.

Son utilisation est très simple :

wp_make_link_relative('http://blog.websourcing.fr/tag/wordpress');

Ce code renverra /tag/wordpress.

Outre le fait que travailler avec des URL relatives permet de transférer un site sans mal d’un domaine à un autre, cela permet aussi de réduire un peu le poids du fichier HTML rendu (les pisses-froids docte-professeurs vont me dire que c’est marginal, oui, mais c’est toujours ça de pris).

L’idée est donc de faire en sorte que tout ce qui est affiché par le moteur WordPress utilise cette fonction avant le rendu. Et là, les filtres sont vos amis.

On a par exemple le filtre post_link qui intervient lors du rendu des articles de type post. Idem avec page, attachement, term, et même pour les CPT post_type.

On utilisera alors le filtre de la sorte :

add_filter( 'post_link', 'wp_make_link_relative' );
// et ainsi de suite avec les autres filtre page_link, term_link, ...

 
Vous vous dites super ce truc. Sauf qu’il y a un gros hic. Si vous laissez les choses ainsi, les urls seront relatives aussi dans les flux RSS et les sitemaps. Et ça vos lecteurs et Google risque de ne pas aimer. Comme toujours il y a une solution que j’ai trouvé sur DeluxeBlogTips.

Il crée une fonction intermédiaire afin d’exclure ces derniers.

    add_action( 'template_redirect', 'rw_relative_urls' );
    function rw_relative_urls() {
    // Don't do anything if:
    // - In feed
    // - In sitemap by WordPress SEO plugin
    if ( is_feed() || get_query_var( 'sitemap' ) )
    return;
    $filters = array(
    'post_link',
    'post_type_link',
    'page_link',
    'attachment_link',
    'get_shortlink',
    'post_type_archive_link',
    'get_pagenum_link',
    'get_comments_pagenum_link',
    'term_link',
    'search_link',
    'day_link',
    'month_link',
    'year_link',
    );
    foreach ( $filters as $filter )
    {
    add_filter( $filter, 'wp_make_link_relative' );
    }
    }

Notez au passage sa technique élégante pour monter tous les filtres, et les autres filtres qu’il emploie.

 
Mon conseil avec de genre de technique est d’y aller progressivement. Appliquez la sur les billets, puis sur les pages, … et ainsi de suite. Ca vous permettra de contrôler que tout va bien.

La seule question qui demeure est de savoir si les ressources type CSS et JS utilisées avec la fonction enqueue_XXX sont aussi mise à la sauce relative. Réponse bientôt après un test.

Des questions, des remarques ? N’hésitez pas à partager.