- Statut
- Résolu
- Résolu dans
- WPML Multilingual & Multicurrency for WooCommerce 5.5.4
- Étiquettes de sujet
- WCML
Aperçu de l’anomalie
Une requête REST vers le point de terminaison des commandes pour récupérer les détails d’une commande peut donner des résultats inattendus lorsque la commande a été passée dans une langue secondaire, ou si un paramètre ‘lang’ est spécifié, et que la commande contient des produits variables.
Le product_id du produit parent peut être traduit mais le variation_id de la variante commandée peut ne pas l’être, et le nom du produit sera celui du parent et non celui de la variante.
Solution de contournement
Nous avons identifié la cause sous-jacente et fournirons un correctif dans une prochaine version publiée. En attendant, le problème peut être résolu en modifiant le fichier de l’extension plugins/woocommerce-multilingual/classes/Rest/Wrapper/Orders/Languages.php et en remplaçant l’ensemble de la fonction « prepare » (à partir de la ligne 42 environ) par
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;
}