ACF Repeater es un tipo de campo especial que almacena varias filas de datos — por ejemplo, una lista de URLs de vídeo, un conjunto de especificaciones o cualquier grupo repetitivo de subcampos. Cada fila es una entrada independiente, y ACF las almacena como un array estructurado en la base de datos, no como una simple cadena de texto.
Esto significa que editar un subcampo de Repeater directamente en BEAR (añadiéndolo como columna meta) técnicamente guardará el valor, pero ACF no lo reconocerá como una fila de repeater válida, por lo que los datos no aparecerán en el front-end. Para que funcione correctamente, necesitas un hook personalizado que intercepte el guardado y escriba los datos a través de la API de ACF.
---
Cómo se ven los campos ACF Repeater en BEAR
Cuando añades subcampos de un Repeater a BEAR a través de la pestaña Campos meta (Meta Fields), aparecen con claves como:
my_repeater_0_my_subfield
my_repeater_1_my_subfield
my_repeater_2_my_subfield
El número en el medio es el índice de la fila (empezando desde 0). Así, my_repeater_0_my_subfield es la fila 1, my_repeater_1_my_subfield es la fila 2, y así sucesivamente.
No añadas el propio campo Repeater (por ejemplo, my_repeater) a BEAR — solo los subcampos individuales.
---
El hook
Añade el siguiente código al archivo functions.php de tu tema activo. Ajusta los nombres de las claves de campo para que coincidan con tu propia configuración de 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);
---
Reglas importantes
- Rellena las filas en orden. Rellena siempre primero la fila 0, luego la fila 1, luego la fila 2, y así sucesivamente. Si te saltas una fila (por ejemplo, rellenas la fila 2 antes que la 1), la estructura del array será incorrecta y ACF no la leerá correctamente.
- Para eliminar una fila — vacía primero el valor de la última fila rellenada, y trabaja hacia atrás. Así la secuencia se mantiene limpia.
- No añadas el propio campo Repeater a BEAR — solo los subcampos individuales (los que tienen números en sus claves). El recuento del Repeater se gestiona automáticamente mediante el hook.
- Para añadir más filas — simplemente añade más entradas al array
$handled_keys en el código, siguiendo el mismo patrón.
---
Cómo encontrar las claves de tus campos
La forma más fácil es mirar la base de datos. Ve a cualquier producto que ya tenga algún dato en tu Repeater, abre BEAR → pestaña Campos meta, haz clic en Get keys from product by ID, introduce ese ID de producto y pulsa Get. Verás todas las claves meta de ese producto — busca las claves que sigan el patrón repeater_N_subfield.
Alternativamente, revisa la configuración del grupo de campos de ACF — la clave del campo se muestra ahí para cada campo.
---
Nota sobre varios subcampos por fila
El ejemplo anterior asume un subcampo por fila. Si tu Repeater tiene varios subcampos por fila (por ejemplo, una URL y un título), amplía el array de la fila en consecuencia:
$rows[$row_index] = array(
'my_subfield_url' => $url_value,
'my_subfield_title' => $title_value,
);
En este caso necesitarías una condición de hook independiente para cada clave de subcampo, construyendo la fila completa a partir de los valores actuales antes de guardar.
Ref: https://pluginus.net/support/topic/acf-repeater-problem-view-on-front/