diff --git a/inc/fields/taxonomy-advanced.php b/inc/fields/taxonomy-advanced.php index 35272e41f..3c9330f81 100644 --- a/inc/fields/taxonomy-advanced.php +++ b/inc/fields/taxonomy-advanced.php @@ -9,28 +9,6 @@ * The taxonomy advanced field class. */ class RWMB_Taxonomy_Advanced_Field extends RWMB_Taxonomy_Field { - /** - * Normalize the field parameters. - * - * @param array $field Field parameters. - * - * @return array - */ - public static function normalize( $field ) { - $field = wp_parse_args( - $field, - array( - 'clone' => false, - ) - ); - - $clone = $field['clone']; - $field = parent::normalize( $field ); - $field['clone'] = $clone; - - return $field; - } - /** * Get meta values to save. * Save terms in custom field in form of comma-separated IDs, no more by setting post terms. @@ -60,10 +38,20 @@ public static function save( $new, $old, $post_id, $field ) { } $storage = $field['storage']; - if ( $new ) { - $storage->update( $post_id, $field['id'], $new ); - } else { + if ( ! $new ) { $storage->delete( $post_id, $field['id'] ); + return; + } + + if ( ! $field['clone'] || ! $field['clone_as_multiple'] ) { + $storage->update( $post_id, $field['id'], $new ); + return; + } + + // clone and clone_as_multiple. + $storage->delete( $post_id, $field['id'] ); + foreach ( $new as $value ) { + $storage->add( $post_id, $field['id'], $value ); } } @@ -83,7 +71,9 @@ public static function raw_meta( $object_id, $field, $args = array() ) { if ( empty( $meta ) ) { return $field['multiple'] ? array() : ''; } + $meta = is_array( $meta ) ? array_map( 'wp_parse_id_list', $meta ) : wp_parse_id_list( $meta ); + $meta = array_filter( $meta ); return $meta; diff --git a/inc/fields/taxonomy.php b/inc/fields/taxonomy.php index 4761a9be7..66c87b86d 100644 --- a/inc/fields/taxonomy.php +++ b/inc/fields/taxonomy.php @@ -68,8 +68,10 @@ public static function normalize( $field ) { ) ); - // Prevent cloning for taxonomy field. - $field['clone'] = false; + // Prevent cloning for taxonomy field, not for child fields (taxonomy_advanced). + if ( 'taxonomy' == $field['type'] ) { + $field['clone'] = false; + } $field = parent::normalize( $field ); diff --git a/tests/clone-taxonomy-advanced.php b/tests/clone-taxonomy-advanced.php new file mode 100644 index 000000000..2d3f14880 --- /dev/null +++ b/tests/clone-taxonomy-advanced.php @@ -0,0 +1,86 @@ + 'No clone', + 'fields' => [ + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta1', + 'name' => 'TA1', + ], + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta2', + 'name' => 'TA2 - Multiple', + 'multiple' => true, + ] + ], + ]; + $meta_boxes[] = [ + 'title' => 'Clone', + 'fields' => [ + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta3', + 'name' => 'TA3 - Clone', + 'clone' => true, + 'multiple' => false, + 'clone_as_multiple' => false, + ], + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta4', + 'name' => 'TA4 - Clone + Clone as multiple', + 'clone' => true, + 'multiple' => false, + 'clone_as_multiple' => true, + ], + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta5', + 'name' => 'TA5 - Clone + Multiple', + 'clone' => true, + 'multiple' => true, + 'clone_as_multiple' => false, + ], + [ + 'type' => 'taxonomy_advanced', + 'id' => 'ta6', + 'name' => 'TA6 - Clone + Multiple + Clone as multiple', + 'clone' => true, + 'multiple' => true, + 'clone_as_multiple' => true, + ], + ], + ]; + return $meta_boxes; +} ); + +add_filter( 'the_content', function( $content ) { + if ( ! is_single() ) { + return $content; + } + ob_start(); + $fields = range( 1, 6 ); + foreach ( $fields as $field ) { + $field = "ta$field"; + echo "

Field $field

"; + + echo '

rwmb_meta()

'; + $value = rwmb_meta( $field ); + echo '
';
+		print_r( $value );
+		echo '
'; + + echo '

rwmb_get_value()

'; + $value = rwmb_get_value( $field ); + echo '
';
+		print_r( $value );
+		echo '
'; + + echo '

rwmb_the_value()

'; + rwmb_the_value( $field ); + } + + return $content . ob_get_clean(); +} ); \ No newline at end of file