Formation « Développer un thème WordPress sur mesure »

Les Hooks et le fichier functions.php

Lecture : 4 minutes • 17

C’est dans le fichier functions.php de notre thème que l’on va ajouter de nouvelles fonctionnalités et configurer certains aspects du CMS, grâce à un système très bien pensé nommé Hooks.

Le fichier functions.php est un incontournable dans tous le thèmes, car c’est dans ce fichier que l’on va pouvoir activer les fonctionnalités de WordPress et créer nos propres fonctions sur mesure.

On peut dire que le functions.php est la partie “code” de notre thème. Et pour cela on va utiliser le système de Hooks qui va nous permettre de nous brancher à certains moments clé de WordPress afin de modifier son comportement. C’est l’un des concepts les plus importants et intéressant du CMS.

À quoi sert le functions.php ?

Il y a énormément de choses que l’on peut faire avec ce fichier, et c’est ce que l’on va voir dans les prochains cours.

De nombreuses fonctionnalités de WordPress ne sont pas actionnables depuis l’interface d’administration, c’est pour cela que le développeur va passer par ce fichier pour en activer, ajouter des configurations…

Dans un fichier functions.php on peut :

  • Activer des fonctionnalités comme les images mises en avant ;
  • Déclarer des emplacements de menus, zones de widgets ;
  • Déclarer des feuilles de styles CSS et scripts JS ;
  • Déclarer de nouveaux types de publications et taxonomies ;
  • Déclarer des fonctions sur mesure ;
  • Gérer les requêtes Ajax ;
  • Réécrire des URLs ;
  • Personnaliser certains réglages d’extensions ;
  • Personnaliser l’interface d’administration ;
  • Créer des routes dans l’API Rest ;
  • Et bien plus encore…

Que sont les hooks dans WordPress ?

En fait, d’ici on va pouvoir interagir sur WordPress, le thème, les extensions afin d’en modifier leur comportement natif sans pour autant toucher à leur code !

C’est possible grâce à un système intelligent de hooks (crochets) qui vont nous permettre d’accrocher nos fonctions sur mesure lors de moments clés de l’exécution du CMS.

Hooks

Définition

Les Hooks sont des fonctions déclarées par le développeur de thème ou d’extension qui permettent d’interagir avec le coeur de WordPress, d’autres thèmes ou extensions et lancés à des moments clés de leur exécution. Par exemple, on peut intercepter le moment où WordPress enregistre un article dans la base, afin d’y apporter des modifications. Il existe 2 types de Hooks : les actions, un moment clé pour lancer ses propres fonctions, et les filtres, pour intercepter une valeur à un moment donné et la modifier.

Traduction : Crochets

Ce qu’il faut retenir, c’est qu’il y a donc 2 types de Hooks dans WordPress :

  • Les Actions : à des moments clés, on peut lancer notre propre fonction pour faire des choses supplémentaires dans WordPress ;
  • Les Filtres : qui permettent d’intercepter une valeur afin de la modifier.

Exemples :

  • Un développeur peut insérer une fonction qui calcule le nombre de mots d’un article au moment où WordPress l’enregistre, via une action ;
  • Une extension de SEO comme Yoast intercepte le Title de la page via un filtre afin d’en écrire une version plus adaptée pour le référencement naturel.

Conseil

Grâce aux hooks, on va pouvoir modifier le comportement de WordPress sans pour autant modifier le code source de celui-ci.

D’ailleurs, ce serait une mauvaise idée : à la prochaine mise à jour du coeur, ou d’une extension, vos modifications seraient irrémédiablement écrasées.

Hooks et functions.php

Des Hooks, il y en a partout dans WordPress, et on va énormément les utiliser dans la suite de cette formation.

D’ailleurs, une extension se repose intégralement sur des hooks pour fonctionner. C’est ce que l’on voit dans la formation développeur d’extensions WordPress.

En ce qui concerne la création de thèmes, c’est la même chose : notre fichier functions.php va lui aussi principalement s’appuyer sur des hooks. Voici un exemple :

PHP
functions.php

Cette fonction me permet de retirer des éléments inutiles de l’admin WordPress, afin de l’alléger.

Le hook est appelé via la fonction add_action() et le moment clé est admin_menu. Cette action est appelée par WordPress au moment ou il s’apprête à afficher le menu d’admin. Ce n’est donc pas choisi arbitrairement.

J’indique à WordPress, qu’avant de générer le menu d’admin, je veux lancer ma propre fonction capitaine_remove_menu_pages (ça par contre c’est un nom arbitraire) afin d’ajouter ou supprimer des entrées dans ce menu.

Notez que j’ai préfixé ma fonction avec le nom de mon thème : capitaine_. Prenez la bonne habitude de le faire à chaque fois. Pourquoi ?

À éviter

Si vous mettez des noms de fonctions trop génériques elles pourraient entrer en conflit avec des fonctions natives de WordPress ou déclarées par une extension car elles porteraient le même nom.

La fonction remove_menu_page() permet de retirer des éléments de ce menu, mais si j’avais simplement appelé cette fonction hors de l’action, il ne se serait rien produit : WordPress n’aurait pas encore généré le menu en question et la fonction n’aurait eu aucun effet.

Les hooks permettent donc de configurer / agir / modifier WordPress au bon moment.

À partir du prochain cours, on va voir les réglages et hooks correspondants plus en détails.

Scinder functions.php en plusieurs fichiers

Dans certains thèmes, il se peut qu’au bout d’un moment votre fichier functions.php commence à être assez conséquent ! Du coup rien n’empêche de le scinder en plusieurs parties :

PHP
functions.php

On utilise la fonction get_template_directory() qui permet de récupérer le nom du dossier du thème actif (son Path).

Les thèmes premium ont tous tendance à utiliser cette technique, sinon leur fichier possèderait plusieurs milliers de lignes de code.


Voici pour la théorie, maintenant passons à la pratique ! Dans les prochains cours on va voir les paramètres les plus utiles pour notre fichier functions.php et leurs Hooks correspondants.

17

Questions, réponses et commentaires

  1. Sirius

    Le 22 février 2019

    Hello !

    Petite erreur dans la définition des Hooks WordPress : “donner” est plutôt “donné” 🙂 (dans la toute dernière phrase)

    Btw, merci pour cette formation c’est rare de trouver un contenu de qualité en français !

    1. Maxime BJ

      Le 24 février 2019

      Oh la vilaine faute ! Et pourtant je me suis relu… Merci j’ai corrigé !

  2. olivier

    Le 15 mai 2020

    Bonjour,
    comment attribuer des functions différentes pour chaque site en utilisant WPMU ?
    Merci

    1. Maxime BJ

      Le 15 mai 2020

      Thèmes enfants distincts pour chaque site du réseau ? Je n’ai pas une grande expérience du multi-site donc je ne serais pas le mieux placé pour t’aider.

  3. Dan. B

    Le 29 septembre 2020

    Bonjour.
    Petite précision quand on veut scinder son fichier functions.php dans le cas d’un thème enfant.
    La fonction get_template_directory() retourne le dossier non pas actif mais celui du thème parent.
    Il faut donc utiliser la fonction get_stylesheet_directory() qui elle retourne bien le dossier actif du thème.
    Dan

    1. Maxime BJ

      Le 23 mars 2021

      Oui en effet ! Je pars du principe dans cette formation qu’on créé un thème sur mesure, donc il n’y a pas besoin de thème enfant. Mais j’aurais pu tout de même faire mention de cette distinction.

  4. COVU

    Le 31 août 2021

    Super site, très bien expliqué merci beaucoup.

  5. Hamza

    Le 14 septembre 2021

    Bonjour,
    Je veux modifier le menu principal : ajouter ou supprimer des éléments. J’ai déjà essayé de travailler avec wp_nav_menu_items

    1. Maxime BJ

      Le 17 septembre 2021

      Tu veux dire des éléments statiques ? Tu peux regarder du côté des walkers WP pour avoir un contrôle sur l’affichage des menus, mais c’est assez complexe pour ce que ça apporte je trouve.

  6. San

    Le 24 décembre 2021

    bonjour a vous maxime et merci pour ce cour,
    j’ai un soucis, je veux inserer les lignes d’une table dans la table wp_users de la bdd, svp je peux faire comment?

    1. Maxime BJ

      Le 27 décembre 2021

      Il va falloir utiliser les fonctions prévues à cet effet, comme par exemple wp_update_user().

  7. Franck

    Le 13 janvier 2022

    Bonjour je developpe un site actuelle sur wordpress et lorsque je remplis mon formulaire que j’ai fais en manuelle les données passe en GET alors que j’ai precisé la methode POST.

    1. Maxime BJ

      Le 13 janvier 2022

      Il faut que tu interceptes le formulaire grâce à un hook. Je n’ai pas encore eu l’occasion d’en parler dans la formation mais voici la documentation correspondante https://developer.wordpress.org/reference/hooks/admin_post_action/. Par contre, si ton HTML est bon, ça ne devrait pas passer en GET. Vérifie ton HTML.

  8. Pasko

    Le 16 avril 2022

    Bonjour

    Merci beaucoup pour les explications sur les hooks. Je veux avoir votre aide pour la fonction PHP du thème enfant WordPress. J’ai déjà créé le site sur le thème enfant. C’est après j’ai modifié dans parent le fichier de langue qui était anglais en français, mais cela n’a pas eu d’impact sur l’enfant. Puis-je appeler ce fichier langue dans la fonction PHP? Si oui, comment?

    Cordialement.

    1. Maxime BJ

      Le 16 avril 2022

      Hello, la formation n’aborde pas les notions de themes enfants (dans le sens où tu modifies un thème que tu n’as pas fait toi). Je ne suis donc pas sûr de la réponse mais je pense qu’il faut que tu copies le fichier de langue dans ton thème enfant et que tu ajoutes la chaîne et sa traduction (en scannant le dossier avec poedit par exemple)

  9. Olivier C

    Le 14 août 2022

    Bonjour,
    Contrairement à ce qui est dit en introduction, le fichier functions.php n’est pas obligatoire pour créer un thème WordPress, seuls index.php et styles.css (avec ses commentaires déclaratifs) le sont.
    Alors bien sûr, que serait l’intérêt d’un thème WordPress sans ce fichier ?…

    1. Maxime BJ

      Le 14 août 2022

      Oui… bon du coup j’ai modifié en disant que c’était un incontournable à la place. En réalité, je me positionnais surtout du point de vue de la formation : sans notre functions.php, on ne pourrait pas aller bien loin.

Laisser un commentaire