sitepress = $sitepress; $this->woocommerce = $woocommerce; $this->woocommerce_wpml = $woocommerce_wpml; $this->wpdb = $wpdb; $this->tp = $tp; } public function add_hooks(){ add_action( 'wcml_update_extra_fields', array( $this, 'sync_tabs' ), 10, 4 ); add_action( 'wcml_gui_additional_box_html', array( $this, 'custom_box_html' ), 10, 3 ); add_filter( 'wcml_gui_additional_box_data', array( $this, 'custom_box_html_data' ), 10, 4 ); add_filter( 'wpml_duplicate_custom_fields_exceptions', array( $this, 'duplicate_custom_fields_exceptions' ) ); add_action( 'wcml_after_duplicate_product', array( $this, 'duplicate_product_tabs' ) , 10, 2 ); add_filter( 'wc_tab_manager_tab_id', array( $this, 'wc_tab_manager_tab_id' ), 10, 1 ); if ( $this->sitepress->get_wp_api()->version_compare( $this->sitepress->get_wp_api()->constant( 'WCML_VERSION' ), '3.7.2', '>' ) ) { add_filter( 'option_wpml_config_files_arr', array( $this, 'make__product_tabs_not_translatable_by_default' ), 0 ); } if ( is_admin() ) { add_action( 'save_post', array( $this, 'force_set_language_information_on_product_tabs' ), 10, 2 ); add_action( 'save_post', array( $this, 'sync_product_tabs' ), 10, 2 ); add_filter( 'wpml_tm_translation_job_data', array( $this, 'append_custom_tabs_to_translation_package' ), 10, 2 ); add_action( 'wpml_translation_job_saved', array( $this, 'save_custom_tabs_translation' ), 10, 3 ); add_action( 'woocommerce_product_data_panels', array( $this, 'show_pointer_info' ) ); add_filter( 'wcml_do_not_display_custom_fields_for_product', array( $this, 'replace_tm_editor_custom_fields_with_own_sections' ) ); add_filter( 'wpml_duplicate_custom_fields_exceptions', array( $this, 'duplicate_categories_exception' ) ); add_action( 'wpml_after_copy_custom_field', array( $this, 'translate_categories' ), 10, 3 ); }else{ add_filter( 'option_wc_tab_manager_default_layout', array( $this, 'filter_default_layout' ) ); } } /** * @param $wpml_config_array * * @return mixed */ function make__product_tabs_not_translatable_by_default( $wpml_config_array ) { if ( isset( $wpml_config_array->plugins['WooCommerce Tab Manager'] ) ) { $wpml_config_array->plugins['WooCommerce Tab Manager'] = str_replace( '_product_tabs', '_product_tabs', $wpml_config_array->plugins['WooCommerce Tab Manager'] ); } return $wpml_config_array; } /** * @param $original_product_id * @param $trnsl_product_id * @param $data * @param $lang * * @return bool */ function sync_tabs( $original_product_id, $trnsl_product_id, $data, $lang ) { //check if "duplicate" product if ( ( isset( $_POST['icl_ajx_action'] ) && ( 'make_duplicates' === $_POST['icl_ajx_action'] ) ) || ( get_post_meta( $trnsl_product_id , '_icl_lang_duplicate_of', true ) ) ) { $this->duplicate_tabs( $original_product_id, $trnsl_product_id, $lang ); } $orig_prod_tabs = $this->get_product_tabs( $original_product_id ); if ( $orig_prod_tabs ) { $trnsl_product_tabs = array(); $i = 0; foreach ( $orig_prod_tabs as $key => $orig_prod_tab ) { switch ( $orig_prod_tab['type'] ) { case 'core': $default_language = $this->woocommerce_wpml->products->get_original_product_language( $original_product_id ); $current_language = $this->sitepress->get_current_language(); $trnsl_product_tabs[ $key ] = $orig_prod_tabs[ $key ]; $title = isset( $data[ md5( 'coretab_'.$orig_prod_tab['id'].'_title' ) ] ) ? $data[ md5( 'coretab_'.$orig_prod_tab['id'].'_title' ) ] : ''; $heading = isset( $data[ md5( 'coretab_'.$orig_prod_tab['id'].'_heading' ) ] ) ? $data[ md5( 'coretab_'.$orig_prod_tab['id'].'_heading' ) ] : ''; if ( $default_language !== $lang ) { $this->refresh_text_domain( $lang ); if ( ! $title ) { $title = isset( $_POST['product_tab_title'][ $orig_prod_tab['position'] ] ) ? $_POST['product_tab_title'][ $orig_prod_tab['position'] ] : $orig_prod_tabs[ $key ]['title']; $title = __( $title, 'woocommerce' ); } if ( ! $heading && ( isset( $orig_prod_tabs[ $key ]['heading'] ) || isset( $_POST['product_tab_heading'][ $orig_prod_tab['position'] ] ) ) ) { $heading = isset( $_POST['product_tab_heading'][ $orig_prod_tab['position'] ] ) ? $_POST['product_tab_heading'][ $orig_prod_tab['position'] ] : $orig_prod_tabs[ $key ]['heading']; $heading = __( $heading, 'woocommerce' ); } $this->refresh_text_domain( $current_language ); } $trnsl_product_tabs[ $key ]['title'] = $title; $trnsl_product_tabs[ $key ]['heading'] = $heading; break; case 'global': $trnsl_product_tabs = $this->set_global_tab( $orig_prod_tab, $trnsl_product_tabs, $lang ); break; case 'product': $tab_id = false; $title_key = md5( 'tab_' . $orig_prod_tab['position'] . '_title' ); $heading_key = md5( 'tab_' . $orig_prod_tab['position'] . '_heading' ); $title = isset( $data[ $title_key ] ) ? sanitize_text_field( $data[ $title_key ] ) : ''; $content = isset( $data[ $heading_key ] ) ? wp_kses_post( $data[ $heading_key ] ) : ''; $trnsl_product_tabs = $this->set_product_tab( $orig_prod_tab, $trnsl_product_tabs, $lang, $trnsl_product_id, $tab_id, $title, $content ); $i++; break; } } update_post_meta( $trnsl_product_id, '_product_tabs', $trnsl_product_tabs ); return true; } return false; } /** * @param $original_product_id * @param $trnsl_product_id * @param $lang */ function duplicate_tabs( $original_product_id, $trnsl_product_id, $lang ) { $orig_prod_tabs = maybe_unserialize( get_post_meta( $original_product_id, '_product_tabs', true ) ); $prod_tabs = array(); foreach ( $orig_prod_tabs as $key => $orig_prod_tab ) { switch ( $orig_prod_tab['type'] ) { case 'core': $prod_tabs[ $key ] = $orig_prod_tab; $this->refresh_text_domain( $lang ); $prod_tabs[ $key ]['title'] = __( $orig_prod_tab['title'], 'woocommerce' ); if ( isset( $orig_prod_tab['heading'] ) ) { $prod_tabs[ $key ]['heading'] = __( $orig_prod_tab['heading'], 'woocommerce' ); } $orig_lang = $this->sitepress->get_language_for_element( $original_product_id, 'post_product' ); $this->refresh_text_domain( $orig_lang ); break; case 'global': $prod_tabs = $this->set_global_tab( $orig_prod_tab, $prod_tabs, $lang ); break; case 'product': $original_tab = get_post( $orig_prod_tab['id'] ); $prod_tabs = $this->set_product_tab( $orig_prod_tab, $prod_tabs, $lang, $trnsl_product_id, false, $original_tab->post_title , $original_tab->post_content ); break; } } update_post_meta( $trnsl_product_id, '_product_tabs', $prod_tabs ); } /** * @param $lang */ function refresh_text_domain( $lang ) { unload_textdomain( 'woocommerce' ); $this->sitepress->switch_lang( $lang ); $this->woocommerce->load_plugin_textdomain(); } /** * @param $orig_prod_tab * @param $trnsl_product_tabs * @param $lang * * @return mixed */ function set_global_tab( $orig_prod_tab, $trnsl_product_tabs, $lang ) { $tr_tab_id = apply_filters( 'translate_object_id', $orig_prod_tab['id'], 'wc_product_tab', true, $lang ); $trnsl_product_tabs[ $orig_prod_tab['type'].'_tab_'. $tr_tab_id ] = array( 'position' => $orig_prod_tab['position'], 'type' => $orig_prod_tab['type'], 'id' => $tr_tab_id, 'name' => get_post( $tr_tab_id )->post_name, ); return $trnsl_product_tabs; } /** * @param $orig_prod_tab * @param $trnsl_product_tabs * @param $lang * @param $trnsl_product_id * @param $tab_id * @param $title * @param $content * * @return mixed */ function set_product_tab( $orig_prod_tab, $trnsl_product_tabs, $lang, $trnsl_product_id, $tab_id, $title, $content ) { if ( ! $tab_id ) { $tr_tab_id = apply_filters( 'translate_object_id', $orig_prod_tab['id'], 'wc_product_tab', false, $lang ); if ( ! is_null( $tr_tab_id ) ) { $tab_id = $tr_tab_id; } } if ( $tab_id ) { //update existing tab $args = array(); $args['post_title'] = $title; $args['post_content'] = $content; $this->wpdb->update( $this->wpdb->posts, $args, array( 'ID' => $tab_id ) ); } else { //tab not exist creating new $args = array(); $args['post_title'] = $title; $args['post_content'] = $content; $args['post_author'] = get_current_user_id(); $args['post_name'] = sanitize_title( $title ); $args['post_type'] = 'wc_product_tab'; $args['post_parent'] = $trnsl_product_id; $args['post_status'] = 'publish'; $this->wpdb->insert( $this->wpdb->posts, $args ); $tab_id = $this->wpdb->insert_id; $tab_trid = $this->sitepress->get_element_trid( $orig_prod_tab['id'], 'post_wc_product_tab' ); if ( ! $tab_trid ) { $this->sitepress->set_element_language_details( $orig_prod_tab['id'], 'post_wc_product_tab', false, $this->sitepress->get_default_language() ); $tab_trid = $this->sitepress->get_element_trid( $orig_prod_tab['id'], 'post_wc_product_tab' ); } $this->sitepress->set_element_language_details( $tab_id, 'post_wc_product_tab', $tab_trid, $lang ); } if ( empty( $title ) || strlen( $title ) != strlen( utf8_encode( $title ) ) ) { $tab_name = "product-tab-". $tab_id; } else { $tab_name = sanitize_title( $title ); } $trnsl_product_tabs[ $orig_prod_tab['type'] . '_tab_' . $tab_id ] = array( 'position' => $orig_prod_tab['position'], 'type' => $orig_prod_tab['type'], 'id' => $tab_id, 'name' => $tab_name, ); return $trnsl_product_tabs; } /** * @param $exceptions * * @return array */ function duplicate_custom_fields_exceptions( $exceptions ) { $exceptions[] = '_product_tabs'; return $exceptions; } /** * @param $obj * @param $product_id * @param $data * * @return bool */ function custom_box_html( $obj, $product_id, $data ) { if ( 'yes' !== get_post_meta( $product_id, '_override_tab_layout', true ) ) { return false; } $orig_prod_tabs = $this->get_product_tabs( $product_id ); if ( ! $orig_prod_tabs ) { return false; } $tabs_section = new WPML_Editor_UI_Field_Section( __( 'Product tabs', 'woocommerce-multilingual' ) ); $keys = array_keys( $orig_prod_tabs ); $last_key = end( $keys ); $divider = true; foreach ( $orig_prod_tabs as $key => $prod_tab ) { if ( $key === $last_key ) { $divider = false; } if ( in_array( $prod_tab['type'], array( 'product', 'core' ) ) ) { if ( 'core' === $prod_tab['type'] ) { $group = new WPML_Editor_UI_Field_Group( $prod_tab['title'], $divider ); $tab_field = new WPML_Editor_UI_Single_Line_Field( 'coretab_' . $prod_tab['id'].'_title', __( 'Title', 'woocommerce-multilingual' ), $data, false ); $group->add_field( $tab_field ); $tab_field = new WPML_Editor_UI_Single_Line_Field( 'coretab_' . $prod_tab['id'].'_heading' , __( 'Heading', 'woocommerce-multilingual' ), $data, false ); $group->add_field( $tab_field ); $tabs_section->add_field( $group ); } else { $group = new WPML_Editor_UI_Field_Group( ucfirst( str_replace( '-', ' ', $prod_tab['name'] ) ), $divider ); $tab_field = new WPML_Editor_UI_Single_Line_Field( 'tab_'.$prod_tab['position'].'_title', __( 'Title', 'woocommerce-multilingual' ), $data, false ); $group->add_field( $tab_field ); $tab_field = new WCML_Editor_UI_WYSIWYG_Field( 'tab_'.$prod_tab['position'].'_heading' , null, $data, false ); $group->add_field( $tab_field ); $tabs_section->add_field( $group ); } } } $obj->add_field( $tabs_section ); return true; } /** * @param $data * @param $product_id * @param $translation * @param $lang * * @return mixed */ function custom_box_html_data( $data, $product_id, $translation, $lang ) { $orig_prod_tabs = $this->get_product_tabs( $product_id ); if ( empty( $orig_prod_tabs ) ) { return $data; } foreach ( $orig_prod_tabs as $key => $prod_tab ) { if ( in_array( $prod_tab['type'], array( 'product', 'core' ) ) ) { if ( 'core' === $prod_tab['type'] ) { $data[ 'coretab_' . $prod_tab['id'] . '_title' ] = array( 'original' => $prod_tab['title'] ); $data[ 'coretab_' . $prod_tab['id'] . '_heading' ] = array( 'original' => isset( $prod_tab['heading'] ) ? $prod_tab['heading'] : '' ); } else { $data[ 'tab_' . $prod_tab['position'] . '_title' ] = array( 'original' => get_the_title( $prod_tab['id'] ) ); $data[ 'tab_' . $prod_tab['position'] . '_heading' ] = array( 'original' => get_post( $prod_tab['id'] )->post_content ); } } } if ( $translation ) { $tr_prod_tabs = $this->get_product_tabs( $translation->ID ); if ( ! is_array( $tr_prod_tabs ) ) { return $data; // __('Please update original product','woocommerce-multilingual'); } foreach ( $tr_prod_tabs as $key => $prod_tab ) { if ( in_array( $prod_tab['type'], array( 'product', 'core' ) ) ) { if ( 'core' === $prod_tab['type'] ) { $data[ 'coretab_' . $prod_tab['id'] . '_title' ]['translation'] = $prod_tab['title']; $data[ 'coretab_' . $prod_tab['id'] . '_heading' ]['translation'] = isset( $prod_tab['heading'] ) ? $prod_tab['heading'] : ''; } else { $data[ 'tab_'.$prod_tab['position'].'_title' ]['translation'] = get_the_title( $prod_tab['id'] ); $data[ 'tab_'.$prod_tab['position'].'_heading' ]['translation'] = get_post( $prod_tab['id'] )->post_content; } } } } else { $current_language = $this->sitepress->get_current_language(); foreach ( $orig_prod_tabs as $key => $prod_tab ) { if ( 'core' === $prod_tab['type'] ) { unload_textdomain( 'woocommerce' ); $this->sitepress->switch_lang( $lang ); $this->woocommerce->load_plugin_textdomain(); $title = __( $prod_tab['title'], 'woocommerce' ); if ( $prod_tab['title'] !== $title ) { $data[ 'coretab_' . $prod_tab['id'] . '_title' ]['translation'] = $title; } if ( ! isset( $prod_tab['heading'] ) ) { $data[ 'coretab_'.$prod_tab['id'].'_heading' ]['translation'] = ''; } else { $heading = __( $prod_tab['heading'], 'woocommerce' ); if ( $prod_tab['heading'] !== $heading ) { $data[ 'coretab_' . $prod_tab['id'] . '_heading' ]['translation'] = $heading; } } unload_textdomain( 'woocommerce' ); $this->sitepress->switch_lang( $current_language ); $this->woocommerce->load_plugin_textdomain(); } } } return $data; } /** * @param $new_id * @param $original_post */ function duplicate_product_tabs( $new_id, $original_post ) { if ( function_exists( 'wc_tab_manager_duplicate_product' ) ) { wc_tab_manager_duplicate_product( $new_id, $original_post ); } } /** * @param $post_id * @param $post */ function force_set_language_information_on_product_tabs( $post_id, $post ) { if ( 'wc_product_tab' === $post->post_type ) { $language = $this->sitepress->get_language_for_element( $post_id, 'post_wc_product_tab' ); if ( empty( $language ) && $post->post_parent ) { $parent_language = $this->sitepress->get_language_for_element( $post->post_parent, 'post_product' ); if ( $parent_language ) { $this->sitepress->set_element_language_details( $post_id, 'post_wc_product_tab', null, $parent_language ); } } } } /** * @param $package * @param $post * * @return mixed */ function append_custom_tabs_to_translation_package( $package, $post ) { if ( 'product' === $post->post_type ) { $override_tab_layout = get_post_meta( $post->ID , '_override_tab_layout', true ); if ( 'yes' === $override_tab_layout ) { $meta = (array) get_post_meta( $post->ID, '_product_tabs', true ); foreach ( $meta as $key => $value ) { if ( preg_match( '/product_tab_([0-9]+)/', $key, $matches ) ) { $wc_product_tab_id = $matches[1]; $wc_product_tab = get_post( $wc_product_tab_id ); $package['contents'][ 'product_tabs:product_tab:' . $wc_product_tab_id . ':title' ] = array( 'translate' => 1, 'data' => $this->tp->encode_field_data( $wc_product_tab->post_title, 'base64' ), 'format' => 'base64', ); $package['contents'][ 'product_tabs:product_tab:' . $wc_product_tab_id . ':description' ] = array( 'translate' => 1, 'data' => $this->tp->encode_field_data( $wc_product_tab->post_content, 'base64' ), 'format' => 'base64', ); } elseif ( preg_match( '/^core_tab_(.+)$/', $key, $matches ) ) { $package['contents'][ 'product_tabs:core_tab_title:' . $matches[1] ] = array( 'translate' => 1, 'data' => $this->tp->encode_field_data( $value['title'], 'base64' ), 'format' => 'base64', ); if ( isset( $value['heading'] ) ) { $package['contents'][ 'product_tabs:core_tab_heading:' . $matches[1] ] = array( 'translate' => 1, 'data' => $this->tp->encode_field_data( $value['heading'], 'base64' ), 'format' => 'base64', ); } } } } } return $package; } /** * @param $post_id * @param $data * @param $job */ function save_custom_tabs_translation( $post_id, $data, $job ) { $translated_product_tabs_updated = false; $original_product_tabs = get_post_meta( $job->original_doc_id, '_product_tabs', true ); if ( $original_product_tabs ) { // custom tabs $product_tab_translations = array(); foreach ( $data as $value ) { if ( preg_match( '/product_tabs:product_tab:([0-9]+):(.+)/', $value['field_type'], $matches ) ) { $wc_product_tab_id = $matches[1]; $field = $matches[2]; $product_tab_translations[ $wc_product_tab_id ][ $field ] = $value['data']; } } if ( $product_tab_translations ) { $translated_product_tabs = get_post_meta( $post_id, '_product_tabs', true ); foreach ( $product_tab_translations as $wc_product_tab_id => $value ) { $new_wc_product_tab = array( 'post_type' => 'wp_product_tab', 'post_title' => $value['title'], 'post_content' => $value['description'], 'post_status' => 'publish', ); $wc_product_tab_id_translated = wp_insert_post( $new_wc_product_tab ); if ( $wc_product_tab_id_translated ) { $wc_product_tab_trid = $this->sitepress->get_element_trid( $wc_product_tab_id, 'post_wc_product_tab' ); $this->sitepress->set_element_language_details( $wc_product_tab_id_translated, 'post_wc_product_tab', $wc_product_tab_trid, $job->language_code ); $wc_product_tab_translated = get_post( $wc_product_tab_id_translated ); $translated_product_tabs[ 'product_tab_' . $wc_product_tab_id_translated ] = array( 'position' => $original_product_tabs[ 'product_tab_' . $wc_product_tab_id ]['position'], 'type' => 'product', 'id' => $wc_product_tab_id_translated, 'name' => $wc_product_tab_translated->post_name, ); } } $translated_product_tabs_updated = true; } // the other tabs $product_tab_translations = array(); foreach ( $data as $value ) { if ( preg_match( '/product_tabs:core_tab_(.+):(.+)/', $value['field_type'], $matches ) ) { $tab_field = $matches[1]; $tab_id = $matches[2]; $product_tab_translations[ $tab_id ][ $tab_field ] = $value['data']; } } if ( $product_tab_translations ) { foreach ( $product_tab_translations as $id => $tab ) { $translated_product_tabs[ 'core_tab_' . $id ] = array( 'type' => 'core', 'position' => $original_product_tabs[ 'core_tab_' . $id ]['position'], 'id' => $id, 'title' => $tab['title'], ); if ( isset( $tab['heading'] ) ) { $translated_product_tabs[ 'core_tab_' . $id ]['heading'] = $tab['heading']; } } $translated_product_tabs_updated = true; } if ( true === $translated_product_tabs_updated && isset( $translated_product_tabs ) ) { update_post_meta( $post_id, '_product_tabs', $translated_product_tabs ); } } } /** * @param $product_id * * @return array */ public function get_product_tabs( $product_id ) { $override_tab_layout = get_post_meta( $product_id, '_override_tab_layout', true ); if ( 'yes' == $override_tab_layout ) { // product defines its own tab layout? $product_tabs = (array) get_post_meta( $product_id, '_product_tabs', true ); } else { // otherwise, get the default layout if any $product_tabs = (array) get_option( 'wc_tab_manager_default_layout', false ); } return $product_tabs; } public function sync_product_tabs( $post_id, $post ){ $override_tab_layout = get_post_meta( $post_id, '_override_tab_layout', true ); if ( $override_tab_layout && $this->woocommerce_wpml->products->is_original_product( $post_id ) ){ $original_product_tabs = $this->get_product_tabs( $post_id ); $trid = $this->sitepress->get_element_trid( $post_id, 'post_' . $post->post_type ); $translations = $this->sitepress->get_element_translations( $trid, 'post_' . $post->post_type, true ); foreach( $translations as $language => $translation ){ if( empty( $translation->original ) ){ $translated_product_tabs = $this->get_product_tabs( $translation->element_id ); // sync tab positions for product tabs foreach( $original_product_tabs as $tab ){ if( $tab['type'] == 'product' ){ $translated_tab_product_id = apply_filters( 'translate_object_id', $tab['id'], 'wc_product_tab', false, $language ); if( $translated_tab_product_id && is_array( $translated_product_tabs['product_tab_' . $translated_tab_product_id ] ) ){ $translated_product_tabs['product_tab_' . $translated_tab_product_id ]['position'] = $tab['position']; } } } // sync translated core tabs with original tabs foreach( $translated_product_tabs as $tab_key => $tab ){ if( $tab['type'] === 'core' && !isset( $original_product_tabs[$tab_key] ) ){ unset( $translated_product_tabs[$tab_key] ); } } update_post_meta( $translation->element_id, '_product_tabs', $translated_product_tabs ); } } } } /** * @param $tab_id * * @return mixed|void */ function wc_tab_manager_tab_id( $tab_id ) { return apply_filters( 'wpml_object_id', $tab_id, 'wc_product_tab', true ); } public function filter_default_layout( $default_tabs ){ if( is_array( $default_tabs ) ){ foreach( $default_tabs as $tab_key => $default_tab ){ if( substr( $tab_key, 0, 10 ) == 'global_tab' ){ $trnsl_tab_id = apply_filters( 'translate_object_id', $default_tab[ 'id' ], 'wc_product_tab', true, $this->sitepress->get_current_language() ); if( $trnsl_tab_id != $default_tab[ 'id' ] ){ $default_tabs[ 'global_tab_'.$trnsl_tab_id ] = $default_tab; $default_tabs[ 'global_tab_'.$trnsl_tab_id ][ 'id' ] = $trnsl_tab_id; $default_tabs[ 'global_tab_'.$trnsl_tab_id ][ 'name' ] = get_post( $trnsl_tab_id )->post_name; unset( $default_tabs[ $tab_key ] ); } } } } return $default_tabs; } public function show_pointer_info(){ $pointer_ui = new WCML_Pointer_UI( sprintf( __( 'You can translate your custom product tabs on the %sWooCommerce product translation page%s', 'woocommerce-multilingual' ), '', '' ), 'https://wpml.org/documentation/woocommerce-extensions-compatibility/translating-woocommerce-tab-manager-woocommerce-multilingual/', 'woocommerce_product_tabs>p' ); $pointer_ui->show(); } function replace_tm_editor_custom_fields_with_own_sections( $fields ){ $fields[] = '_product_tabs'; return $fields; } function duplicate_categories_exception( $fields ) { $fields[] = '_wc_tab_categories'; return $fields; } function translate_categories( $post_id_from, $post_id_to, $meta_key ) { if ( '_wc_tab_categories' === $meta_key ) { // Saving has already been processed, remove nonce so that we dont // process translations too (which would overwrite _wc_tab_categories. unset( $_POST['wc_tab_manager_metabox_nonce'] ); $args = array('element_id' => $post_id_to, 'element_type' => 'wc_product_tab' ); $language = apply_filters( 'wpml_element_language_code', false, $args ); $categories = array(); $meta_value = get_post_meta( $post_id_from, $meta_key, true ); foreach ( $meta_value as $category ) { $categories[] = apply_filters( 'wpml_object_id', $category, 'product_cat', true, $language ); } update_post_meta( $post_id_to, $meta_key, $categories, $meta_value ); } } }