'rwmb-group-title',
'data-options' => $field['group_title'],
);
if ( is_string( $field['group_title'] ) ) {
$title_attributes['data-options'] = array(
'type' => 'text',
'content' => $field['group_title'],
);
} else {
$title_attributes['data-options']['type'] = isset( $field['group_title']['field'] ) ? 'field' : 'text';
}
$title = '';
if ( 'text' === $title_attributes['data-options']['type'] ) {
$title = $title_attributes['data-options']['content'];
}
echo '
', $title, '
'; // WPCS: XSS OK.
// Collapse/expand icon.
echo '';
}
/**
* Change the way we get meta value for child fields.
*
* @param mixed $meta Meta value.
* @param array $child_field Child field.
* @param bool $saved Has the meta box been saved.
*
* @return mixed
*/
public static function child_field_meta( $meta, $child_field, $saved ) {
$group_meta = reset( self::$meta_queue );
$child_id = $child_field['id'];
if ( isset( $group_meta[ $child_id ] ) ) {
$meta = $group_meta[ $child_id ];
}
// Use $field['std'] only when the meta box hasn't been saved (i.e. the first time we run).
$meta = ! $saved && isset( $child_field['std'] ) ? $child_field['std'] : $meta;
// Escape attributes.
$meta = self::call( $child_field, 'esc_meta', $meta );
/**
* Make sure meta value is an array for clonable and multiple fields.
*
* @see RWMB_Field::meta()
*/
if ( $child_field['clone'] || $child_field['multiple'] ) {
if ( ! is_array( $meta ) && ! empty( $meta ) ) {
$meta = array( $meta );
}
if ( empty( $meta ) || ! is_array( $meta ) ) {
/**
* Note: if field is clonable, $meta must be an array with values.
* so that the foreach loop in self::show() runs properly.
*
* @see RWMB_Field::show()
*/
$meta = $child_field['clone'] ? array( '' ) : array();
}
}
return $meta;
}
/**
* Get meta value, make sure value is an array (of arrays if field is cloneable).
* Don't escape value.
*
* @param int $post_id Post ID.
* @param bool $saved Is the meta box saved.
* @param array $field Field parameters.
*
* @return mixed
*/
public static function meta( $post_id, $saved, $field ) {
$meta = self::raw_meta( $post_id, $field );
// Use $field['std'] only when the meta box hasn't been saved (i.e. the first time we run).
$meta = ! $saved && '' === $meta ? $field['std'] : $meta;
// Make sure returned value is an array.
if ( empty( $meta ) ) {
$meta = array();
}
// If cloneable, make sure each sub-value is an array.
if ( $field['clone'] ) {
// Make sure there's at least 1 sub-value.
if ( empty( $meta ) ) {
$meta[0] = array();
}
foreach ( $meta as $k => $v ) {
$meta[ $k ] = (array) $v;
}
}
return $meta;
}
/**
* Escape meta for field output. Just do nothing for group.
*
* @param array $meta Meta value.
*
* @return array
*/
public static function esc_meta( $meta ) {
return $meta;
}
/**
* Set value of meta before saving into database.
*
* @param mixed $new The submitted meta value.
* @param mixed $old The existing meta value.
* @param int $post_id The post ID.
* @param array $field The field parameters.
*
* @return array
*/
public static function value( $new, $old, $post_id, $field ) {
if ( empty( $field['fields'] ) || ! is_array( $field['fields'] ) ) {
return array();
}
$child_fields = $field['fields'];
if ( ! $new || ! is_array( $new ) ) {
$new = array();
}
foreach ( $child_fields as $child_field ) {
if ( ! in_array( $child_field['type'], array( 'file', 'image' ) ) ) {
continue;
}
$value = RWMB_File_Field::value( '', '', $post_id, $child_field );
$new[ $child_field['id'] ] = $value;
}
return self::sanitize( $new, $old, $post_id, $field );
}
/**
* Sanitize value of meta before saving into database.
*
* @param mixed $new The submitted meta value.
* @param mixed $old The existing meta value.
* @param int $post_id The post ID.
* @param array $field The field parameters.
*
* @return array
*/
public static function sanitize( $new, $old, $post_id, $field ) {
$sanitized = array();
if ( ! $new || ! is_array( $new ) ) {
return $sanitized;
}
foreach ( $new as $key => $value ) {
if ( is_array( $value ) && ! empty( $value ) ) {
$value = self::sanitize( $value, '', '', array() );
}
if ( '' !== $value && array() !== $value ) {
if ( is_int( $key ) ) {
$sanitized[] = $value;
} else {
$sanitized[ $key ] = $value;
}
}
}
return $sanitized;
}
/**
* Normalize group fields.
*
* @param array $field Field parameters.
*
* @return array
*/
public static function normalize( $field ) {
$field = parent::normalize( $field );
$field['fields'] = RW_Meta_Box::normalize_fields( $field['fields'] );
$field = wp_parse_args( $field, array(
'collapsible' => false,
'save_state' => false,
'group_title' => $field['clone'] ? __( 'Entry {#}', 'bianco' ) : __( 'Entry', 'bianco' ),
'default_state' => 'expanded',
) );
if ( $field['collapsible'] ) {
$field['class'] .= ' rwmb-group-collapsible';
}
// Add a new hidden field to save the collapse/expand state.
if ( $field['save_state'] ) {
$field['fields'][] = RWMB_Input_Field::normalize( array(
'type' => 'hidden',
'id' => '_state',
'std' => $field['default_state'],
'class' => 'rwmb-group-state',
'attributes' => array(
'data-current' => $field['default_state'],
),
) );
}
if ( ! $field['clone'] ) {
$field['class'] .= ' rwmb-group-non-cloneable';
}
return $field;
}
/**
* Change child field name from 'child' to 'parent[child]'.
*
* @param string $parent Parent field's name.
* @param string $child Child field's name.
*
* @return string
*/
protected static function child_field_name( $parent, $child ) {
$pos = strpos( $child, '[' );
$pos = false === $pos ? strlen( $child ) : $pos;
$name = $parent . '[' . substr( $child, 0, $pos ) . ']' . substr( $child, $pos );
return $name;
}
/**
* Change child field attribute id to from 'id' to 'parent_id'.
*
* @param array $parent Parent field.
* @param array $child Child field.
*
* @return string
*/
protected static function child_field_id( $parent, $child ) {
$parent = isset( $parent['attributes']['id'] ) ? $parent['attributes']['id'] : $parent['id'];
$child = isset( $child['attributes']['id'] ) ? $child['attributes']['id'] : $child['id'];
return "{$parent}_{$child}";
}
}