- Статус
- Решено
- Решено в
- WPML Multilingual & Multicurrency for WooCommerce 5.5.4
- Теги темы
- WCML
Обзор проблемы
REST-запрос к конечной точке orders для получения подробностей заказа может привести к неожиданным результатам, если заказ был оформлен на дополнительном языке или при указании параметра ‘lang’, и заказ содержит вариативные товары.
product_id родительского товара может быть переведен, а variation_id заказанной вариации — нет, при этом названием товара будет название родительского товара, а не вариации.
Обходное решение
Мы выявили основную причину и предоставим исправление в предстоящем релизе. В качестве временного решения проблему можно устранить, отредактировав файл плагина plugins/woocommerce-multilingual/classes/Rest/Wrapper/Orders/Languages.php и заменив всю функцию «prepare» (примерно со строки 42) на
public function prepare( $response, $object, $request ) {
$language = get_query_var( 'lang' ) ?: $request->get_param( 'lang' );
$orderLanguage = WCML_Orders::getLanguage( $this->get_id( $object ) );
if ( $orderLanguage !== $language ) {
$lineItems = Obj::propOr( [], 'line_items', $response->data );
foreach ( $lineItems as $k => $item ) {
$translatedProductId = wpml_object_id_filter( $item['product_id'], 'product', false, $language );
$translatedVariationId = ( $item['variation_id'] == 0 ) ? 0 : wpml_object_id_filter( $item['variation_id'], 'product_variation', false, $language );
if ( $translatedProductId ) {
$response->data['line_items'][ $k ]['product_id'] = $translatedProductId;
$translatedProduct = get_post( $translatedProductId );
$postName = $translatedProduct->post_title;
if ( $translatedVariationId ) {
$response->data['line_items'][ $k ]['variation_id'] = $translatedVariationId;
$translatedVariation = get_post( $translatedVariationId );
$postName = $translatedVariation->post_title;
}
$response->data['line_items'][ $k ]['name'] = $postName;
}
}
}
return $response;
}