Skip to content

Campos compuestos ​

Repetidor ​

php
array(
	'type'         => 'repeater',
	'name'         => 'banner',
	'label'        => 'Banner',
	'button_label' => 'Añadir banner',
	'min'          => 1,
	'max'          => 5,
	'sub_fields'   => array(
		array( 'type' => 'image', 'name' => 'desktop', 'label' => 'Desktop', 'wrapper' => array( 'width' => '15' ) ),
		array( 'type' => 'text',  'name' => 'title',   'label' => 'Title' ),
		array( 'type' => 'url',   'name' => 'button_url', 'label' => 'Button url' ),
	),
)

En la plantilla devuelve una lista de filas, con cada subcampo ya formateado:

php
foreach ( forja_get_field( 'banner' ) as $fila ) {
	echo wp_get_attachment_image( $fila['desktop'], 'large' );
	echo esc_html( $fila['title'] );
}

wrapper.width en un subcampo fija el ancho de su columna.

Compatibilidad con ACF. Se almacena en el mismo formato, una clave por subcampo y fila:

banner            => 2
banner_0_titulo   => 'Primera'
banner_1_titulo   => 'Segunda'

Es decir: un sitio que ya tenga repetidores de ACF se lee sin migrar nada. Y cada subcampo sigue siendo consultable con meta_query, cosa que se perdería serializando un array.

Compuestos dentro de compuestos ​

Un repetidor puede llevar dentro otro repetidor, un grupo o un contenido flexible, y al revés:

php
array(
	'type'       => 'repeater',
	'name'       => 'secciones',
	'sub_fields' => array(
		array( 'type' => 'text', 'name' => 'titulo' ),
		array(
			'type'       => 'repeater',
			'name'       => 'tarjetas',
			'sub_fields' => array(
				array( 'type' => 'text', 'name' => 'texto' ),
			),
		),
	),
)

En la plantilla, cada nivel es una lista dentro de la fila del anterior:

php
foreach ( forja_get_field( 'secciones' ) as $seccion ) {
	echo esc_html( $seccion['titulo'] );

	foreach ( $seccion['tarjetas'] as $tarjeta ) {
		echo esc_html( $tarjeta['texto'] );
	}
}

Las claves encadenan las posiciones, igual que en ACF:

secciones                    => 1
secciones_0_titulo           => 'Primera'
secciones_0_tarjetas         => 2
secciones_0_tarjetas_0_texto => 'A'
secciones_0_tarjetas_1_texto => 'B'

Un grupo dentro de un repetidor añade su nombre sin posición: personas_0_contacto_email.

Grupo ​

Un repetidor de una sola fila: agrupa subcampos bajo un nombre común.

php
array(
	'type'       => 'group',
	'name'       => 'direccion',
	'label'      => 'Dirección',
	'sub_fields' => array(
		array( 'type' => 'text',   'name' => 'calle',  'label' => 'Calle' ),
		array( 'type' => 'number', 'name' => 'numero', 'label' => 'Número' ),
	),
)

Se almacena como direccion_calle y direccion_numero, el formato de ACF. En la plantilla devuelve un array indexado por nombre de subcampo:

php
$direccion = forja_get_field( 'direccion' );

echo esc_html( $direccion['calle'] );

layout acepta block (etiquetas arriba, por defecto) o row (a la izquierda). A diferencia del acordeón, que sólo agrupa visualmente, aquí el nombre del grupo forma parte de la clave.

Contenido flexible ​

Un repetidor en el que cada fila puede tener una forma distinta:

php
array(
	'type'         => 'flexible_content',
	'name'         => 'secciones',
	'button_label' => 'Añadir sección',
	'layouts'      => array(
		'banner' => array(
			'label'      => 'Banner',
			'sub_fields' => array(
				array( 'type' => 'image', 'name' => 'imagen', 'label' => 'Imagen' ),
				array( 'type' => 'text',  'name' => 'titular', 'label' => 'Titular' ),
			),
		),
		'texto'  => array(
			'label'      => 'Texto',
			'sub_fields' => array(
				array( 'type' => 'textarea', 'name' => 'cuerpo', 'label' => 'Cuerpo' ),
			),
		),
	),
)

Cada fila devuelve su capa en la clave acf_fc_layout:

php
foreach ( forja_get_field( 'secciones' ) as $seccion ) {
	match ( $seccion['acf_fc_layout'] ) {
		'banner' => get_template_part( 'partials/banner', null, $seccion ),
		'texto'  => get_template_part( 'partials/texto', null, $seccion ),
		default  => null,
	};
}

Se almacena en el formato de ACF: la clave del campo guarda la lista ordenada de capas, y los valores usan el mismo esquema que el repetidor. El índice es la posición en la lista, no la posición dentro de su capa.

Publicado con licencia GPL-2.0 o posterior.