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
QueryRepositoryretournent des objets de typeBaseModelet leDTOPaginationResultDatapour un typage fort - Les
Repositoriesfont desget_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