# A kereső testreszabása kóddal

> További mezők a keresőűrlapon, leírás a találatokban és saját találati elrendezés a Kereső kiegészítő horgaival.

A keresőűrlap és a találatok megjelenését néhány horoggal (WordPress-szűrővel) módosíthatod. A kódot a sablonod `functions.php` fájljába (vagy egy saját bővítménybe) kell tenned. A példák kiindulási minták: a saját oldaladhoz igazítsd őket.

## További mezők a keresőűrlapon

A `wpbs_search_widget_additional_fields` szűrővel új mezőket adhatsz a keresőűrlaphoz. A mezők a dátummezők mellett jelennek meg.

![A keresőűrlap egy további, „Helyszín” legördülő mezővel](./kepek/kereso-horgok-tovabbi-mezo.webp)

*A keresőűrlap egy további, „Helyszín” legördülő mezővel* (https://minta-bolt.hu/szallaskereso/)

Figyeld meg, hogy a **Kezdés dátuma** és a **Befejezés dátuma** mellett ott a saját meződ is.

Minden mezőt egy tömb ír le a következő kulcsokkal:

| Kulcs | Mit csinál | Alapérték |
| --- | --- | --- |
| `name` | A mező neve, ez látszik az űrlapon. | üres |
| `slug` | A mező azonosítója. Ha üresen hagyod, a névből készül (`wpbs-search-<név>`). | a névből |
| `type` | A mező típusa: `dropdown` (legördülő lista) vagy `text` (szöveg). | üres |
| `required` | Kötelező-e kitölteni (`true` vagy `false`). | `false` |
| `required_message` | A hibaüzenet, ha a kötelező mező üres. | „A(z) … mező nem lehet üres.” jellegű alapüzenet |
| `placeholder` | A mezőben látszó segédszöveg. | üres |
| `values` | A legördülő lista értékei, csak `dropdown` típusnál. | üres lista |
| `validation` | Szűrőfüggvény: eldönti, hogy egy naptár megfelel-e a mező értékének. | minden naptár megfelel |

A `validation` függvény két paramétert kap: a látogató által választott értéket (`$value`) és a naptár adatait (`$data`). Ebből a `$data['calendar_id']` a naptár azonosítója, a `$data['post_id']` a naptárhoz rendelt bejegyzés azonosítója. `true` esetén a naptár szerepelhet a találatok között (ha a dátumok szabadok), `false` esetén kiesik.

### 1. példa: szűrés a bejegyzés meta-értéke szerint

Az új mező a naptárhoz rendelt bejegyzés valamelyik egyéni mezőjét (meta-értékét) hasonlítja a választott értékhez. Itt az ACF `number_of_people` mezőjével: ha a naptár kevesebb főt fogad, mint amennyit a látogató választott, kiesik a találatokból.

```php
add_filter('wpbs_search_widget_additional_fields', function ($fields) {
    $fields[] = array(
        'name' => 'Személyek',
        'type' => 'dropdown',
        'required' => true,
        'placeholder' => '',
        'values' => [1, 2, 3, 4],
        'validation' => function ($value, $data) {
            $post_id = $data['post_id'];

            if (function_exists('get_field') && get_field('number_of_people', $post_id) < $value) {
                return false;
            }

            return true;
        }
    );

    return $fields;
});
```

### 2. példa: szűrés a naptár azonosítója szerint

A mező értéke alapján más-más naptárakat jeleníthetsz meg. A példában a „Város” választásakor csak az 1., 2. és 3. naptár jelenik meg (ha szabadok a dátumok), a „Part” választásakor a 4., 5. és 6.

```php
add_filter('wpbs_search_widget_additional_fields', function ($fields) {
    $fields[] = array(
        'name' => 'Helyszín',
        'type' => 'dropdown',
        'required' => true,
        'placeholder' => '',
        'values' => ['Város', 'Part'],
        'validation' => function ($value, $data) {
            $calendar_id = $data['calendar_id'];

            if ($value == 'Város' && in_array($calendar_id, [1, 2, 3])) {
                return true;
            }

            if ($value == 'Part' && in_array($calendar_id, [4, 5, 6])) {
                return true;
            }

            return false;
        }
    );

    return $fields;
});
```

## Leírás a találatok mellett

A találatokban alapból nincs leírás, mert a naptárhoz nem tartozik erre szolgáló mező. A `wpbs_search_result_after_title` szűrővel a találat címe alá írhatsz egy rövid szöveget. A szöveg forrása lehet egyéni meta-mező, ACF-mező vagy a bejegyzés kivonata (ha van); azt használd, amelyik nálad megvan.

```php
add_filter('wpbs_search_result_after_title', function ($output, $data) {
    // egyéni meta-mezőből
    $description = get_post_meta($data['post_id'], 'description_text', true);

    // vagy ACF-mezőből
    // $description = get_field('description_text', $data['post_id']);

    // vagy a bejegyzés kivonatából
    // $description = get_the_excerpt($data['post_id']);

    if ($description) {
        $output .= '<p>' . $description . '</p>';
    }

    return $output;
}, 10, 2);
```

A három forrásból egyet válassz, a többi sort töröld vagy hagyd kommentben.

## A találatok elrendezésének módosítása

Az egyes találatok HTML-jét a `wpbs_search_resuts_html` szűrő adja át, itt átírhatod vagy teljesen lecserélheted. A szűrő neve a bővítményben így van írva (az „results” szóból kimarad az „l”), pontosan így használd.

A függvény `$output` paramétere a találat kész HTML-je, a `$data` tömb pedig az alapadatokat tartalmazza:

| Kulcs | Tartalma |
| --- | --- |
| `calendar_name` | A naptár neve. |
| `link` | A naptár oldalán beállított hivatkozás: üres, egy oldal vagy bejegyzés permalinkje, vagy külső hivatkozás. |
| `post_id` | A bejegyzés azonosítója, ha a hivatkozás típusa belső hivatkozás. |
| `button_label` | A megtekintés gomb felirata. |
| `price` | A kiválasztott időszak árai: az összár és az éjszakánkénti ár. |

```php
add_filter('wpbs_search_resuts_html', function ($output, $data) {
    // ide építsd a saját HTML-t

    return $output;
}, 10, 2);
```

A kisebb kiegészítésekhez nem kell az egész találatot lecserélni. Ezekkel a szűrőkkel a megfelelő helyre szúrhatsz be tartalmat: `wpbs_search_result_before_title`, `wpbs_search_result_after_title`, `wpbs_search_result_before_button`, `wpbs_search_result_after_button`.
