# Egyedi szűrők: legfrissebb bejegyzések, ismétlő mező, ábécé, szezonális ár

> Négy haladó szűrőmegoldás: lekérdezés-váltás, keresés ismétlő mező almezőiben, ábécé szűrő felhasználókhoz, ár szűrése a kiválasztott időszak szerint.

Ez a fejezet négy olyan szűrőmegoldást gyűjt össze, amelyhez a JetSmartFilters mellett a JetEngine lekérdezésépítője is kell.

## Összes és legfrissebb bejegyzések szűrése

A cél: az oldalon alapból az összes bejegyzés látszik, a szűrő egyik opciójával pedig csak az elmúlt két hét bejegyzései. Szükséges: Elementor, blokkszerkesztő vagy Bricks, JetSmartFilters, és a JetEngine 3.2.0 vagy újabb. A **JetEngine Query Builder kapcsoló** adatforrás a **Kiválasztás** és a **Választógomb** szűrőnél érhető el, a **Jelölőnégyzetek listája** szűrő nem támogatja.

1. A **JetEngine → Query Builder** oldalon hozz létre két **Bejegyzések lekérdezést**. Az elsőt nevezd „Összes bejegyzés”-nek, a másodikat „Legfrissebb bejegyzések”-nek.
2. Mindkét lekérdezésnél add meg ugyanazt a **Query ID** értéket. Ez azért fontos, mert enélkül, ha az oldalon több azonos szolgáltatójú elem van, a szűrő mindegyikre hatni fog.
3. Az **Általános** fülön állítsd be a bejegyzéstípust (itt: **Bejegyzések**), és mentsd az első lekérdezést.
4. A második lekérdezésnél nyisd meg a **Dátumlekérdezés** (Date Query) fület, vegyél fel egy új szabályt, és az **Ezután** (After) mezőbe írd be: `2 weeks ago`. Mentsd.
5. A **Smart Filters → Új hozzáadása** oldalon adj nevet a szűrőnek, válaszd a **Kiválasztás** típust, az adatforrás legyen **JetEngine Query Builder kapcsoló**, és a **Lekérdezés kiválasztása** mezőben add meg a két lekérdezést.
6. A **Lekérdezési változó** melletti adatbázis ikonnal válaszd a **Switch JetEngine query** lehetőséget, majd frissítsd a szűrőt.

   ![A Kiválasztás szűrő beállításai a Query Builder kapcsoló adatforrással](./kepek/adatforras-query-builder-kapcsolo.webp)

   *A Kiválasztás szűrő beállításai a Query Builder kapcsoló adatforrással* (https://minta-bolt.hu/wp-admin/admin.php?page=jet-smart-filters)

7. Tedd a Kiválasztás szűrőt és a Listing Gridet az oldalra. A Listing Gridnél válaszd ki a listinget, a **Egyéni lekérdezés** fülön kapcsold be az **Egyéni lekérdezés használata** kapcsolót, és add meg az „Összes bejegyzés” lekérdezést. Így induláskor minden bejegyzés látszik.
8. A lekérdezés Query ID-ját másold be a Listing Grid **Haladó** fülén a **CSS-azonosító** mezőbe.
9. A szűrő widgetben válaszd ki a szűrőt, a **Ez a szűrő ehhez** legyen **JetEngine**, a **Query ID** mezőbe pedig írd be ugyanazt az azonosítót. Mentsd az oldalt.

A „Legfrissebb bejegyzések” opciót választva a lista csak a két héten belüli bejegyzéseket mutatja.

> **Fontos:** a szűrt szolgáltatóra egyéni lekérdezést alkalmazni kötelező. Ha a listing eleve a Query Builder forrást használja, a szolgáltatónál nem kell külön beállítani. Az egyéni lekérdezés felülírja a Listing Grid **Bejegyzések száma** beállítását, ezért az oldalankénti darabszámot a lekérdezés lapozási beállításainál add meg.

## Keresés ismétlő mező almezőiben

A cél: egyéni bejegyzéstípus bejegyzéseit lehessen keresni a JetEngine ismétlő (Repeater) mezőjének almezői szerint. A példában az ismétlő mezőnek két almezője van: „Ország” és „Város”.

1. A **JetEngine → Bejegyzéstípusok** oldalon nyisd meg a bejegyzéstípust, és a Meta mezők részben ellenőrizd, hogy az ismétlő mezőnél be van kapcsolva az **Mentés külön mezőkként** (Save as separate fields) kapcsoló. Enélkül a keresés nem működik.
2. Ha a bejegyzéseket már kitöltötted, nyisd meg mindet, és kattints a **Mentés** gombra, hogy az értékek külön mezőkként is bekerüljenek az adatbázisba. Ez a lépés elengedhetetlen.
3. A **Smart Filters → Új hozzáadása** oldalon válaszd a **Keresés** típust. A **Keresés módja** legyen **Egyéni mező szerint (lekérdezési változóból)**.
4. A **Lekérdezési változó** mezőbe az almezők kulcsait írd ebben a formában: `ismetlo-neve_almezo-neve`. Ha két almezőben keresel, vesszővel válaszd el őket. A példában a mezők neve `clients_info_country`, `clients_info_city`.

   ![Keresés szűrő két almezővel a lekérdezési változóban](./kepek/tippek-1-kereses-ismetlo.webp)

   *Keresés szűrő két almezővel a lekérdezési változóban* (https://minta-bolt.hu/wp-admin/admin.php?page=jet-smart-filters)

5. Tedd a Keresés szűrőt és a Listing Gridet az oldalra, és kösd össze őket Query ID-val. Kattints a **Közzététel** gombra.

Ha a látogató például egy országnevet keres, a találatokban azok a bejegyzések jelennek meg, amelyekben az ismétlő mező valamelyik sorában ez az érték szerepel.

## Ábécé szűrő a felhasználók Listing Gridjéhez

Az **Ábécé** szűrő csak bejegyzésekkel és termékekkel működik, a felhasználók listájára nincs beépített változata. Ezt egy **Választógomb** szűrővel és egy egyedi SQL-lekérdezéssel lehet pótolni. Szükséges: Elementor, blokkszerkesztő vagy Bricks, JetSmartFilters, és a JetEngine felhasználókat megjelenítő listing elemmel.

### A szűrő

1. A **Smart Filters → Új hozzáadása** oldalon adj nevet a szűrőnek, és válaszd a **Választógomb** típust. Az **Adatforrás** legyen **Kézi bevitel**.
2. Az **Opciók listája** részben kattints az **Add New** gombra, és vegyél fel minden betűhöz egy opciót. A **Címke** a betű, az **Érték** pedig egy reguláris kifejezés, amely kis- és nagybetűre is illeszkedik: `^a|^A`, `^b|^B`, `^c|^C`, és így tovább az összes betűre.
3. Ha akarod, kapcsold be a **Lehetőség a rádiógombok kijelölésének megszüntetésére** kapcsolót.
4. A **Lekérdezési változó** mezőbe írd be: `_plain_query::filtering`. A `_plain_query::` rész azt jelzi, hogy az érték sima SQL-értékként kerül a lekérdezésbe, a `filtering` pedig egy tetszőleges változónév, amelynek meg kell egyeznie a Query Builderben megadott változónévvel.
5. Töltsd ki a szűrőcímkéket, és kattints a **Frissítés** gombra.

![Az ábécé szűrő beállításai: betűnként egy opció és a lekérdezési változó](./kepek/tippek-1-abece-szuro.webp)

*Az ábécé szűrő beállításai: betűnként egy opció és a lekérdezési változó* (https://minta-bolt.hu/wp-admin/admin.php?page=jet-smart-filters)

### Az SQL-lekérdezés

1. A **JetEngine → Query Builder** oldalon hozz létre új lekérdezést. Adj neki nevet (például „Felhasználók ábécé szűrő lekérdezés”), a típusa legyen **SQL/AI lekérdezés**.
2. Az egyedi SQL részben a **Tábla** legyen a `users`. A **Where** részben adj hozzá egy új szabályt: az oszlop `display_name`, az operátor **Regexp**.
3. Az **Érték** mező melletti dinamikus címke gombbal válaszd a **JetSmartFilters Query** címkét. A típus legyen **Plain Query Var**, a változó neve pedig `filtering` (a szűrő lekérdezési változójának második fele). Alkalmazd.
4. Jelöld be az **Ne vegye figyelembe ezt a feltételt, ha a dinamikus érték üres** jelölőnégyzetet, hogy a lista ne maradjon üres, amíg nincs kiválasztott betű.
5. Ha akarod, add meg a rendezést (például `user_login` szerint, növekvő, **Char** típussal), a megjelenítendő elemek számát (például 6), és az eltolást (például 1, hogy az első felhasználót, az adminisztrátort kihagyd). Ezek nem kötelezők.
6. A **Az eredmény átalakítása objektumpéldánnyá** mezőben válaszd a **User** lehetőséget, hogy a JetEngine felhasználóként értelmezze az eredményt.
7. Kattints a **Lekérdezés hozzáadása** gombra.

### Az oldal

1. Tedd az oldalra a Listing Gridet, és válaszd ki a felhasználókat megjelenítő listinget.
2. Az **Egyéni lekérdezés** fülön kapcsold be az **Egyéni lekérdezés használata** kapcsolót, és add meg az SQL-lekérdezést.
3. Ha egy oldalon több Listing Grid van, adj minden lekérdezéshez saját egyedi Query ID-t. A Query Builderben ezt az egyéni lekérdezés azonosító mezőbe írd, ugyanezt add meg a rács **CSS-azonosító** mezőjében, és a szűrő **Query ID** mezőjében is.
4. A rács fölé tedd a **Választógomb szűrő** widgetet, válaszd ki a szűrőt, a **Ez a szűrő ehhez** legyen **JetEngine**. Stílusát a Stílus fülön szabhatod testre.
5. Mentsd az oldalt.

Az oldalon a betűk választógombként jelennek meg, és egy betűt kiválasztva a felhasználók listája csak az adott betűvel kezdődő nevűeket mutatja.

## Ár szűrése a kiválasztott időszak szerint

A JetBooking szezonális és hétvégi árai miatt egy egyszerű ártartomány-szűrő félrevezető lehet, mert az ár a napoktól és az időszaktól függ. Ez a megoldás a kiválasztott időszak tényleges árára szűr. Szükséges: Elementor vagy blokkszerkesztő, JetBooking, JetSmartFilters.

1. Hozz létre egy **Dátumtartomány** szűrőt a foglalási oldalra szóló leírás szerint.
2. Hozz létre egy **Tartomány** szűrőt, például „Ártartomány” névvel. A **Lekérdezési változó** legyen egy egyedi kulcs, például `_seasonal_price`.

> **Fontos:** az ár szerinti Tartomány szűrő a Dátumtartomány nélkül is működik, de akkor is dátumra támaszkodik: ha nincs kiválasztott dátum, a mai napot használja. A pontos eredményhez először dátumra, utána árra érdemes szűrni.

3. Add hozzá a témád `functions.php` fájljához (lehetőleg gyermektémában), vagy egy kódrészlet-kezelő bővítménnyel (például Code Snippets) azt a PHP-horgot, amely a Tartomány szűrő változóját a kiválasztott időszak árához köti. A kódban a `_seasonal_price` helyére a saját lekérdezési változódat írd. Mentsd és aktiváld a részletet.
4. Szerkeszd az archívumoldalt, ahol a szálláshelyek listája van (a példában a JetThemeCore-ral készített archívumsablon, benne a Listing Grid). Ha a rácsban a tól-ig árat akarod mutatni, a listing elemben egy dinamikus címkét támogató widgetnél válaszd a JetBooking **Ár naponta/éjszakánként** címkét, és a **Ár megjelenítése** mezőben az **Ártartomány** lehetőséget. Így a legkisebb és a legnagyobb ár látszik.
5. Tedd az oldalra a Dátumtartomány szűrőt, a Tartomány szűrőt és egy **Alkalmaz gomb** widgetet.
   - A Dátumtartomány szűrőnél válaszd ki a szűrőt, a szolgáltató legyen **JetEngine**, és kapcsold be az alkalmaz gomb elrejtését, mert külön gombot használsz.
   - A Tartomány szűrőnél válaszd ki a szűrőt, a szolgáltató legyen **JetEngine**, az **Alkalmazás ekkor** pedig **Kattintás az alkalmaz gombra**.
   - Az Alkalmaz gombnál csak a szolgáltatót kell megadnod.
6. Mentsd az archívumoldalt.

Ha egy szálláshelyen hétfőn más az ár, mint a többi napon, és a látogató csak egy bizonyos napra, egy bizonyos összegért keres, a szűrő azt a szálláshelyet is kihagyja, amelynek az adott napi ára nem fér bele a megadott határba.
