'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}"; } }