Comment adapter les rapports WooCommerce pour une boutique multi-devises
Une boutique multi-devise perturbe silencieusement les rapports WooCommerce : les totaux dans différentes devises sont additionnés comme s'il s'agissait du même nombre.
WooCommerce Currency Switcher ne peut pas fonctionner par défaut avec les rapports WooCommerce car il n'y a pas de hooks là-bas, et il n'est pas possible de s'y brancher. Mais après quelques investigations du code WooCommerce, j'ai trouvé une façon d'adapter les rapports pour les commandes avec différentes devises (fonctionne uniquement pour Rapports->Commandes->« Ventes par date ») :- ouvrez le fichier wp-content\plugins\woocommerce\includes\admin\reports\class-wc-admin-report.php
- trouvez-y la fonction publique get_order_report_data
- à la même fin de la fonction, avant le code return $result;, insérez le code :
$result = apply_filters('woocs_reports_get_order_report_query', $result, $args); - ouvrez le fichier functions.php de votre thème WP actuel et à la fin du même fichier, insérez le code suivant :
add_filter('woocs_reports_get_order_report_query', function($result, $args) { if (is_array($result) AND isset($result[0]->total_sales)) { global $wpdb; global $WOOCS; $range = '7day'; if (isset($_GET['range'])) { $range = $_GET['range']; } $start_date = ''; $end_date = date('Y-m-d 23:59:59'); switch ($range) { case 'custom': $start_date = $_GET['start_date']; break; case '7day': $start_date = date('Y-m-d 00:00:00', time() - 7 * DAY_IN_SECONDS); break; case 'month': $start_date = date('Y-m-01 00:00:00'); break; case 'year': $start_date = date('Y-01-01 00:00:00'); break; default: $start_date = date('Y-m-d 00:00:00', time() - 7 * DAY_IN_SECONDS); break; } $order_status = "wc-" . implode('","wc-', $args['order_status']); //*** $sql = $wpdb->prepare('SELECT ID FROM ' . $wpdb->posts . ' WHERE post_type=%s AND post_status IN("' . $order_status . '") AND post_date >= %s AND post_date < %s', 'shop_order', $start_date, $end_date); $tmp = $wpdb->get_results($sql, ARRAY_N); $orders = array(); $result = array(); if (!empty($tmp)) { foreach ($tmp as $v) { $orders[] = $v[0]; } $result = array(); $currencies = $WOOCS->get_currencies(); foreach ($orders as $order_id) { $tmp = array(); $order = new WC_Order($order_id); $_order_currency = get_post_meta($order_id, '_order_currency', true); $order_rate = get_post_meta($order_id, '_woocs_order_rate', true); if (!$order_rate) { if (isset($currencies[$_order_currency])) { $order_rate = $currencies[$_order_currency]['rate']; } else { continue; } } if ($_order_currency != $WOOCS->default_currency) { $tmp['total_sales'] = $WOOCS->back_convert(get_post_meta($order_id, '_order_total', true), $order_rate, 4); $tmp['total_shipping'] = $WOOCS->back_convert(get_post_meta($order_id, '_order_shipping', true), $order_rate, 4); $tmp['total_tax'] = $WOOCS->back_convert(get_post_meta($order_id, '_order_tax', true), $order_rate, 4); $tmp['total_shipping_tax'] = $WOOCS->back_convert(get_post_meta($order_id, '_order_shipping_tax', true), $order_rate, 4); } else { $tmp['total_sales'] = get_post_meta($order_id, '_order_total', true); $tmp['total_shipping'] = get_post_meta($order_id, '_order_shipping', true); $tmp['total_tax'] = get_post_meta($order_id, '_order_tax', true); $tmp['total_shipping_tax'] = get_post_meta($order_id, '_order_shipping_tax', true); } $tmp['post_date'] = $order->order_date; $result[] = (object) $tmp; } } } return $result; }, 10, 2);