/**
 * HISTORIQUE DES PRIX - CODE À AJOUTER DANS FUNCTIONS.PHP
 * Conformité réglementation française - Prix le plus bas 30 jours
 */

// Créer la table au premier chargement
add_action('after_setup_theme', 'create_price_history_table');
function create_price_history_table() {
    global $wpdb;
    
    $table_name = $wpdb->prefix . 'product_price_history';
    
    // Vérifier si la table existe déjà
    if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
        $charset_collate = $wpdb->get_charset_collate();
        
        $sql = "CREATE TABLE $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            product_id bigint(20) NOT NULL,
            variation_id bigint(20) DEFAULT 0,
            price decimal(10,2) NOT NULL,
            date_recorded datetime DEFAULT CURRENT_TIMESTAMP,
            source varchar(50) DEFAULT 'manual',
            PRIMARY KEY (id),
            KEY product_id (product_id),
            KEY date_recorded (date_recorded)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
        
        // Initialiser les produits existants
        init_existing_products_prices();
    }
}

// Initialiser les prix des produits existants
function init_existing_products_prices() {
    $products = wc_get_products(array(
        'limit' => -1,
        'status' => 'publish'
    ));
    
    foreach ($products as $product) {
        save_product_price_history($product->get_id(), true);
    }
}

// Sauvegarder l'historique lors des modifications de produit
add_action('woocommerce_update_product', 'save_product_price_history');
add_action('woocommerce_new_product', 'save_product_price_history');
add_action('save_post', 'save_price_on_post_update');

function save_price_on_post_update($post_id) {
    if (get_post_type($post_id) === 'product') {
        save_product_price_history($post_id);
    }
}

function save_product_price_history($product_id, $force_save = false) {
    global $wpdb;
    
    $product = wc_get_product($product_id);
    if (!$product) return;
    
    $current_price = $product->get_price();
    if (empty($current_price) || $current_price <= 0) return;
    
    $table_name = $wpdb->prefix . 'product_price_history';
    
    // Vérifier si le prix a changé (sauf si force_save)
    if (!$force_save) {
        $last_price = $wpdb->get_var($wpdb->prepare(
            "SELECT price FROM $table_name 
             WHERE product_id = %d AND variation_id = 0 
             ORDER BY date_recorded DESC LIMIT 1",
            $product_id
        ));
        
        if ($last_price && abs(floatval($last_price) - floatval($current_price)) < 0.01) {
            return; // Prix inchangé
        }
    }
    
    // Enregistrer le nouveau prix
    $wpdb->insert(
        $table_name,
        array(
            'product_id' => $product_id,
            'variation_id' => 0,
            'price' => $current_price,
            'source' => is_admin() ? 'admin' : 'frontend'
        ),
        array('%d', '%d', '%f', '%s')
    );
}

// Obtenir le prix le plus bas des 30 derniers jours
function get_lowest_price_30_days($product_id, $variation_id = 0) {
    global $wpdb;
    
    $table_name = $wpdb->prefix . 'product_price_history';
    $thirty_days_ago = date('Y-m-d H:i:s', strtotime('-30 days'));
    
    $result = $wpdb->get_row($wpdb->prepare(
        "SELECT MIN(price) as lowest_price, 
                COUNT(*) as record_count,
                MAX(date_recorded) as last_recorded
         FROM $table_name 
         WHERE product_id = %d 
         AND variation_id = %d 
         AND date_recorded >= %s 
         AND price > 0",
        $product_id,
        $variation_id,
        $thirty_days_ago
    ));
    
    return $result;
}

// Afficher le prix le plus bas sur la page produit
add_action('woocommerce_single_product_summary', 'display_lowest_price_notice', 25);
function display_lowest_price_notice() {
    global $product;
    
    if (!$product) return;
    
    $product_id = $product->get_id();
    $current_price = floatval($product->get_price());
    
    // Forcer l'enregistrement du prix actuel s'il n'existe pas
    $lowest_data = get_lowest_price_30_days($product_id);
    
    if (!$lowest_data || $lowest_data->record_count == 0) {
        // Pas de données, enregistrer le prix actuel
        save_product_price_history($product_id, true);
        
        echo '<div class="price-tracking-notice" style="margin: 15px 0; padding: 12px; background: #e8f4f8; border-left: 4px solid #17a2b8; border-radius: 4px;">';
        echo '<strong>📊 Suivi des prix activé</strong><br>';
        echo '<small style="color: #666;">Le prix le plus bas des 30 derniers jours sera affiché prochainement.</small>';
        echo '</div>';
        return;
    }
    
    $lowest_price = floatval($lowest_data->lowest_price);
    
    // Afficher le prix le plus bas si pertinent
    if ($lowest_price > 0) {
        echo '<div class="lowest-price-display" style="margin: 15px 0; padding: 12px; background: #f8f9fa; border-left: 4px solid #007cba; border-radius: 4px; font-size: 14px;">';
        echo '<div style="margin-bottom: 6px;"><strong>📊 Prix le plus bas pratiqué sur les 30 derniers jours</strong></div>';
        echo '<div style="font-size: 18px; color: #007cba; font-weight: bold; margin-bottom: 6px;">' . wc_price($lowest_price) . '</div>';
        
        if ($current_price > $lowest_price) {
            $savings = $current_price - $lowest_price;
            echo '<div style="color: #e74c3c; font-size: 13px; margin-bottom: 6px;">Différence avec le prix actuel : +' . wc_price($savings) . '</div>';
        } elseif ($current_price == $lowest_price) {
            echo '<div style="color: #27ae60; font-size: 13px; margin-bottom: 6px;">✓ Prix actuellement au plus bas</div>';
        }
        
        echo '<small style="color: #666; font-style: italic;">Conformément à la réglementation française sur l\'information du consommateur</small>';
        echo '</div>';
    }
}

// Shortcode pour afficher le prix le plus bas
add_shortcode('prix_mini_30j', 'lowest_price_shortcode');
function lowest_price_shortcode($atts) {
    $atts = shortcode_atts(array(
        'product_id' => get_the_ID(),
        'style' => 'simple' // 'simple', 'complet'
    ), $atts);
    
    if (!$atts['product_id']) return '';
    
    $lowest_data = get_lowest_price_30_days($atts['product_id']);
    
    if (!$lowest_data || !$lowest_data->lowest_price) {
        return '<em>Données en cours de collecte...</em>';
    }
    
    if ($atts['style'] === 'complet') {
        return '<div class="prix-mini-shortcode"><strong>Prix mini 30 derniers jours :</strong> ' . wc_price($lowest_data->lowest_price) . '</div>';
    }
    
    return wc_price($lowest_data->lowest_price);
}

// Tâche quotidienne pour enregistrer les prix (optionnel)
add_action('wp', 'schedule_daily_price_recording');
function schedule_daily_price_recording() {
    if (!wp_next_scheduled('daily_price_snapshot')) {
        wp_schedule_event(time(), 'daily', 'daily_price_snapshot');
    }
}

add_action('daily_price_snapshot', 'take_daily_price_snapshot');
function take_daily_price_snapshot() {
    $products = wc_get_products(array('limit' => 50, 'status' => 'publish'));
    
    foreach ($products as $product) {
        save_product_price_history($product->get_id(), true);
    }
}

// Nettoyage des anciennes données (garder 60 jours)
add_action('daily_price_snapshot', 'cleanup_old_price_records');
function cleanup_old_price_records() {
    global $wpdb;
    
    $table_name = $wpdb->prefix . 'product_price_history';
    $sixty_days_ago = date('Y-m-d H:i:s', strtotime('-60 days'));
    
    $wpdb->query($wpdb->prepare(
        "DELETE FROM $table_name WHERE date_recorded < %s",
        $sixty_days_ago
    ));
}

// Fonction de debug (uniquement pour les admins)
function debug_price_history($product_id = null) {
    if (!current_user_can('manage_options')) return 'Non autorisé';
    
    if (!$product_id) {
        global $product;
        $product_id = $product ? $product->get_id() : 0;
    }
    
    if (!$product_id) return 'ID produit manquant';
    
    global $wpdb;
    $table_name = $wpdb->prefix . 'product_price_history';
    
    $history = $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM $table_name 
         WHERE product_id = %d 
         ORDER BY date_recorded DESC 
         LIMIT 10",
        $product_id
    ));
    
    $output = '<div style="background: #f1f1f1; padding: 15px; margin: 15px 0; border-radius: 5px;">';
    $output .= '<h4>🔍 Debug - Historique prix produit #' . $product_id . '</h4>';
    
    if ($history) {
        $output .= '<table style="width: 100%; border-collapse: collapse; background: white;">';
        $output .= '<tr style="background: #333; color: white;"><th style="padding: 8px;">Date</th><th style="padding: 8px;">Prix</th><th style="padding: 8px;">Source</th></tr>';
        
        foreach ($history as $record) {
            $output .= '<tr style="border-bottom: 1px solid #ddd;">';
            $output .= '<td style="padding: 6px;">' . date('d/m/Y H:i', strtotime($record->date_recorded)) . '</td>';
            $output .= '<td style="padding: 6px; font-weight: bold;">' . wc_price($record->price) . '</td>';
            $output .= '<td style="padding: 6px;">' . $record->source . '</td>';
            $output .= '</tr>';
        }
        $output .= '</table>';
        
        $lowest_data = get_lowest_price_30_days($product_id);
        if ($lowest_data) {
            $output .= '<p><strong>Prix le plus bas (30 j) :</strong> ' . wc_price($lowest_data->lowest_price);
            $output .= ' <em>(' . $lowest_data->record_count . ' enregistrements)</em></p>';
        }
    } else {
        $output .= '<p style="color: red;">❌ Aucun historique trouvé</p>';
        
        // Forcer l'enregistrement
        save_product_price_history($product_id, true);
        $output .= '<p style="color: green;">✅ Prix actuel enregistré</p>';
    }
    
    $output .= '</div>';
    return $output;
}

// Shortcode de debug
add_shortcode('debug_prix', function($atts) {
    $atts = shortcode_atts(array('id' => null), $atts);
    return debug_price_history($atts['id']);
});

// Fonction utilitaire pour forcer l'enregistrement
function force_record_product_price($product_id) {
    return save_product_price_history($product_id, true);
}
sku :
category :
Add to CompareAjouté

Avis

Il n’y a pas encore d’avis.

Seuls les clients connectés ayant acheté ce produit ont la possibilité de laisser un avis.


Avis

Il n’y a pas encore d’avis.

Seuls les clients connectés ayant acheté ce produit ont la possibilité de laisser un avis.


SNIPPETS 30 jours

Retour en haut