data_store->get_post_types( 'display' ); foreach ( $translated_order_types as $translated_order_type ) { add_filter( 'woocommerce_' . $translated_order_type . '_list_table_columns', array( PLLWC()->admin_orders, 'add_order_column' ), 100 ); add_action( 'woocommerce_' . $translated_order_type . '_list_table_custom_column', array( PLLWC()->admin_orders, 'order_column' ), 10, 2 ); } } /** * Displays the Languages metabox in HPOS context. * * @since 1.9 * * @param WC_Order $order Order object. * @return void */ public function order_language( $order ) { $this->display_language_metabox( $order->get_id() ); } /** * Returns a list of allowed screens. * * @since 1.9 * * @return string[] */ protected function get_allowed_screens() { return array_map( 'wc_get_page_screen_id', parent::get_allowed_screens() ); } /** * Add pll_order_id parameter in the list of parameters of the admin ajax request. * * @since 1.9 * * @param array $params List of parameters to add to the admin ajax request. * @return array Modified list of parameters to add to the admin ajax request. */ public function set_pll_order_id( $params ) { if ( $this->is_allowed_screen() && isset( $_GET['id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification $params['pll_order_id'] = (int) $_GET['id']; // phpcs:ignore WordPress.Security.NonceVerification } return $params; } /** * Sets the current language in order screen when using HPOS. * * @since 1.9 * * @param PLL_Language|bool $current_language The current language already set. * @return PLL_Language|bool */ public function set_current_language( $current_language ) { if ( ! empty( $_GET['page'] ) && ! empty( $_GET['id'] ) && is_numeric( $_GET['id'] ) && 'admin.php' === $GLOBALS['pagenow'] && 'wc-orders' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification // Case for the order checkout link. $lang = PLL()->model->post->get_language( (int) $_GET['id'] ); // phpcs:ignore WordPress.Security.NonceVerification } elseif ( wp_doing_ajax() && ! empty( $_GET['pll_order_id'] ) && is_numeric( $_GET['pll_order_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification // Case for filtering products search by the order language. $lang = PLL()->model->post->get_language( (int) $_GET['pll_order_id'] ); // phpcs:ignore WordPress.Security.NonceVerification } return empty( $lang ) ? $current_language : $lang; } /** * Saves order language from admin when HPOS is enabled and order custom tables authoritative. * * @since 1.9 * * @param WC_Order $order Order object being saved. * @return void */ public function save_order_language( $order ) { if ( ! isset( $_GET['id'], $_GET['page'], $_GET['action'], $_POST['post_lang_choice'], $_POST['_pll_nonce'] ) ) { return; } if ( ! $this->is_allowed_screen() || 'edit' !== $_GET['action'] ) { return; } check_admin_referer( 'pll_language', '_pll_nonce' ); $new_lang = PLL()->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) ); $order_lang = $this->data_store->get_language( $order->get_id() ); if ( empty( $new_lang ) || ( ! empty( $order_lang ) && $new_lang->slug === $order_lang ) ) { return; } $this->data_store->set_language( $order->get_id(), $new_lang->slug ); /* * Due to how WooCommerce saves the order in a POST request without redirecting. * Updating the current language with the new language is required * as it's initialized with the language before the update. */ PLL()->curlang = $new_lang; } /** * Enqueues order edit page script. * * @since 1.9 * * @return void */ public function enqueue_order_script() { if ( ! $this->is_allowed_screen() ) { return; } wp_dequeue_script( 'pll_classic-editor' ); $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_script( 'pllwc_order', plugins_url( '/js/build/order' . $suffix . '.js', PLLWC_FILE ), array(), PLLWC_VERSION, true ); } }