ACF Repeater est un type de champ spécial qui stocke plusieurs lignes de données — par exemple une liste d'URL vidéo, un ensemble de spécifications, ou tout groupe répétitif de sous-champs. Chaque ligne est une entrée distincte et ACF les stocke sous forme de tableau structuré dans la base de données, et non comme une simple chaîne de caractères.
Cela signifie que modifier un sous-champ Repeater directement dans BEAR (en l'ajoutant comme colonne méta) enregistrera techniquement la valeur, mais ACF ne la reconnaîtra pas comme une ligne de repeater valide — la donnée n'apparaîtra donc pas côté front-end. Pour que cela fonctionne correctement, vous avez besoin d'un hook personnalisé qui intercepte l'enregistrement et écrit la donnée via l'API ACF.
---
À quoi ressemblent les champs ACF Repeater dans BEAR
Lorsque vous ajoutez des sous-champs d'un Repeater à BEAR via l'onglet Champs méta (Meta Fields), ils apparaissent avec des clés comme :
my_repeater_0_my_subfield
my_repeater_1_my_subfield
my_repeater_2_my_subfield
Le nombre au milieu est l'index de la ligne (à partir de 0). Ainsi my_repeater_0_my_subfield est la ligne 1, my_repeater_1_my_subfield est la ligne 2, et ainsi de suite.
N'ajoutez pas le champ Repeater lui-même (par ex. my_repeater) à BEAR — seulement les sous-champs individuels.
---
Le hook
Ajoutez le code suivant au fichier functions.php de votre thème actif. Ajustez les noms de clés de champ pour correspondre à votre propre configuration ACF.
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);
---
Règles importantes
- Remplissez les lignes dans l'ordre. Remplissez toujours d'abord la ligne 0, puis la ligne 1, puis la ligne 2, et ainsi de suite. Si vous sautez une ligne (par ex. remplir la ligne 2 avant la ligne 1), la structure du tableau sera incorrecte et ACF ne la lira pas correctement.
- Pour supprimer une ligne — videz d'abord la valeur de la dernière ligne remplie, puis remontez. Ainsi la séquence reste propre.
- N'ajoutez pas le champ Repeater lui-même à BEAR — seulement les sous-champs individuels (ceux dont les clés contiennent des nombres). Le nombre de lignes du Repeater est géré automatiquement par le hook.
- Pour ajouter davantage de lignes — ajoutez simplement d'autres entrées au tableau
$handled_keys dans le code, en suivant le même modèle.
---
Comment trouver vos clés de champ
Le plus simple est de consulter la base de données. Allez sur un produit qui contient déjà des données dans votre Repeater, ouvrez BEAR → onglet Champs méta, cliquez sur Get keys from product by ID, saisissez l'ID de ce produit et appuyez sur Commencez (Get). Vous verrez toutes les clés méta de ce produit — recherchez les clés suivant le modèle repeater_N_subfield.
Vous pouvez également inspecter les paramètres du groupe de champs ACF — la clé du champ y est indiquée pour chaque champ.
---
Remarque sur plusieurs sous-champs par ligne
L'exemple ci-dessus suppose un seul sous-champ par ligne. Si votre Repeater comporte plusieurs sous-champs par ligne (par ex. une URL et un titre), étendez le tableau de ligne en conséquence :
$rows[$row_index] = array(
'my_subfield_url' => $url_value,
'my_subfield_title' => $title_value,
);
Dans ce cas, vous auriez besoin d'une condition de hook distincte pour chaque clé de sous-champ, en construisant la ligne complète à partir des valeurs actuelles avant l'enregistrement.
Réf. : https://pluginus.net/support/topic/acf-repeater-problem-view-on-front/