# Adatok átvitele ismételhető mezőről csoportra

> Hogyan válts egy ismételhető (klónozható) mezőről csoport mezőre úgy, hogy a már kitöltött adatok megmaradjanak.

Ha egy egyszerű, ismételhető mezőt (például előadók nevét) később több adatot tartalmazó csoportra cserélsz, a már mentett értékek nem tűnnek el az adatbázisból, de a szerkesztőben nem látszanak. Az alábbi példa megmutatja, hogyan kötöd vissza őket egy rövid kóddal.

## A kiindulási állapot

A példában van egy **Esemény** egyéni bejegyzéstípus, benne egy `speaker` azonosítójú, ismételhető szöveges mező, amely az előadók nevét tárolja. A szerkesztőben minden előadó külön példányban szerepel.

Az adat az adatbázisban a mező azonosítóján (`speaker`), a nevek egyszerű tömbjeként van elmentve:

```php
[ 'Kovács Anna', 'Nagy Péter' ]
```

## A mező cseréje csoportra

Az előadóhoz a név mellé további adatot is el akarsz tárolni, például a profilképet. Ehhez:

1. Nyisd meg a mező szerkesztőjét, és az ismételhető mező típusát cseréld **Csoport** (`group`) típusra. Az azonosító maradjon `speaker`, és maradjon ismételhető.
2. Add hozzá az almezőket: egy `name` azonosítójút az előadó nevének (ez a legfontosabb, ebbe kerül át a régi adat), és egy `avatar` azonosítójút a profilképnek. A példa kódja egy `title` almezőt is felvesz, ezt üresen hagyja.
3. Mentsd a mezőt.

A csere után a szerkesztőben már a csoport jelenik meg, de az eddig megadott nevek nem látszanak: a régi érték sima szövegek tömbje, a csoport viszont almezőket tartalmazó tömböket vár.

## Az átalakító kód

Az adatot egyszeri kóddal alakítod át. Tedd a téma `functions.php` fájljába (vagy egy ideiglenes bővítménybe):

```php
add_action( 'admin_init', function () {
    if ( get_option( 'event_speaker_migrated' ) ) {
        return;
    }

    $query = new WP_Query( [
        'post_type'      => 'event',
        'posts_per_page' => 100,
        'post_status'    => 'any',
        'meta_query'     => [
            [
                'key'     => 'speaker',
                'compare' => 'EXISTS',
            ],
        ],
    ] );

    foreach ( $query->posts as $post ) {
        $old = get_post_meta( $post->ID, 'speaker', true );
        if ( empty( $old ) || is_array( $old[0] ) ) {
            continue;
        }

        $new = [];
        foreach ( $old as $name ) {
            $new[] = [
                'name'   => $name,
                'title'  => '',
                'avatar' => '',
            ];
        }
        update_post_meta( $post->ID, 'speaker', $new );
    }

    update_option( 'event_speaker_migrated', true );
} );
```

### Mit csinál a kód

1. Az `admin_init` horogra kapcsolódik, tehát csak az admin felületen fut le, a nyilvános oldalon nem.
2. Ha az `event_speaker_migrated` beállítás már létezik, kilép: az átvitel egyszer már lefutott, nem fut le újra.
3. Lekérdezi az `event` típusú bejegyzéseket (legfeljebb 100-at, bármilyen állapotban), amelyeknek van `speaker` meta kulcsa. Ez a kulcs az eredeti ismételhető mező azonosítója.
4. Bejegyzésenként beolvassa a régi értéket. Ha az üres, vagy az első eleme már tömb (vagyis már csoport formátumú), átugorja a bejegyzést.
5. A régi neveket szöveglistából csoportértékek listájává alakítja: a név a `name` almezőbe kerül, a `title` és az `avatar` üres marad.
6. A `update_post_meta()` felülírja a régi szerkezetet az újjal.
7. A végén elmenti az `event_speaker_migrated` beállítást, hogy a következő belépéskor a kód ne fusson újra.

Ha az adataid más azonosítóval vagy más bejegyzéstípussal vannak, a `post_type`, a `speaker` kulcs és az almezők azonosítói szerint igazítsd a kódot. Több mint 100 bejegyzésnél emeld meg a `posts_per_page` értékét.

## Ellenőrzés és takarítás

1. Töltsd újra a bejegyzés szerkesztőjét. Az előadók nevei újra látszanak, most már a csoport **name** almezőjében.
2. Ellenőrizd, hogy minden bejegyzés rendben van.
3. **Töröld a kódot** a téma fájljából, hogy később ne okozzon váratlan hibát.

Innentől a meglévő adatok elvesztése nélkül tölthetsz fel profilképet vagy bármilyen más almezőt.

> **Megjegyzés**
>
> Ha nem a mező típusát, hanem az azonosítóját (ID) kell megváltoztatnod, azt külön lépésekben kell elvégezned, mert az új azonosító alatt a régi értékek szintén nem látszanak.
