Ce code PHP est un plugin pour WordPress conçu pour fonctionner avec WooCommerce. Il ajoute des fonctionnalités de notification lorsqu'un produit est ajouté ou retiré du panier d'achat. Voici un résumé de ses principales fonctionnalités et opérations :

  1. Création d'une table dans la base de données : Au démarrage, le plugin crée une table nommée wp_cart_actions (le préfixe wp_ peut varier) dans la base de données de WordPress. Cette table est destinée à enregistrer les actions des utilisateurs sur le panier, comme l'ajout ou la suppression de produits.

  2. Enregistrement des actions du panier : Le plugin définit deux fonctions, record_cart_action et record_remove_action, qui sont déclenchées respectivement lors de l'ajout et de la suppression d'un produit du panier. Ces fonctions insèrent des enregistrements dans la table wp_cart_actions, incluant le nom d'utilisateur, l'ID du produit, l'action (ajout ou suppression) et le moment où l'action a été effectuée.

  3. Scripts et styles : Le plugin met en file d'attente des scripts et des styles spécifiques pour être chargés sur le site. Il inclut un script addevent.js et un fichier de style style.css pour le front-end, ainsi qu'un fichier de style adminstyle.css pour l'interface d'administration de WordPress.

  4. Page d'administration : Une page d'administration est ajoutée pour permettre la configuration des notifications d'achat. Cette page permet aux administrateurs de définir un message de bienvenue personnalisé qui peut être utilisé dans les notifications.

  5. Enregistrement des paramètres : Le plugin enregistre un paramètre welcome_message qui stocke le message de bienvenue configuré via la page d'administration.

  6. Notifications AJAX : Deux fonctions AJAX, fetch_notification_content et fetch_new_products, sont définies pour récupérer le contenu des notifications. La première fonction génère une notification contenant le dernier produit ajouté au panier, le message de bienvenue, et des informations sur le produit. La seconde fonction est destinée à récupérer les nouveaux produits ajoutés au panier, mais nécessite une implémentation personnalisée pour fonctionner correctement.

  7. Sécurité : Le plugin utilise des nonces pour sécuriser les requêtes AJAX, s'assurant que les actions ne peuvent être déclenchées que de manière légitime.

En résumé, ce plugin étend les fonctionnalités de WooCommerce en fournissant un système de notification pour les actions sur le panier, améliorant ainsi l'interaction utilisateur et offrant des options de personnalisation via une page d'administration.

// send_notification_on_purchase.php


<?php
/*
Plugin Name: WooCommerce add to cart Notification
Description: Sends a notification when a product is purchased
Version: 1.0
Author: Your Name
*/

// Global WordPress database object
global $wpdb;

// Define the table name
$table_name = $wpdb->prefix . 'cart_actions';

// Get the character set and collation for the table
$charset_collate = $wpdb->get_charset_collate();

// SQL to create the table
$sql = "CREATE TABLE $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT,
    user_name varchar(255) NOT NULL,
    product_id mediumint(9) NOT NULL,
    action varchar(255) NOT NULL,
    time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
    PRIMARY KEY  (id)
) $charset_collate;";

// Include the upgrade functions
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

// Execute the SQL
dbDelta($sql);


// Function to record an action when a product is added to the cart
function record_cart_action($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'cart_actions';

    // Get the current user's username
    $user_name = wp_get_current_user()->user_login;

    // Insert a row into the table
    $wpdb->insert(
        $table_name,
        array(
            'user_name' => $user_name,
            'product_id' => $product_id,
            'action' => 'add',
            'time' => current_time('mysql'),
        )
    );
}
// Add the function to the 'woocommerce_add_to_cart' action
add_action('woocommerce_add_to_cart', 'record_cart_action', 10, 6);

// Function to record an action when a product is removed from the cart
function record_remove_action($cart_item_key) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'cart_actions';

     // Get the cart items
    $cart_items = WC()->cart->get_cart();
    // Get the product ID of the removed item
    $product_id = $cart_items[$cart_item_key]['product_id'];
    // Get the current user's username
    $user_name = wp_get_current_user()->user_login;

    // Insert a row into the table
    $wpdb->insert(
        $table_name,
        array(
            'user_name' => $user_name,
            'product_id' => $product_id,
            'action' => 'remove',
            'time' => current_time('mysql'),
        )
    );
}
// Add the function to the 'woocommerce_remove_cart_item' action
add_action('woocommerce_remove_cart_item', 'record_remove_action', 10, 1);


// Function to enqueue scripts
function enqueue_scripts() {
    // Enqueue the 'addevent' script
    wp_enqueue_script('addevent', plugin_dir_url(__FILE__) . 'addevent.js', array(), '1.0.0', true);

    // Passer des variables de PHP à JavaScript
    $php_vars = array(
        'welcome_message' => get_option('welcome_message'),
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('my_ajax_nonce'),
        // Ajoutez ici d'autres variables que vous voulez passer à JavaScript
    );

    wp_localize_script('addevent', 'phpVars', $php_vars);
     // Enqueue the 'my_style' stylesheet
    wp_enqueue_style('my_style', plugin_dir_url(__FILE__) . 'style.css');
}
// Add the function to the 'wp_enqueue_scripts' action
add_action('wp_enqueue_scripts', 'enqueue_scripts', 10);

// Function to add an admin page
function add_admin_page() {
    add_options_page('Paramètres de notification d\'achat', 'Notifications d\'achat', 'manage_options', 'purchase-notifications', 'render_admin_page');
}
// Add the function to the 'admin_menu' action
add_action('admin_menu', 'add_admin_page');

// Function to render the admin page
function render_admin_page() {
    ?>
    <div class="wrap">
        <h1>Paramètres de notification d'achat</h1>
        <form method="post" action="options.php">
            <?php
            settings_fields('purchase-notifications');
            do_settings_sections('purchase-notifications');
            ?>
            <h2>Message de bienvenue</h2>
            <input type="text" name="welcome_message" value="<?php echo get_option('welcome_message'); ?>" />
            <?php
            submit_button();
            ?>
        </form>
    </div>
    <?php
}

// Function to register settings
function register_settings() {
    register_setting('purchase-notifications', 'welcome_message');
}
// Add the function to the 'admin_init' action
add_action('admin_init', 'register_settings');

// Function to enqueue admin styles
function enqueue_admin_styles() {
    wp_enqueue_style('my_admin_style', plugin_dir_url(__FILE__) . 'adminstyle.css');
}
// Add the function to the 'admin_enqueue_scripts' action
add_action('admin_enqueue_scripts', 'enqueue_admin_styles');

// Function to fetch notification content
function fetch_notification_content() {
    // Assurez-vous que l'utilisateur est connecté.
    if (!is_user_logged_in()) {
        wp_send_json_error('You must be logged in to perform this action.');
        wp_die();
    }

    // Récupérer l'utilisateur actuel.
    $current_user = wp_get_current_user();

    // Récupérer le panier de l'utilisateur.
    $cart = WC()->cart->get_cart();

    // Récupérer le dernier produit ajouté au panier.
    $last_product = end($cart);
    $product = wc_get_product($last_product['product_id']);

    // Récupérer le message de bienvenue.
    $welcome_message = get_option('welcome_message');

     // Récupérer l'image du produit.
     $product_image = $product->get_image('thumbnail');

     // Récupérer le lien du produit.
    $product_link = $product->get_permalink();

    // Prepare the message
    $message = '<div class="notification">';
    $message .= $welcome_message . '<br>' . $current_user->user_login;
    $message .= '<a href="' . $product_link . '">' . $product->get_name() . '</a>'; // Ajouter le lien du produit sur le nom du produit.
    $message .= '<br>' . $product_image; // Ajouter l'image du produit
    $message .= '</div>';

    // Préparer la réponse.
    $response = array(
        'status' => 'success',
        'message' => $message,
        'data' => array(
            'username' => $current_user->user_login,
            'product_name' => $product->get_name(),
        ),
    );

    // Envoyer la réponse JSON.
    wp_send_json($response);

    // Toujours tuer la tache d'une fonction AJAX pour éviter les erreurs.
    wp_die();
}

// Enregistrer la fonction AJAX pour les utilisateurs connectés.
add_action('wp_ajax_fetch_notification_content', 'fetch_notification_content');

// Enregistrer la fonction AJAX pour les utilisateurs non connectés.
add_action('wp_ajax_nopriv_fetch_notification_content', 'fetch_notification_content');


function fetch_new_products() {
    // Vérifiez le nonce pour la sécurité.
    check_ajax_referer('my_ajax_nonce', 'nonce');

    // Ici, vous devez récupérer les nouveaux produits ajoutés au panier.
    // Cela dépend de la façon dont vous stockez les produits dans le panier.
    // Pour cet exemple, je vais supposer que vous avez une fonction get_new_products() qui retourne un tableau de nouveaux produits.
     // Récupérer le panier de l'utilisateur.

    $new_products = get_new_products();
    //var_dump($new_products); // Remplacez cette ligne par votre propre logique pour récupérer les nouveaux produits ajoutés au panier.

    // Préparez les données à renvoyer.
    $data = array(
        'status' => 'success',
        'message' => $new_products,
    );

    // Renvoyez les données en JSON.
    wp_send_json($data);
}
add_action('wp_ajax_fetch_new_products', 'fetch_new_products');
add_action('wp_ajax_nopriv_fetch_new_products', 'fetch_new_products');

function get_new_products() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'cart_actions';

    // Récupérer le dernier produit ajouté au panier à partir de la base de données.
    $last_product = $wpdb->get_row("SELECT * FROM $table_name WHERE action = 'add' ORDER BY time DESC LIMIT 1");

    if ($last_product) {
        $product = wc_get_product($last_product->product_id);

        // Récupérer le message de bienvenue.
        $welcome_message = get_option('welcome_message');

        // Récupérer l'image du produit.
        $product_image = $product->get_image('thumbnail');

        // Récupérer le lien du produit.
        $product_link = $product->get_permalink();

        $message = '<div class="notification">';
        $message .= $welcome_message . '<br>';
        $message .= '<a href="' . $product_link . '">' . $product->get_name() . '</a>'; // Ajouter le lien du produit sur le nom du produit.
        $message .= '<br>' . $product_image; // Ajouter l'image du produit
        $message .= '</div>';

        return $message;
    }
}

 

Ce code JavaScript est conçu pour fonctionner avec le plugin WordPress WooCommerce mentionné précédemment. Il ajoute des fonctionnalités côté client pour vérifier régulièrement si de nouveaux produits ont été ajoutés au panier et afficher des notifications en conséquence. Voici un résumé de ses principales fonctionnalités :

  1. Vérification des nouveaux produits : La fonction checkForNewProducts est appelée toutes les 5 secondes grâce à setInterval. Cette fonction envoie une requête POST à WordPress via AJAX, en utilisant l'URL et le nonce stockés dans l'objet phpVars (qui est passé du PHP au JavaScript par le plugin). L'action fetch_new_products est demandée, ce qui déclenche la fonction PHP correspondante sur le serveur pour vérifier les nouveaux produits ajoutés au panier.

  2. Traitement de la réponse : La réponse de la requête AJAX est d'abord convertie en texte, puis analysée en tant que JSON. Si la réponse est correctement formatée en JSON, elle est traitée pour extraire le message concernant le nouveau produit ajouté au panier. Ce message est ensuite utilisé pour afficher une notification à l'utilisateur.

  3. Affichage des notifications : La fonction showNotification prend le message reçu de la requête AJAX et l'affiche dans une div de notification sur la page. Si une telle div n'existe pas déjà, elle est créée et ajoutée au corps du document. Le message est inséré comme contenu HTML de cette div, permettant ainsi une notification visuelle à l'utilisateur.

  4. Gestion des erreurs : En cas d'erreur lors de la requête AJAX ou de l'analyse de la réponse, un message d'erreur est affiché dans la console pour aider au débogage.

  5. Événement personnalisé : Après l'affichage de la notification, un événement personnalisé productAddedToCart est déclenché sur l'objet window, avec le message comme détail. Cela permet à d'autres scripts sur la page d'écouter cet événement et de réagir en conséquence, offrant ainsi une flexibilité pour intégrer d'autres fonctionnalités ou interactions basées sur l'ajout de produits au panier.

En résumé, ce script améliore l'expérience utilisateur sur un site WooCommerce en fournissant des notifications en temps réel lorsqu'un produit est ajouté au panier, en utilisant des requêtes AJAX pour communiquer avec le serveur et en mettant à jour dynamiquement l'interface utilisateur sans nécessiter de rechargement de la page.


// Fonction pour vérifier si un nouveau produit a été ajouté au panier.
function checkForNewProducts() {    
    fetch(phpVars.ajaxurl, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: 'action=fetch_new_products&nonce=' + phpVars.nonce,
    })
    .then(response => response.text())
    .then(data => {
        try {
            data = JSON.parse(data);
        } catch (error) {
            console.error('This is not JSON:', data);
            throw error;
        }
        console.log('Product added to cart, showing notification', data);
        showNotification(data.message);
        var customEvent = new CustomEvent('productAddedToCart', { detail: { message: data.message } });
        window.dispatchEvent(customEvent);
    })
    .catch(error => {
        // Gérer l'erreur.
        console.error('Une erreur est survenue lors de la récupération des nouveaux produits.', error);
    });
}

// Vérifier les nouveaux produits toutes les 5 secondes.
setInterval(checkForNewProducts, 5000);

function showNotification(message) {
    console.log("message", message);

    // Essayer de sélectionner la div de notification.
    var notification = document.querySelector('.notification');

    // Si la div de notification n'existe pas, en créer une nouvelle.
    if (!notification) {
        notification = document.createElement('div');
        notification.classList.add('notification');
        document.body.appendChild(notification);
    }

    // Mettre à jour le contenu de la div de notification.
    notification.innerHTML = message;
}

 

 

Modifié le: mardi 13 février 2024, 06:35