Tovább a tartalomhoz

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 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' ]

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 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 );
} );
  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.

  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.

Készült:

Tiszteletben tartjuk a magánszférádat

Sütiket használunk a böngészési élmény javítására és a forgalom elemzésére. Az analitika csak akkor indul, ha engeded. Adatvédelmi irányelvek, Sütitájékoztató.

Sütibeállítások