# Timber et Twig dans une extension WordPress : séparer logique et affichage

> Timber introduit le moteur de templates Twig dans WordPress pour séparer la logique métier de l'affichage. Ce que cela change concrètement dans l'organisation d'une extension.

- Auteur : WordPress Développement
- Publié le : 2022-07-21
- Mis à jour le : 2022-07-21
- Catégorie : Extensions
- URL : https://www.wpmoderne.fr/extensions/timber-twig-extension-separer-logique-affichage/

## L’essentiel

- Les données se préparent en PHP, l'affichage se rédige en Twig
- Un fichier .twig n'accède jamais directement à la base de données
- La séparation facilite la relecture par un intégrateur non développeur PHP

```
{% for produit in produits %}
    <h3>{{ produit.title }}</h3>
    <p>{{ produit.prix }} €</p>
{% endfor %}
```

Cette syntaxe, tirée d'un fichier `.twig`, illustre en quelques lignes ce que Timber change dans l'organisation d'une extension WordPress : plus aucune boucle `while ( have_posts() )` mêlée à du HTML, plus aucun appel direct à `get_post_meta()` à l'intérieur du template affiché. Toute la préparation des données se fait en amont, en PHP, et le fichier de rendu se contente d'afficher ce qui lui est transmis.

## Structurer une extension avec Timber

Une extension qui affiche un catalogue de produits organise typiquement son code en deux couches distinctes : la préparation des données côté PHP, et le rendu côté Twig, rangé dans un dossier `views` dédié.

```
use Timber\Timber;
use Timber\PostQuery;

function wpm_afficher_catalogue() {
    $contexte = Timber::context();

    $contexte['produits'] = new PostQuery( array(
        'post_type'      => 'produit',
        'posts_per_page' => 12,
    ) );

    Timber::render( 'catalogue.twig', $contexte );
}
```

```
{# views/catalogue.twig #}
<div>
    {% for produit in produits %}
        <article>
            <h3>{{ produit.title }}</h3>
            <p>{{ produit.meta('prix') }} €</p>
        </article>
    {% endfor %}
</div>
```

## Ce que cette séparation change pour l'équipe

> L'essentiel à retenir : Les données se préparent en PHP, l'affichage se rédige en Twig ; Un fichier .twig n'accède jamais directement à la base de données ; La séparation facilite la relecture par un intégrateur non développeur PHP

Le bénéfice le plus concret ne tient pas tant à la performance qu'à la répartition du travail au sein d'une équipe mixte. Un intégrateur qui maîtrise le HTML et une syntaxe de gabarit simple peut ajuster l'affichage d'un template Twig sans jamais toucher au code PHP, et sans risquer d'introduire une faille en manipulant directement des requêtes ou des appels à la base de données.

### Pas d'accès direct à la base de données depuis Twig

Twig, par conception, ne permet pas d'exécuter du code PHP arbitraire : seules les variables et les méthodes explicitement exposées par le contexte transmis à `Timber::render()` deviennent accessibles dans le template. Cette contrainte, qui peut d'abord sembler limitante, protège en réalité contre un anti-pattern courant des thèmes classiques : des requêtes lancées directement dans un fichier de template, mélangées à du HTML, impossibles à tester isolément.

## Ce qu'il faut anticiper avant d'adopter Timber

- Une dépendance supplémentaire à gérer via Composer, avec ses propres versions à suivre
- Une syntaxe Twig à apprendre pour toute personne qui interviendra sur les templates, y compris pour des besoins simples
- Un travail de conversion si le projet reprend un thème existant construit entièrement en PHP classique

## Un exemple de fonction exposée au template

```
class ProduitAffichage extends \Timber\Post {
    public function prix_formate() {
        $prix = $this->meta( 'prix' );
        return number_format( (float) $prix, 2, ',', ' ' ) . ' €';
    }
}
```

```
{{ produit.prix_formate() }}
```

Étendre la classe `Timber\Post` permet d'ajouter des méthodes métier réutilisables directement accessibles depuis les templates, sans dupliquer une logique de formatage dans chaque fichier `.twig` qui en aurait besoin.

| Aspect | Thème PHP classique | Avec Timber et Twig |
| --- | --- | --- |
| Accès direct à la base depuis le template | Possible, souvent constaté | Impossible par conception |
| Séparation logique / affichage | Dépend de la discipline de l'équipe | Imposée par la structure |
| Courbe d'apprentissage | Aucune, syntaxe PHP connue | Twig à apprendre |

> Sur nos projets, la discipline imposée par Twig a évité plus d'une fois qu'un template récupère « juste une petite donnée en plus » directement en base, un réflexe qui s'installe vite dans un thème PHP classique sans garde-fou.

## En résumé

Timber ne convient pas à tous les projets, en particulier ceux où une seule personne développe et intègre sans besoin de séparer les responsabilités. Sur une extension maintenue par une équipe qui distingue développement métier et intégration, la contrainte imposée par Twig devient un atout structurant plutôt qu'une complexité supplémentaire, en empêchant par construction les mélanges de responsabilités qui rendent un thème classique difficile à faire évoluer.
