# Események dátum szerint: jövőbeli, múltbeli és ismétlődő időpontok

> Jövőbeli és múltbeli események, az előző havi bejegyzések, az időzóna és az Advanced Date mező összes ismétlődő időpontjának listázása.

## Jövőbeli és múltbeli események

Egy egyéni bejegyzéstípus **Dátum** metamezője alapján külön listába teheted a jövőbeli és a múltbeli eseményeket. Előfeltétel: ingyenes Elementor vagy blokkszerkesztő, aktív JetEngine, egy egyéni bejegyzéstípus (a példában „Események”), amelynek van **Dátum** típusú metamezője (például `event-date`), és kitöltött bejegyzések.

A mezőnél kapcsold be a **Save as timestamp** kapcsolót a **JetEngine → Bejegyzéstípusok** oldalon a bejegyzéstípus metamezőinek beállításaiban. Enélkül a lekérdezés nem működik.

### A lekérdezés alapja

1. A **JetEngine → Lekérdezéskészítő** oldalon add hozzá az új lekérdezést, adj neki nevet, a típusa **Posts**.
2. A **Posts Query** szakasz **General** fülén válaszd ki a bejegyzéstípust. Ugyanaz legyen, mint a listázási elem forrása.

A további lépések attól függnek, mit akarsz megjeleníteni.

### Jövőbeli események

1. A **Meta Query** fülön kattints az **Add new** gombra.
2. A **Field key/name** mezőbe írd a **Dátum** mező nevét, a **Compare** értéke **Greater than**.
3. A **Value** mező melletti dinamikus címke gombbal válaszd a **Today** opciót.
4. A **Type** értéke **Timestamp**, a **Clause name** egy tetszőleges név.
5. A **General** fülön az **Order & Order By** részben kattints az **Add new sorting parameter** gombra: **Order By** = **Order by meta clause**, válaszd ki az imént létrehozott klózt, és az irányt (**From lowest to highest values** vagy **From highest to lowest values**).
6. Kattints az **Add/Update Query** gombra.

### Múltbeli események

Ugyanígy, de a **Compare** értéke **Less than**. A **Value** mezőben ismét a **Today** dinamikus címke, a **Type** **Timestamp**, a **Clause name** egy név. Rendezésnél újra az **Order by meta clause** opciót válaszd, majd mentsd a lekérdezést.

### Az előző havi bejegyzések

1. A **Date Query** fülön kattints az **Add new** gombra.
2. Az **After** mezőbe írd: `first day of previous month midnight`, a **Before** mezőbe: `first day of this month midnight`.
3. A **Compare** értéke **Equal**, a **Column** pedig **Post Date**.
4. Mentsd a lekérdezést.

A mezőkben a PHP relatív dátumformátumai használhatók.

### A lekérdezés az oldalon

1. A szerkesztőben add hozzá a Listing Grid widgetet, ha még nincs ott.
2. A **Content** beállítások **Custom Query** fülén kapcsold be a **Use Custom Query** kapcsolót, és válaszd ki a kívánt lekérdezést.
3. Tedd közzé az oldalt.

Több Listing Gridet is használhatsz egy oldalon, mindegyikhez más lekérdezéssel (például jövőbeli, múltbeli, előző havi). A jövőbeli lekérdezés az aznapnál későbbi dátumú eseményeket mutatja, a múltbeli a már megtörténteket, az utolsó az előző hónapban közzétetteket.

### Időzóna

Ha az események rosszul jelennek meg (például a jövőbeli események múltbeliként látszanak, vagy fordítva), az időzónák eltérése okozhatja. A **Today** érték a weboldal időzónája szerint számolódik, nem a látogatóéra. Például ha nálad 22:00 van UTC-4 zónában, UTC+0 zónában már 02:00 van, vagyis a következő nap: az „ma” események jövőbelinek számíthatnak. Javítás: **Beállítások → Általános → Időzóna**, itt a saját időzónádat válaszd.

### Gyakori kérdések

**Miért nincs találat?** Ellenőrizd, hogy a lekérdezésben a megfelelő bejegyzéstípus van-e kiválasztva, a metamező neve pontosan egyezik-e (például `event-date`), a bejegyzéseknek van-e értéke ebben a mezőben, és be van-e kapcsolva a **Save as timestamp** a **Dátum** mezőnél.

**Miért függ az eredmény a napszaktól?** Az időzóna eltérése miatt (lásd fent).

**Miért nem jó a rendezés?** Ellenőrizd, hogy a rendezés **Order by meta clause**, a megfelelő klóz van kiválasztva, a mező időbélyegként tárolja az értékeket, és az irány megfelel a céljadnak.

## Az Advanced Date mező kezdő- és záródátumának kiírása

Az **Advanced Date** mező kezdő- és záródátumát a Listing Grid sablonjában két **Dynamic Field** elemmel jelenítheted meg. Szükséges hozzá a bekapcsolt **Dinamikus naptár** modul és egy egyedi bejegyzéstípus; a módszer Elementorban, a blokkszerkesztőben és Bricksben is működik.

1. Nyisd meg a **JetEngine → Metaboxok** oldalt, és hozz létre metaboxot az egyedi bejegyzéstípushoz (a példában „Filmek”). A **Visibility Conditions** részben az **Enable For Post Types** listában válaszd ki a bejegyzéstípust.
2. A **Meta fields** résznél add meg a mező **Label** értékét (a **Name/ID** automatikusan kitöltődik, a példában `dates`), a **Field type** legyen **Advanced Date**. Mentsd az **Add Meta Box** vagy **Update Meta Box** gombbal.
3. Nyisd meg a bejegyzéseket, és töltsd ki a mező **Start date** és **Has end date** beállítását. Ismétlődő eseménynél kapcsold be az **Is recurring** kapcsolót, és válaszd ki az ismétlés módját (például „Weekly”). Mentsd a bejegyzést.
4. A **JetEngine → Listázások** oldalon hozz létre listázási elemet a bejegyzéstípushoz, és tedd rá a megjelenítendő mezőket a **Dynamic Field** és a **Dynamic Image** elemmel.
5. A kezdődátumhoz vegyél fel egy **Dynamic Field** elemet: a **Source** legyen **Meta Data**, az **Object field / Meta field / Repeater key / Component prop** mezőbe írd a mező nevét (`dates`). Kapcsold be a **Filter field output** kapcsolót, a **Callback** legyen **Format date**, a **Field format** mezőben pedig a `%s` elé írhatsz szöveget (például „Kezdés: %s”).
6. A záródátumhoz vegyél fel egy másik **Dynamic Field** elemet: a **Source** legyen **Meta Data**, a mező neve pedig `dates__end_date`, vagyis a mező neve, két alsó kötőjel és az `end_date`. A **Filter field output** és a **Format date** callback ugyanúgy kell, a **Field format** pedig például „Vége: %s”.
7. Mentsd a listázási elemet, és hozz létre egy oldalt, amelyre a **Listing Grid** elemmel kiválasztod ezt a listázást. Tedd közzé, és ellenőrizd a frontenden, hogy a dátumok helyesen látszanak.

Az **Advanced Date** adatait a **Dynamic Calendar** widgettel is megjelenítheted: az ismétlődő események naptárban való megjelenítéséről a [Naptár](https://hub.hellowp.io/hu/plugins/jet-engine/listazas-naptar/) fejezet szól.

## Az Advanced Date mező összes ismétlődő időpontja

Az **Advanced Date** metamező egyetlen bejegyzéshez rendelhet ismétlődő időpontokat (például egy heti rendszerességű esemény egy bejegyzés maradhat az adatbázisban). A mező az ismétlődéseket külön metarekordként tárolja, ezért az összes előfordulás kiírásához SQL-lekérdezés kell. Előfeltétel: ingyenes Elementor, blokkszerkesztő vagy Bricks, aktív JetEngine. Az eredmény egyedi bejegyzés oldalán és bejegyzéslistában is megjeleníthető.

1. A **JetEngine → Modulok** oldalon kapcsold be a **Dynamic Calendar** modult, és kattints a mentésre.
2. Vegyél fel **Advanced Date** típusú metamezőt az egyéni bejegyzéstípushoz: a **Bejegyzéstípusok** oldalon nyisd meg a típust, a **Meta Fields** szakaszban kattints a **New Meta Field** gombra, add meg a **Label** értéket (a **Name/ID** automatikusan kitöltődik), a **Field type** legyen **Advanced Date**. Kattints az **Update Post Type** gombra.
3. Töltsd ki a mezőt az ismétlődő időpontokkal a bejegyzéseknél, és mentsd őket.

### SQL-lekérdezés

1. A **JetEngine → Lekérdezéskészítő** oldalon add hozzá az új lekérdezést, a típusa **SQL/AI Query**.
2. A **Custom SQL Query** szakaszban a **From table** értéke `postmeta`.
3. A **Where (query clauses)** résznél kattints az **Add new** gombra: **Column** = `meta_key`, **Operator** = **Equal**, **Value** = a metamező kulcsa. Ez a feltétel az adott **Advanced Date** mezőre szűkít.
4. Adj hozzá még egy feltételt: **Column** = `post_id`, **Operator** = **Equal**, a **Value** mezőnél a dinamikus címkével válaszd a **Current ID** makrót, hogy csak az aktuális bejegyzés időpontjai jöjjenek. A **Where Relation** értéke **And**.
5. Rendezéshez az **Order & Order By** részben: **Order By** = `meta_value`, **Order** = **From lowest to highest values**. Így időrendben lesznek az időpontok.
6. Mentsd a lekérdezést.

### Listázási elem

1. Hozz létre új listázási elemet, a forrás a most készített SQL-lekérdezés.
2. Tegyél bele **Dynamic Field** widgetet: a **Source** legyen **Meta Data**, az **Object Field / Meta field / Repeater key / Component prop** értéke `meta_value`. A lekérdezés metarekordokat ad vissza, a mező a tárolt értéket mutatja.
3. Kapcsold be a **Filter field output** kapcsolót, és válaszd a **Format date** callbacket, amely olvasható dátummá alakítja az értéket (a formátumot itt állítod).
4. Mentsd a listázási elemet.

### Megjelenítés

Nyisd meg az egyedi bejegyzés sablonját (vagy az oldalt, ahol a lista van), tegyél bele egy **Listing Grid** widgetet, és a **Listing** mezőben válaszd az ismétlődő időpontokat tartalmazó listázási elemet. Mentsd az oldalt. A frontenden az **Advanced Date** mező összes ismétlődő időpontja látszik.

### Kézzel megadott ismétlődés

Ha az **Advanced Date** mező **Recurrence Format** értéke **Manually**, az időpontokat nem a rendszer generálja, így az SQL-es megoldás nem működik. Ilyenkor (előtte készíts biztonsági mentést) egy PHP-részletre van szükség: az aktív gyermektéma `functions.php` fájljába vagy a **Code Snippets** bővítménybe kell elhelyezni, és egy shortcode jeleníti meg az időpontokat. A shortcode az egyedi bejegyzés oldalán vagy a listázási elemben használható:

```text
[get_adv_date_manual_input meta_key='adv_date' separator="<hr>" divider="/"]
```

Az `adv_date` helyére a saját **Advanced Date** metameződ neve kerül. A `separator` az időpontok közé kerülő HTML-elem, a `divider` pedig a dátum részeit elválasztó karakter. A shortcode kiírja az összes kézzel megadott időpontot.

### Gyakori kérdések

**Miért nem ad vissza dátumot az SQL-lekérdezés?** Ellenőrizd, hogy a bejegyzésnek vannak-e a mezővel generált ismétlődő időpontjai. Ha az ismétlődés kézi, a shortcode-os módszert használd.

**Rendezhetem az időpontokat?** Igen, az SQL-lekérdezés **Order & Order By** beállításaiban növekvő vagy csökkenő sorrendet adhatsz meg.

**Módosíthatom a dátumformátumot?** Igen, a **Dynamic Field** beállításainál kapcsold be a **Filter field output** kapcsolót, válaszd a **Format date** callbacket, és állítsd be a formátumot.
