Skip to content

Les Repositories

Les classes Repositories sont un ensemble de classe qui interroge la base de donnée WordPress. Elles s'occupent de la recupération des publications via les QueryRepository (dossier app/Repositories/Queries) ou de la configuration des pages options (par exemple des menus, de la configuration de la page d'accueil).

Architecture

L'approche repose sur :

  • Les QueryRepository retournent des objets de type BaseModel et le DTO PaginationResultData pour un typage fort
  • Les Repositories font des get_options

Le Repository : PostQuery

Cette classe utilise Query par composition. Elle ne contient aucune logique de construction de tableau de paramètres complexe, mais expose des méthodes explicites.

php
namespace App\Repositories\Queries;

use App\Data\PaginationResultData;
use App\Support\Query;
use App\Support\Models\BaseModel;
use WP_Post;

class PostQueryRepository
{
    protected string|array $postTypes = 'post';

    public function __construct(protected Query $query)
    {
        $this->query->updateQuery('post_type', $this->postTypes);
    }

    /**
     * Récupère les derniers articles avec exclusion optionnelle
     */
    public function latest(int $limit = 3, array $excludeIds = []): array
    {
        return collect($this->query
            ->updateQuery('orderby', ['date' => 'DESC'])
            ->updateQuery('posts_per_page', $limit)
            ->excludeByIds($excludeIds)
            ->getWpQuery()->posts)->map(fn (WP_Post $post) => new BaseModel($post))->toArray();
    }

    /**
     * Récupère une liste paginée formatée via PaginationResultData
     */
    public function findByCategoryPaginated(string $category, array $excludeIds = [], int $page = 0): PaginationResultData
    {
        $currentPage = $page === 0 ? (get_query_var('paged') ?: 1) : $page;

        $wpQuery = $this->query
            ->updateQuery('paged', $currentPage)
            ->updateQuery('category_name', $category)
            ->excludeByIds($excludeIds)
            ->getWpQuery();

        return new PaginationResultData(
            items: collect($wpQuery->posts)->map(fn (WP_Post $post) => new BaseModel($post))->toArray(),
            totalCount: $wpQuery->found_posts,
            perPage: (int) $wpQuery->query_vars['posts_per_page'],
            currentPage: $currentPage
        );
    }
}

Utilisation pratique

L'instanciation se fait en injectant le support Query dans le service métier.

Dans un Controller ou un Template

php
    // Initialisation
    $postRepository = new PostQuery(new Query());
    
    // 1. Récupérer l'article à la une
    $featured = $postRepository->featured();
    
    // 2. Récupérer les articles liés (en excluant la une)
    $related = $postRepository->latest(3, [$featured->ID]);
    
    // 3. Gestion de la pagination
    $news = $postRepository->findByCategoryPaginated('news');

Bénéfices de cette structure

  • Encapsulation : Les templates ne manipulent jamais de tableaux associatifs WordPress ($wp_query->query_vars).
  • Typage fort : L'utilisation de PaginationResultData évite les erreurs de clés manquantes dans les tableaux de résultats.
  • Testabilité : On peut facilement mocker les classes Repositories