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
Szekció neve “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:
[ 'Kovács Anna', 'Nagy Péter' ]A mező cseréje csoportra
Szekció neve “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:
- Nyisd meg a mező szerkesztőjét, és az ismételhető mező típusát cseréld Csoport (
group) típusra. Az azonosító maradjonspeaker, és maradjon ismételhető. - Add hozzá az almezőket: egy
nameazonosítójút az előadó nevének (ez a legfontosabb, ebbe kerül át a régi adat), és egyavatarazonosítójút a profilképnek. A példa kódja egytitlealmezőt is felvesz, ezt üresen hagyja. - 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
Szekció neve “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):
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
Szekció neve “Mit csinál a kód”- Az
admin_inithorogra kapcsolódik, tehát csak az admin felületen fut le, a nyilvános oldalon nem. - Ha az
event_speaker_migratedbeállítás már létezik, kilép: az átvitel egyszer már lefutott, nem fut le újra. - Lekérdezi az
eventtípusú bejegyzéseket (legfeljebb 100-at, bármilyen állapotban), amelyeknek vanspeakermeta kulcsa. Ez a kulcs az eredeti ismételhető mező azonosítója. - 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.
- A régi neveket szöveglistából csoportértékek listájává alakítja: a név a
namealmezőbe kerül, atitleés azavatarüres marad. - A
update_post_meta()felülírja a régi szerkezetet az újjal. - A végén elmenti az
event_speaker_migratedbeá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
Szekció neve “Ellenőrzés és takarítás”- 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.
- Ellenőrizd, hogy minden bejegyzés rendben van.
- 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.
Készült: