문제 개요
주문이 보조 언어로 이루어졌거나 ‘lang’ 매개변수를 지정한 경우, 그리고 주문에 옵션 상품이 포함된 경우 주문 세부 정보를 검색하기 위한 orders 엔드포인트에 대한 REST 요청이 예상치 못한 결과를 반환할 수 있습니다.
상위 상품의 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;
}