Ajouter la valeur d’un champ personnalisé dans un permalien de WordPress

5 commentaires
Ajouter la valeur d’un champ personnalisé dans un permalien de WordPress
Avoir la main sur ses permaliens, c'est essentiel ! Leurs ré-écritures permet d'avoir des URLs propres et permet aussi de gérer au mieux son référencement.

Voyons comment y injecter, automatiquement, la valeur d’un champ personnalisé ou custom field.

Pré-requis

Pour ce tutoriel, il faut s’assurer que la ré-écriture d’URL est bien activée sur votre installation et que vos permaliens ont la structure suivante : Nom de l’article ou plus couramment dénommée, /%postname%/.

Vous devez aussi, avoir créé au préalable un type de contenu – je vous recommande le générateur GenerateWP, comportant au moins un champ personnalisé – via l’extension Advanced Custom Fields par exemple.

Dans ce tutoriel, nous avons un type de contenu intitulé Automobile, et nous allons ajouter à notre permalien la valeur du champ personnalisé Référence.
Au départ, notre permalien ressemble à ceci :

http://mon-site.fr/automobile/renault-kangoo-dci-70-confort/

Nous allons le transformer en :

http://mon-site.fr/automobile/renault-kangoo-dci-70-confort-ref-2015-32/

Ajouter une nouvelle règle de ré-écriture

Dans le fichier functions.php de votre thème, nous allons déclarer une nouvelle règle de ré-écriture des permaliens, pour notre type de contenu Automobile.

function wpc_add_rewrite_rules() {
global $wp_rewrite;

$wp_rewrite->add_rewrite_tag('%automobile%', '([^/]+)', 'automobile=');
$wp_rewrite->add_rewrite_tag('%automobile_reference%', '([^/]+)', 'automobile_reference=');
$wp_rewrite->add_permastruct('automobile', '/automobile/%automobile%-ref-%automobile_reference%/');
}
add_action('init', 'wpc_add_rewrite_rules', 10, 0);

add_rewrite_tag(); permet de définir les éléments à passer dans le permalien. Dans notre cas, nous gardons le %automobile%, généré à partir du titre, et nous ajoutons le %automobile_reference% que nous remplirons par la suite, avec le champ personnalisé Référence.

add_permastruct(); permet de définir le nouveau permalien à générer. Ici, nous voulons la structure suivante : /automobile/SLUG-ref-NUMERO_REFERENCE/

Ajouter le champ personnalisé aux permaliens

Toujours dans votre fichier functions.php, nous allons créer une fonction permettant de remplacer %automobile_reference% du permalien par le contenu du champ personnalisé Référence.

function wpc_permalinks($permalink, $post, $leavename) {
$post_id = $post->ID;

if ($post->post_type == 'automobile') {
$automobile_reference = sanitize_title(get_post_meta($post_id, 'cf_automobile_reference', true));
if ($automobile_reference) {
$permalink = str_replace('%automobile_reference%', $automobile_reference, $permalink);
} else {
$permalink = str_replace('%automobile_reference%', 0, $permalink);
}
}

return $permalink;
}
add_filter('post_type_link', 'wpc_permalinks', 10, 3);

Dans cette fonction, nous vérifions que le type de contenu est bien automobile. Ensuite, nous récupérons la valeur de notre champ personnalisé cf_automobile_reference, que nous nettoyons avec sanitize_title(); par souci de sécurité.

Enfin, il ne nous reste plus qu’à remplacer %automobile_reference% par le contenu du champ personnalisé avec la fonction str_replace(); et à traiter le cas où aucune référence n’a été saisie dans le back-office.

Rafraichissez vos permaliens !

Une fois que votre fichier functions.php est prêt, n’oubliez pas de mettre à jour vos permaliens !

Pour ce faire, il vous suffit d’aller dans Réglages puis Permaliens. Une simple visite sur cette page suffit à rafraichir vos permaliens – pas besoin de cliquer sur Enregistrer les modifications.

Vous savez à présent comment modifier le contenu de vos permaliens, en y passant des paramètres. C’est simple, n’est-ce pas ? Nous pourrions très bien adapter cet exemple pour améliorer son SEO ou encore générer des permaliens pour nos automobiles calqués à chaque fois sur le même modèle : je veux la marque, suivi du modèle, suivi de sa puissance… À vous de jouer !

Merci à Lionet Pointet pour son œil averti et son aide sur le Slack WordPress FR. Sans lui, ce tutoriel ne fonctionnerait pas correctement.

Par Mickaël Gris

Mickaël est un « Digital Native » converti à WordPress. Il travaille en agence où il intervient comme développeur/intégrateur Web. En 2013, avec Aurélien Denis, ils fondent l'association WordPress Meet & eXchange afin de fédérer les utilisateurs passionnés de cette fabuleuse technologie qu'est WordPress.

5 commentaires
  1. Simon

    Bonjour,

    je ressort un vieux poste mais je suis un peu perdu…. J’essaye d’utiliser votre code avec un champ contenant un sous-titre. j’ai un soucis avec la fonction sanitize_title. Si je met le des tiret, j’obtiens une erreur 404. Si je ne met rien, j’obtiens des %20 mais ca fonctionne… Any idea ?

    D’avance merci,

    Simon

    1. Mickaël

      Salut,

      As-tu pensé à flusher les permaliens ? Tu peux le faire en visitant la page “Réglages” > “Permaliens” (inutile de sauvegarder, une simple visite de cette page suffit).

  2. Jérôme

    Hello,

    Sinon il existe un autre moyen aussi à l’aide d’un plugin “Easy Upload Renamer” qui à la particularité de reprendre le nom du post avec en plus la suppression des accents! je trouve que c’est un gain de temps énorme pour ceux qui ont beaucoup de média à mettre dans leurs articles.

  3. Lionel

    Bon résumé de notre discussion, c’est cool de le partager, et merci pour la mention ;).
    Je précise qu’il n’y a même pas besoin d’activer le “rewrite” sur le post type si les pages d’archives ne sont pas utilisées. En clair, dans l’exemple des règles vont être générées pour répondre aux URLs comme celles qui suivent si la clé “rewrite” est passée à true dans l’appel à la fonction register_post_type :
    – monsite.com/automobile/
    – monsite.com/automobile/feed/
    – monsite.com/automobile/page/2

    Si ces pages ne servent pas, autant passer la clé “rewrite” à false dans ce cas, ça évitera de surcharger les tests sur les expressions régulières.

    1. Aurélien Denis

      Merci à toi Lionel et désolé pour le retard de publication du commentaire, ce dernier se trouvait dans le spam à cause des liens. 😉

Laisser un commentaire