BEAR - WooCommerce Bulk Editor and Products Manager Professional

Wie man ACF-Repeater-Felder in Masse bearbeitet

ACF Repeater ist ein spezieller Feldtyp, der mehrere Datenzeilen speichert — zum Beispiel eine Liste von Video-URLs, einen Satz von Spezifikationen oder eine beliebige sich wiederholende Gruppe von Unterfeldern. Jede Zeile ist ein eigener Eintrag, und ACF speichert sie als strukturiertes Array in der Datenbank, nicht als einfachen String. Das bedeutet, dass das direkte Bearbeiten eines Repeater-Unterfelds in BEAR (durch Hinzufügen als Meta-Spalte) den Wert zwar technisch speichert, ACF ihn aber nicht als gültige Repeater-Zeile erkennt — die Daten erscheinen also nicht im Frontend. Damit es korrekt funktioniert, benötigen Sie einen eigenen Hook, der das Speichern abfängt und die Daten über die ACF-API schreibt. ---

So sehen ACF-Repeater-Felder in BEAR aus

Wenn Sie Unterfelder eines Repeaters über den Tab Metafelder (Meta Fields) zu BEAR hinzufügen, erscheinen sie mit Schlüsseln wie: my_repeater_0_my_subfield my_repeater_1_my_subfield my_repeater_2_my_subfield Die Zahl in der Mitte ist der Zeilenindex (beginnend bei 0). my_repeater_0_my_subfield ist also Zeile 1, my_repeater_1_my_subfield ist Zeile 2, und so weiter. Fügen Sie nicht das Repeater-Feld selbst (z. B. my_repeater) zu BEAR hinzu — nur die einzelnen Unterfelder. ---

Der Hook

Fügen Sie den folgenden Code in die functions.php-Datei Ihres aktiven Themes ein. Passen Sie die Feldschlüsselnamen an Ihr eigenes ACF-Setup an.
add_filter('woobe_before_update_product_field', function($value, $product_id, $field_key) {

    // Define your repeater field name and subfield name
    $repeater_name = 'my_repeater';       // your ACF Repeater field key
    $subfield_name = 'my_subfield';       // your subfield key inside the Repeater

    // List all subfield keys you added to BEAR (one per repeater row)
    $handled_keys = array(
        $repeater_name . '_0_' . $subfield_name,
        $repeater_name . '_1_' . $subfield_name,
        $repeater_name . '_2_' . $subfield_name,
        $repeater_name . '_3_' . $subfield_name,
        $repeater_name . '_4_' . $subfield_name,
        $repeater_name . '_5_' . $subfield_name,
    );

    if (!in_array($field_key, $handled_keys)) {
        return $value; // not our field, skip
    }

    // Extract row index from field key, e.g. "my_repeater_2_my_subfield" → 2
    preg_match_all('/\d+/', $field_key, $matches);
    $row_index = isset($matches[0][0]) ? intval($matches[0][0]) : null;

    if ($row_index === null) {
        return $value;
    }

    // Load current repeater data
    $repeater = get_field($repeater_name, $product_id);

    if ($repeater != null AND is_array($repeater)) {
        // Repeater exists - update or delete the row
        $rows = $repeater;

        // Make sure the row exists in the array
        if (!isset($rows[$row_index])) {
            $rows[$row_index] = array($subfield_name => null);
        }

        if ($value == '' || $value == null) {
            // Empty value - remove the row
            unset($rows[$row_index]);
        } else {
            // Set the new value for this row
            $rows[$row_index] = array($subfield_name => $value);
        }
    } else {
        // Repeater is empty - create from scratch
        $rows = array();
        $rows[$row_index] = array($subfield_name => $value);
    }

    // Save the updated repeater back via ACF API
    update_field($repeater_name, $rows, $product_id);

    return $value;

}, 12, 3);
---

Wichtige Regeln

  • Füllen Sie die Zeilen der Reihe nach. Füllen Sie immer zuerst Zeile 0, dann Zeile 1, dann Zeile 2 und so weiter. Wenn Sie eine Zeile überspringen (z. B. Zeile 2 vor Zeile 1 füllen), ist die Array-Struktur fehlerhaft und ACF kann sie nicht korrekt lesen.
  • Um eine Zeile zu löschen — leeren Sie zuerst den Wert in der zuletzt gefüllten Zeile und arbeiten Sie sich dann rückwärts vor. So bleibt die Reihenfolge sauber.
  • Fügen Sie das Repeater-Feld selbst nicht zu BEAR hinzu — nur die einzelnen Unterfelder (diejenigen mit Zahlen in ihren Schlüsseln). Die Anzahl der Repeater-Zeilen wird automatisch vom Hook verwaltet.
  • Um weitere Zeilen hinzuzufügen — fügen Sie einfach weitere Einträge nach demselben Muster zum $handled_keys-Array im Code hinzu.
---

So finden Sie Ihre Feldschlüssel

Am einfachsten schauen Sie in der Datenbank nach. Gehen Sie zu einem Produkt, das bereits Daten in Ihrem Repeater hat, öffnen Sie BEAR → Tab Metafelder, klicken Sie auf Get keys from product by ID, geben Sie diese Produkt-ID ein und klicken Sie auf Get. Sie sehen dann alle Meta-Schlüssel dieses Produkts — suchen Sie nach Schlüsseln nach dem Muster repeater_N_subfield. Alternativ können Sie die Einstellungen der ACF-Feldgruppe prüfen — dort wird der Feldschlüssel für jedes Feld angezeigt. ---

Hinweis zu mehreren Unterfeldern pro Zeile

Das obige Beispiel geht von einem Unterfeld pro Zeile aus. Wenn Ihr Repeater mehrere Unterfelder pro Zeile hat (z. B. eine URL und einen Titel), erweitern Sie das Zeilen-Array entsprechend:
$rows[$row_index] = array(
    'my_subfield_url'   => $url_value,
    'my_subfield_title' => $title_value,
);
In diesem Fall bräuchten Sie für jeden Unterfeld-Schlüssel eine eigene Hook-Bedingung, die die komplette Zeile aus den aktuellen Werten aufbaut, bevor gespeichert wird.   Ref: https://pluginus.net/support/topic/acf-repeater-problem-view-on-front/