Filtrer le nombre de commandes par pays

Ce petit bout de code va nous permettre de pouvoir avoir une vision rapide en fonction d’une plage de date de nous faire afficher le nombre de commandes effectuées sur notre site en fonction des pays de nos clients.

				
					/************************************************************************************/
/* Statistiques des commandes par pays - CUSTOM FUNCTION WYCAN */
/************************************************************************************/
// Ajout du sous-menu dans le menu de WooCommerce
add_action('admin_menu', 'custom_order_stats_submenu');

function custom_order_stats_submenu(){
    add_submenu_page('woocommerce', 'Stats par pays', 'Stats par pays', 'manage_options', 'custom-order-stats', 'custom_order_stats_page');
}

function custom_order_stats_page(){
    ?>
    <div class="wrap">
        <h2>Statistiques de commande par pays</h2>
        
        <form method="post" action="">
            <label for="start_date">Date de début: </label>
            <input type="date" name="start_date" required>
            
            <label for="end_date">Date de fin: </label>
            <input type="date" name="end_date" required>
            
            <input type="submit" value="Obtenir les statistiques">
        </form>
        
        <?php
        if(isset($_POST['start_date']) && isset($_POST['end_date'])){
            display_order_stats($_POST['start_date'], $_POST['end_date']);
        }
        ?>
    </div>
    <?php
}

function display_order_stats($start_date, $end_date){
    global $wpdb;

    $sql = $wpdb->prepare("
        SELECT pm.meta_value AS country_code, COUNT(p.ID) AS order_count 
        FROM {$wpdb->posts} p 
        JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id 
        WHERE p.post_type = 'shop_order' 
        AND p.post_date BETWEEN %s AND %s 
        AND pm.meta_key = '_billing_country' 
        GROUP BY pm.meta_value
        ORDER BY order_count DESC", $start_date, $end_date);
    
    $results = $wpdb->get_results($sql);
    $countries = WC()->countries->countries;

    if($results){
        echo '<table border="1">';
        echo '<tr><th>Pays</th><th>Nombre de commandes</th></tr>';
        foreach($results as $row){
            $country_name = isset($countries[$row->country_code]) ? $countries[$row->country_code] : $row->country_code; // Si le code du pays n'est pas reconnu, affichez le code.
            echo '<tr><td>' . $country_name . '</td><td>' . $row->order_count . '</td></tr>';
        }
        echo '</table>';
    }else{
        echo '<p>Aucune commande trouvée pour cette période.</p>';
    }
}

				
			

On peut également afficher une troisième colonne qui va nous afficher le montant total des commandes pour ce pays et nous allons demander aussi de filtrer en fonction d’un état de commande.

				
					/************************************************************************************/
/* Statistiques des commandes par pays - CUSTOM FUNCTION WYCAN */
/************************************************************************************/
// Ajout du sous-menu dans le menu de WooCommerce
add_action('admin_menu', 'custom_order_stats_submenu');

function custom_order_stats_submenu(){
    add_submenu_page('woocommerce', 'Stats par pays', 'Stats par pays', 'manage_options', 'custom-order-stats', 'custom_order_stats_page');
}

function custom_order_stats_page(){
    $order_statuses = wc_get_order_statuses();
    $selected_status = isset($_POST['order_status']) ? $_POST['order_status'] : '';

    ?>
    <div class="wrap">
        <h2>Statistiques de commande par pays</h2>
        
        <form method="post" action="">
            <label for="start_date">Date de début: </label>
            <input type="date" name="start_date" required>
            
            <label for="end_date">Date de fin: </label>
            <input type="date" name="end_date" required>

            <label for="order_status">État de commande: </label>
            <select name="order_status">
                <option value="all" <?= $selected_status === 'all' ? 'selected' : ''; ?>>Toutes</option>
                <?php
                foreach($order_statuses as $status => $name){
                    echo '<option value="' . esc_attr($status) . '"' . selected($selected_status, $status, false) . '>' . esc_html($name) . '</option>';
                }
                ?>
            </select>
            
            <input type="submit" value="Obtenir les statistiques">
        </form>
        
        <?php
        if(isset($_POST['start_date']) && isset($_POST['end_date'])){
            display_order_stats($_POST['start_date'], $_POST['end_date'], $_POST['order_status']);
        }
        ?>
    </div>
    <?php
}

function display_order_stats($start_date, $end_date, $order_status){
    global $wpdb;

    $status_condition = '';
    if($order_status !== 'all') {
        $status_condition = $wpdb->prepare(" AND p.post_status = %s ", $order_status);
    }

    $sql = $wpdb->prepare("
        SELECT pm.meta_value AS country_code, 
               COUNT(p.ID) AS order_count,
               SUM(meta_total.meta_value) AS total_amount
        FROM {$wpdb->posts} p 
        JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id 
        LEFT JOIN {$wpdb->postmeta} meta_total ON p.ID = meta_total.post_id AND meta_total.meta_key = '_order_total'
        WHERE p.post_type = 'shop_order' 
        AND p.post_date BETWEEN %s AND %s " . 
        $status_condition . "
        AND pm.meta_key = '_billing_country' 
        GROUP BY pm.meta_value
        ORDER BY order_count DESC", $start_date, $end_date);
    
    $results = $wpdb->get_results($sql);
    $countries = WC()->countries->countries;

    if($results){
        echo '<table border="1">';
        echo '<tr><th>Pays</th><th>Nombre de commandes</th><th>Montant total</th></tr>';
        foreach($results as $row){
            $country_name = isset($countries[$row->country_code]) ? $countries[$row->country_code] : $row->country_code;
            echo '<tr><td>' . $country_name . '</td><td>' . $row->order_count . '</td><td>' . wc_price($row->total_amount) . '</td></tr>';
        }
        echo '</table>';
    } else {
        echo '<p>Aucune commande trouvée pour cette période et cet état de commande.</p>';
    }
}
				
			
Envie de laisser un commentaire ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Tu veux voir d'autres bouts de code ?

WooCommerce Product Buyers List

Ajoute un onglet dans WooCommerce pour afficher les acheteurs d'un produit spécifique avec filtre de date.

Emails additionnels par produits WooCommerce

Ajoute un onglet personnalisé dans les produits WooCommerce pour écrire un e-mail spécifique à chaque produit. Celui-ci sera envoyé dans un e-mail dédié.

Créer une galerie personnalisée avec Elementor

Avec ce code vous allez pouvoir créer une galerie personnalisée avec Elementor

Afficher le poids total des produits dans le panier et commande

Ce code va nous permettre d'afficher le poids total des produits dans la page panier et commande de WooCommerce

ID de CSS personnalisé pour Elementor nested tabs

Ce script nous permettra d'exécuter une URL directement vers un onglet Elementor

Statistiques des commandes WooCommerce par pays

Ce plugin vous permet d'afficher rapidement les volumes de vente en fonction des pays.
ON DISCUTE ?

Une question sur WordPress ?
Un projet web à faire sous traiter par un freelance ?
Je suis votre homme !