PHPackages                             amphibee/meilisearch-facets - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. amphibee/meilisearch-facets

ActiveWordpress-plugin[Search &amp; Filtering](/categories/search)

amphibee/meilisearch-facets
===========================

Système de filtres/facettes Meilisearch réutilisable pour les projets Pollora (Laravel + WordPress).

0325↓81.5%[1 PRs](https://github.com/AmphiBee/MeiliSearchFacets/pulls)PHP

Since Apr 16Pushed 3w agoCompare

[ Source](https://github.com/AmphiBee/MeiliSearchFacets)[ Packagist](https://packagist.org/packages/amphibee/meilisearch-facets)[ RSS](/packages/amphibee-meilisearch-facets/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependenciesVersions (2)Used By (0)

Meilisearch Facets
==================

[](#meilisearch-facets)

Plugin Composer réutilisable pour ajouter un système de **filtres/facettes Meilisearch** sur n'importe quel listing d'un projet Pollora (Laravel + WordPress).

---

Table des matières
------------------

[](#table-des-matières)

1. [Prérequis](#pr%C3%A9requis)
2. [Installation](#installation)
3. [Configuration](#configuration)
4. [Créer un listing facetté en 6 étapes](#cr%C3%A9er-un-listing-facett%C3%A9-en-6-%C3%A9tapes)
    - [Étape 1 — Implémenter SearchConfigInterface](#%C3%A9tape-1--impl%C3%A9menter-searchconfiginterface)
    - [Étape 2 — Enregistrer les handlers](#%C3%A9tape-2--enregistrer-les-handlers)
    - [Étape 3 — Configurer l'index Meilisearch](#%C3%A9tape-3--configurer-lindex-meilisearch)
    - [Étape 4 — Créer les vues du thème](#%C3%A9tape-4--cr%C3%A9er-les-vues-du-th%C3%A8me)
    - [Étape 5 — Configurer le bloc "Listing facetté"](#%C3%A9tape-5--configurer-le-bloc-listing-facett%C3%A9)
    - [Étape 6 — Ajouter des filtres (blocs enfants)](#%C3%A9tape-6--ajouter-des-filtres-blocs-enfants)
5. [Référence — Les types de filtres Gutenberg](#r%C3%A9f%C3%A9rence--les-types-de-filtres-gutenberg)
6. [Référence — SearchConfigInterface](#r%C3%A9f%C3%A9rence--searchconfiginterface)
7. [Référence — Conventions de nommage des inputs](#r%C3%A9f%C3%A9rence--conventions-de-nommage-des-inputs)
8. [Cas d'usage avancés](#cas-dusage-avanc%C3%A9s)
    - [Filtres custom (post\_type, meta\_boolean)](#filtres-custom-post_type-meta_boolean)
    - [Filtres numériques (prix, durée...)](#filtres-num%C3%A9riques-prix-dur%C3%A9e)
    - [Listing sans filtres numériques](#listing-sans-filtres-num%C3%A9riques)
    - [Pagination personnalisée](#pagination-personnalis%C3%A9e)
    - [Plusieurs listings sur un même projet](#plusieurs-listings-sur-un-m%C3%AAme-projet)
    - [Implémentation manuelle (sans Gutenberg)](#impl%C3%A9mentation-manuelle-sans-gutenberg)
9. [Architecture interne](#architecture-interne)
10. [Résolution de problèmes](#r%C3%A9solution-de-probl%C3%A8mes)

---

Prérequis
---------

[](#prérequis)

- Projet Pollora (Laravel 12 + WordPress 6+)
- Meilisearch accessible (local ou distant)
- Plugin MeiliScout installé et configuré pour indexer les posts WordPress
    - Les documents indexés doivent contenir un champ `terms` de la forme `[{taxonomy, slug, name}]`
    - Les metas numériques filtrables doivent être dans un objet `metas` (ex: `metas.price`)
- AlpineJS chargé dans le thème

---

Installation
------------

[](#installation)

### Via Composer (Satis privé — méthode recommandée)

[](#via-composer-satis-privé--méthode-recommandée)

```
composer require amphibee/meilisearch-facets
```

Le ServiceProvider est auto-découvert par Laravel.

### Installation temporaire (développement)

[](#installation-temporaire-développement)

Copier le plugin dans `public/content/plugins/meilisearch-facets/` et enregistrer le ServiceProvider dans `bootstrap/providers.php` :

```
// bootstrap/providers.php
return [
    AmphiBee\MeilisearchFacets\MeilisearchFacetsServiceProvider::class,
    App\Providers\AppServiceProvider::class,
    // ...
];
```

Puis conditionner chaque handler AJAX à l'activation du plugin dans l'admin WordPress, directement dans le callback `#[Action('init')]` du Hook Pollora :

```
#[Action('init')]
public function registerAjaxHandler(): void
{
    if (! in_array('meilisearch-facets/meilisearch-facets.php', (array) get_option('active_plugins', []), true)) {
        return;
    }

    FacetsAjaxHandler::register(new MySearchConfig());
}
```

> **Pourquoi cette séparation ?** Dans le cycle de démarrage de Pollora, `bootstrap/providers.php` est évalué avant que WordPress soit chargé. Le ServiceProvider doit donc être enregistré inconditionnellement pour que les bindings Laravel (`MeilisearchClient`, `FacetsSearchService`) soient disponibles dans le conteneur. En revanche, `get_option()` n'est disponible qu'une fois WordPress chargé — ce qui est garanti au moment où `#[Action('init')]` s'exécute. C'est donc le bon endroit pour vérifier `active_plugins` et décider d'enregistrer ou non les actions AJAX.

### Publier la config

[](#publier-la-config)

```
php artisan vendor:publish --tag=meilisearch-facets-config
```

Cela crée `config/meilisearch-facets.php` dans le projet.

---

Configuration
-------------

[](#configuration)

### Variables d'environnement (`.env`)

[](#variables-denvironnement-env)

```
MEILI_HOST=http://localhost:7700
MEILI_KEY=votre_master_key_ou_search_key
MEILI_INDEX_NAME=posts
MEILI_MATCHING_STRATEGY=last
```

### `config/meilisearch-facets.php`

[](#configmeilisearch-facetsphp)

```
return [
    'url'    => env('MEILI_HOST', 'http://localhost:7700'),
    'key'    => env('MEILI_KEY'),
    'index'  => env('MEILI_INDEX_NAME', 'posts'),
    'search' => [
        'matching_strategy' => env('MEILI_MATCHING_STRATEGY', 'last'),
    ],
];
```

### Indexer les posts

[](#indexer-les-posts)

Après installation de MeiliScout, indexer les posts WordPress :

```
ddev exec wp meiliscout index --clear
```

---

Créer un listing facetté en 6 étapes
------------------------------------

[](#créer-un-listing-facetté-en-6-étapes)

L'approche recommandée utilise les blocs Gutenberg : les filtres et la mise en page se configurent directement dans l'éditeur, sans toucher aux templates Blade. La partie PHP reste nécessaire pour la logique de recherche.

L'exemple ci-dessous utilise un CPT `reference` avec une taxonomie `activity-sector` et un filtre relationnel.

---

### Étape 1 — Implémenter SearchConfigInterface

[](#étape-1--implémenter-searchconfiginterface)

Créer une classe dans `app/Search/` qui étend `AbstractSearchConfig`.

```
