element_factory = $element_factory; $this->fields_to_sync = $fields_to_sync; } /** * @param int $post_id_from * @param string $meta_key */ public function sync_to_translations( $post_id_from, $meta_key ) { if ( in_array( $meta_key, $this->fields_to_sync, true ) ) { $post_element = $this->element_factory->create( $post_id_from, 'post' ); $translations = $post_element->get_translations(); foreach ( $translations as $translation ) { $translation_id = $translation->get_element_id(); if ( $translation_id !== $post_id_from ) { $this->sync_custom_field( $post_id_from, $translation_id, $meta_key ); } } } } /** * @param int $post_id_from */ public function sync_all_custom_fields( $post_id_from ) { foreach ( $this->fields_to_sync as $meta_key ) { $this->sync_to_translations( $post_id_from, $meta_key ); } } /** * @param int $post_id_from * @param int $post_id_to * @param string $meta_key */ public function sync_custom_field( $post_id_from, $post_id_to, $meta_key ) { $custom_fields_from = get_post_meta( $post_id_from ); $custom_fields_to = get_post_meta( $post_id_to ); $values_from = isset( $custom_fields_from[ $meta_key ] ) ? $custom_fields_from[ $meta_key ] : []; $values_to = isset( $custom_fields_to[ $meta_key ] ) ? $custom_fields_to[ $meta_key ] : []; $removed = array_diff( $values_to, $values_from ); foreach ( $removed as $v ) { delete_post_meta( $post_id_to, $meta_key, maybe_unserialize( $v ) ); } $added = array_diff( $values_from, $values_to ); foreach ( $added as $v ) { $copied_value = maybe_unserialize( $v ); /** * Filters the $copied_value of $meta_key which will be copied from $post_id_from to $post_id_to * * @param mixed $copied_value The unserialized and slashed value. * @param int $post_id_from The ID of the source post. * @param int $post_id_to The ID of the destination post. * @param string $meta_key The key of the post meta being copied. * * @since 4.3.0 */ $copied_value = apply_filters( 'wpml_sync_custom_field_copied_value', $copied_value, $post_id_from, $post_id_to, $meta_key ); $copied_value = wp_slash( $copied_value ); add_post_meta( $post_id_to, $meta_key, $copied_value ); } do_action( 'wpml_after_copy_custom_field', $post_id_from, $post_id_to, $meta_key ); } }