/**
* 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);
}
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.
Avis
Il n’y a pas encore d’avis.