- Status
- Gelöst
- Gelöst in
- WPML Multilingual & Multicurrency for WooCommerce 5.5.4
- Themen-Tags
- WCML
Übersicht über das Problem
Eine REST-Anfrage an den Orders-Endpunkt, um Details einer Bestellung abzurufen, kann zu unerwarteten Ergebnissen führen, wenn die Bestellung in einer Sekundärsprache getätigt wurde oder wenn ein ‘lang’-Parameter angegeben wird und die Bestellung variable Produkte enthält.
Die product_id des übergeordneten Produkts wird möglicherweise übersetzt, die variation_id der bestellten Variante jedoch nicht, und der Name des Produkts entspricht dem des übergeordneten Produkts und nicht dem der Variante.
Problemumgehung
Wir haben die zugrunde liegende Ursache identifiziert und werden in einer kommenden Version eine Fehlerbehebung bereitstellen. In der Zwischenzeit kann das Problem behoben werden, indem Sie die Plugin-Datei plugins/woocommerce-multilingual/classes/Rest/Wrapper/Orders/Languages.php bearbeiten und die gesamte Funktion „prepare“ (ab etwa Zeile 42) durch
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;
} ersetzen.