%PDF- %PDF-
Direktori : /var/www/html/itworks/wp-content/plugins/woocommerce-multilingual/inc/ |
Current File : //var/www/html/itworks/wp-content/plugins/woocommerce-multilingual/inc/class-wcml-orders.php |
<?php class WCML_Orders { private $woocommerce_wpml; private $sitepress; private $standard_order_notes = array( 'Order status changed from %s to %s.', 'Order item stock reduced successfully.', 'Item #%s stock reduced from %s to %s.', 'Item #%s stock increased from %s to %s.', 'Awaiting BACS payment','Awaiting cheque payment', 'Payment to be made upon delivery.', 'Validation error: PayPal amounts do not match (gross %s).', 'Validation error: PayPal IPN response from a different email address (%s).', 'Payment pending: %s', 'Payment %s via IPN.', 'Validation error: PayPal amounts do not match (amt %s).', 'IPN payment completed','PDT payment completed' ); public function __construct( &$woocommerce_wpml, &$sitepress ){ $this->woocommerce_wpml = $woocommerce_wpml; $this->sitepress = $sitepress; add_action('init', array($this, 'init')); //checkout page add_action( 'wp_ajax_woocommerce_checkout',array($this,'switch_to_current'),9); add_action( 'wp_ajax_nopriv_woocommerce_checkout',array($this,'switch_to_current'),9); add_action( 'wp_ajax_wcml_order_delete_items', array( $this, 'order_delete_items' ) ); } function init(){ add_action('woocommerce_checkout_update_order_meta', array($this, 'set_order_language')); add_filter('icl_lang_sel_copy_parameters', array($this, 'append_query_parameters')); add_filter('the_comments', array($this, 'get_filtered_comments')); if ( $this->should_attach_new_order_note_data_filter() ) { add_filter( 'gettext', array( $this, 'filtered_woocommerce_new_order_note_data' ), 10, 3 ); } add_filter( 'woocommerce_order_get_items', array( $this, 'woocommerce_order_get_items' ), 10, 2 ); add_action( 'woocommerce_process_shop_order_meta', array( $this, 'set_order_language_backend'), 10, 2 ); add_action( 'woocommerce_order_actions_start', array( $this, 'order_language_dropdown' ), 11 ); //after order currency drop-down //special case for wcml-741 add_action('updated_post_meta', array($this,'update_order_currency'), 100,4); add_action( 'woocommerce_before_order_itemmeta', array( $this, 'backend_before_order_itemmeta' ), 100, 3 ); add_action( 'woocommerce_after_order_itemmeta', array( $this, 'backend_after_order_itemmeta' ), 100, 3 ); add_filter( 'woocommerce_get_item_downloads', array( $this, 'filter_downloadable_product_items' ), 10, 3 ); add_filter( 'woocommerce_customer_get_downloadable_products', array( $this, 'filter_customer_get_downloadable_products' ), 10, 3 ); } public function should_attach_new_order_note_data_filter() { $admin_language = $this->sitepress->get_user_admin_language( get_current_user_id(), true ); $all_strings_in_english = get_option( 'wpml-st-all-strings-are-in-english' ); return 'en' !== $admin_language || ! $all_strings_in_english; } function filtered_woocommerce_new_order_note_data($translations, $text, $domain ){ if(in_array($text,$this->standard_order_notes)){ $language = $this->woocommerce_wpml->strings->get_string_language( $text, 'woocommerce' ); if( $this->sitepress->get_user_admin_language( get_current_user_id(), true ) != $language ){ $string_id = icl_get_string_id( $text, 'woocommerce'); $strings = icl_get_string_translations_by_id( $string_id ); if($strings){ $translations = $strings[ $this->sitepress->get_user_admin_language( get_current_user_id(), true ) ]['value']; } }else{ return $text; } } return $translations; } function get_filtered_comments( $comments ){ $user_id = get_current_user_id(); if ( $user_id ) { $user_language = get_user_meta( $user_id, 'icl_admin_language', true ); foreach ( $comments as $key => $comment ) { $comment_string_id = icl_get_string_id( $comment->comment_content, 'woocommerce' ); if ( $comment_string_id ) { $comment_strings = icl_get_string_translations_by_id( $comment_string_id ); if ( $comment_strings && isset( $comment_strings[ $user_language ] ) ) { $comments[ $key ]->comment_content = $comment_strings[ $user_language ][ 'value' ]; } } } } return $comments; } function woocommerce_order_get_items( $items, $order ){ if ( $this->is_order_saving_action() ) { return $items; } if( isset( $_GET[ 'post' ] ) && get_post_type( $_GET[ 'post' ] ) == 'shop_order' ) { // on order edit page use admin default language $language_to_filter = $this->sitepress->get_user_admin_language( get_current_user_id(), true ); }elseif( isset( $_GET[ 'action' ] ) && ( $_GET['action'] == 'woocommerce_mark_order_complete' || $_GET['action'] == 'woocommerce_mark_order_status' || $_GET['action'] == 'mark_processing') ){ //backward compatibility for WC < 2.7 $order_id = method_exists( 'WC_Order', 'get_id' ) ? $order->get_id() : $order->id; $order_language = get_post_meta( $order_id, 'wpml_language', true ); $language_to_filter = $order_language ? $order_language : $this->sitepress->get_default_language(); }else{ $language_to_filter = $this->sitepress->get_current_language(); } foreach( $items as $index => $item ){ if( is_array( $item ) ){ // WC < 2.7 foreach( $item as $key => $item_data ){ if( $key == 'product_id' ){ $tr_product_id = apply_filters( 'translate_object_id', $item_data, 'product', false, $language_to_filter ); if( !is_null( $tr_product_id ) ){ $items[ $index ][ $key ] = $tr_product_id; $items[ $index ][ 'name'] = get_post( $tr_product_id )->post_title; } } if( $key == 'variation_id' ){ $tr_variation_id = apply_filters( 'translate_object_id', $item_data, 'product_variation', false, $language_to_filter ); if( !is_null($tr_variation_id)){ $items[$index][$key] = $tr_variation_id; } } if (substr($key, 0, 3) == 'pa_') { //attr is taxonomy $term_id = $this->woocommerce_wpml->terms->wcml_get_term_id_by_slug( $key, $item_data ); $tr_id = apply_filters( 'translate_object_id', $term_id, $key, false, $language_to_filter ); if(!is_null($tr_id)){ $translated_term = $this->woocommerce_wpml->terms->wcml_get_term_by_id( $tr_id, $key); $items[$index][$key] = $translated_term->slug; } } if( $key == 'type' && $item_data == 'shipping' && isset( $item[ 'method_id' ] ) ){ $items[ $index ][ 'name' ] = $this->woocommerce_wpml->shipping->translate_shipping_method_title( $item[ 'name' ], $item[ 'method_id' ], $language_to_filter ); } } }else{ // WC >= 2.7 if( $item instanceof WC_Order_Item_Product ){ if( $item->get_type() == 'line_item' ){ $item_product_id = $item->get_product_id(); if( get_post_type( $item_product_id ) == 'product_variation' ){ $item_product_id = wp_get_post_parent_id( $item_product_id ); } $tr_product_id = apply_filters( 'translate_object_id', $item_product_id, 'product', false, $language_to_filter ); if( !is_null( $tr_product_id ) ){ $item->set_product_id( $tr_product_id ); $item->set_name( get_post( $tr_product_id )->post_title ); } $tr_variation_id = apply_filters( 'translate_object_id', $item->get_variation_id(), 'product_variation', false, $language_to_filter ); if ( ! is_null( $tr_variation_id ) ) { $item->set_variation_id( $tr_variation_id ); $item->set_name( wc_get_product( $tr_variation_id )->get_name() ); } } }elseif( $item instanceof WC_Order_Item_Shipping ){ if( $item->get_method_id() ){ $shipping_id = $item->get_method_id(); if( method_exists( $item ,'get_instance_id' ) ){ $shipping_id .= $item->get_instance_id(); } $item->set_method_title( $this->woocommerce_wpml->shipping->translate_shipping_method_title( $item->get_method_title(), $shipping_id, $language_to_filter ) ); } } } } return $items; } private function is_order_saving_action(){ return isset( $_POST['post_type'] ) && $_POST['post_type'] === 'shop_order' && isset( $_POST['wc_order_action'] ); } public function backend_before_order_itemmeta( $item_id, $item, $product ){ global $sitepress; if( $this->get_order_language_by_item_id( $item_id ) != $sitepress->get_user_admin_language( get_current_user_id(), true ) ){ foreach( $item[ 'item_meta' ] as $key => $item_meta ){ if ( taxonomy_exists( wc_attribute_taxonomy_name( $key ) ) || substr( $key, 0, 3 ) == 'pa_' ) { //backward compatibility for WC < 2.7 - in WC 2.7 $item_meta is a single attribute value not an array if( !is_array( $item_meta ) ){ $item_meta = array( $item_meta ); } foreach( $item_meta as $value ){ $this->force_update_itemmeta( $item_id, $key, $value, $sitepress->get_user_admin_language( get_current_user_id(), true ) ); } } } } } public function backend_after_order_itemmeta( $item_id, $item, $product ){ global $sitepress; $order_languge = $this->get_order_language_by_item_id( $item_id ); if( $order_languge != $sitepress->get_user_admin_language( get_current_user_id(), true ) ){ foreach( $item[ 'item_meta' ] as $key => $item_meta ){ if ( taxonomy_exists( wc_attribute_taxonomy_name( $key ) ) || substr( $key, 0, 3 ) == 'pa_' ) { //backward compatibility for WC < 2.7 - in WC 2.7 $item_meta is a single attribute value not an array if( !is_array( $item_meta ) ){ $item_meta = array( $item_meta ); } foreach( $item_meta as $value ){ $this->force_update_itemmeta( $item_id, $key, $value, $order_languge ); } } } } } public function get_order_language_by_item_id( $item_id ){ global $wpdb; $order_id = $wpdb->get_var( $wpdb->prepare( "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d", $item_id ) ); return get_post_meta( $order_id, 'wpml_language', true ); } //force update to display attribute in correct language on edit order page public function force_update_itemmeta( $item_id, $key, $value, $languge ){ global $wpdb, $woocommerce_wpml; $taxonomy = substr( $key, 0, 3 ) != 'pa_' ? wc_attribute_taxonomy_name( $key ) : $key; $term_id = $woocommerce_wpml->terms->wcml_get_term_id_by_slug( $taxonomy, $value ); $translated_term = $woocommerce_wpml->terms->wcml_get_translated_term( $term_id, $taxonomy, $languge ); if( $translated_term ){ $value = $translated_term->slug; $wpdb->update( $wpdb->prefix.'woocommerce_order_itemmeta', array( 'meta_value' => $value ), array( 'order_item_id' => $item_id, 'meta_key' => $key ) ); } } /** * Adds language to order post type. * * @param type $order_id */ function set_order_language( $order_id ) { if ( ! get_post_meta( $order_id, 'wpml_language' ) ) { update_post_meta( $order_id, 'wpml_language', ICL_LANGUAGE_CODE ); } } function append_query_parameters($parameters){ if(is_order_received_page() || is_checkout()){ if(!in_array('order', $parameters)) $parameters[] = 'order'; if(!in_array('key', $parameters)) $parameters[] = 'key'; } return $parameters; } function switch_to_current(){ $this->woocommerce_wpml->emails->change_email_language($this->sitepress->get_current_language()); } function order_language_dropdown( $order_id ){ if( !get_post_meta( $order_id, '_order_currency') ) { $languages = apply_filters( 'wpml_active_languages', array(), array( 'skip_missing' => 0, 'orderby' => 'code' ) ); $selected_lang = isset( $_COOKIE [ '_wcml_dashboard_order_language' ] ) ? $_COOKIE [ '_wcml_dashboard_order_language' ] : $this->sitepress->get_default_language(); ?> <li class="wide"> <label><?php _e('Order language:'); ?></label> <select id="dropdown_shop_order_language" name="wcml_shop_order_language"> <?php if (!empty($languages)): ?> <?php foreach ($languages as $l): ?> <option value="<?php echo $l['language_code'] ?>" <?php echo $selected_lang == $l['language_code'] ? 'selected="selected"' : ''; ?>><?php echo $l['translated_name']; ?></option> <?php endforeach; ?> <?php endif; ?> </select> </li> <?php $wcml_set_dashboard_order_language_nonce = wp_create_nonce( 'set_dashboard_order_language' ); wc_enqueue_js( " var order_lang_current_value = jQuery('#dropdown_shop_order_language option:selected').val(); jQuery('#dropdown_shop_order_language').on('change', function(){ if(confirm('" . esc_js(__("All the products will be removed from the current order in order to change the language", 'woocommerce-multilingual')). "')){ var lang = jQuery(this).val(); jQuery.ajax({ url: ajaxurl, type: 'post', dataType: 'json', data: {action: 'wcml_order_delete_items', order_id: woocommerce_admin_meta_boxes.post_id, lang: lang , wcml_nonce: '".$wcml_set_dashboard_order_language_nonce."' }, success: function( response ){ if(typeof response.error !== 'undefined'){ alert(response.error); }else{ window.location = window.location.href; } } }); }else{ jQuery(this).val( order_lang_current_value ); return false; } }); "); } } function order_delete_items(){ $nonce = filter_input( INPUT_POST, 'wcml_nonce', FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if(!$nonce || !wp_verify_nonce($nonce, 'set_dashboard_order_language')){ echo json_encode(array('error' => __('Invalid nonce', 'woocommerce-multilingual'))); die(); } $cookie_name = '_wcml_dashboard_order_language'; // @todo uncomment or delete when #wpmlcore-5796 is resolved //do_action( 'wpsc_add_cookie', $cookie_name ); setcookie( $cookie_name, filter_input( INPUT_POST, 'lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS ), time() + 86400, COOKIEPATH, COOKIE_DOMAIN ); } function set_order_language_backend( $post_id, $post ){ if( isset( $_POST['wcml_shop_order_language'] ) ){ update_post_meta( $post_id, 'wpml_language', filter_input( INPUT_POST, 'wcml_shop_order_language', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ); } } function update_order_currency( $meta_id, $object_id, $meta_key, $meta_value ){ if( $this->woocommerce_wpml->settings['enable_multi_currency'] == WCML_MULTI_CURRENCIES_INDEPENDENT && get_post_type($object_id) == 'shop_order' && isset( $_GET['wc-ajax'] ) && $_GET['wc-ajax'] == 'checkout' ){ update_post_meta( $object_id, '_order_currency', get_woocommerce_currency() ); } } public function filter_downloadable_product_items( $files, $item, $object ){ $order_language = get_post_meta( $object->get_id(), 'wpml_language', true ); if( $item->get_variation_id() > 0 ){ $item->set_variation_id( apply_filters( 'translate_object_id', $item->get_variation_id(), 'product_variation', false, $order_language ) ); }else{ $item->set_product_id( apply_filters( 'translate_object_id', $item->get_product_id(), 'product', false, $order_language ) ); } remove_filter( 'woocommerce_get_item_downloads', array( $this, 'filter_downloadable_product_items' ), 10, 3 ); $files = $item->get_item_downloads(); add_filter( 'woocommerce_get_item_downloads', array( $this, 'filter_downloadable_product_items' ), 10, 3 ); return $files; } public function filter_customer_get_downloadable_products( $downloads ){ foreach( $downloads as $key => $download ){ $translated_id = apply_filters( 'translate_object_id', $download['product_id'], get_post_type( $download['product_id'] ), false, $this->sitepress->get_current_language() ); if( $translated_id ){ $downloads[ $key ][ 'product_name' ] = get_the_title( $translated_id ); } } return $downloads; } }