FOX - Currency Switcher for WooCommerce

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);