Skip to content

Les modèles

Concept et utilité

Les Modèles servent de couche d'abstraction (Wrapper) autour des objets WP_Post natifs de WordPress. Plutôt que de manipuler des tableaux de données brutes ou d'appeler des fonctions globales (get_field, get_the_title) partout dans vos templates, vous manipulez un objet métier intelligent.

L'objectif est de centraliser la logique de récupération des données. Si la structure d'un champ change en base de données, vous ne modifiez que le Modèle, et non l'intégralité de vos vues.

Structure d'une classe Data

Chaque nouveau type de contenu (Custom Post Type) doit posséder son propre modèle dans le namespace App\Models et hériter de la BaseModel.

Déclaration et Héritage

La classe doit étendre BaseModel. C'est cet héritage qui lui confère ses pouvoirs magiques (accès automatique aux champs ACF et propriétés WP).

Auto-complétion (PHPDoc)

Pour que l'IDE (VS Code, PHPStorm) aide le développeur, il est crucial de déclarer les propriétés via des annotations @property. Cela documente quels champs ACF sont disponibles.

Surcharge de méthodes

Si un champ nécessite un formatage spécifique (ex: transformer une date, formater un prix), on crée une méthode dédiée dans la classe.

php
namespace App\Models;

use App\Support\Models\BaseModel;

/**
 * @property string $contract_type  // Champ ACF
 * @property string $location       // Champ ACF
 */
class JobModel extends BaseModel 
{
    /**
     * Exemple de logique métier propre au modèle
     * Accessible via $job->full_location() dans le code
     */
    public function full_location(): string 
    {
        return "Poste basé à : " . $this->location;
    }
}

Intégration dans le flux de travail

Le modèle s'utilise dès que vous récupérez un post, que ce soit dans une boucle (Loop) ou une page de détail.

  • Instanciation : $job = new JobModel($post_id);
  • Accès aux données :
    • $job->title : Récupère le titre filtré.
    • $job->location : Récupère automatiquement le champ ACF via la méthode magique __get.
    • $job->full_location()
    • $job->thumbnail() : Retourne un objet Image (DTO).

Utilisation dans Blade

Grâce à cette structure, le code dans vos templates devient extrêmement propre et facile à lire :

bladehtml
<div class="card">
    @if($card->image->url)
        <img src="{{ $card->image->url }}" alt="{{ $card->image->alt }}">
    @endif

    <h3>{{ $card->title }}</h3>
    <p>{{ $card->excerpt }}</p>

    <a href="{{ $card->button->url }}" target="{{ $card->button->target }}">
        {{ $card->button->title }}
    </a>
</div>