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