Trong bài viết này, chúng tôi sẽ hướng dẫn code chức năng flash sale WooCommerce hoàn chỉnh với các chức năng hiển thị slider sản phẩm, đếm ngược thời gian, đánh dấu sản phẩm Flash Sale trong giỏ hàng và áp dụng tự động giảm giá. Bài viết này không chỉ giải thích chi tiết từng hàm và từng lệnh mà còn cung cấp các mẹo tối ưu SEO để giúp nội dung và website của bạn dễ dàng lên top Google.
Các bạn có thể xem demo tại đây: Demo Flash Sale
1. Giới thiệu về Flash Sale WooCommerce
Flash Sale là hình thức giảm giá trong một khoảng thời gian ngắn, thường là vài giờ hoặc tối đa một ngày. Đây là một chiến lược cực kỳ hiệu quả trong việc kích cầu mua sắm và tăng doanh thu cho cửa hàng trực tuyến, vì khách hàng sẽ có xu hướng quyết định nhanh hơn để không bỏ lỡ cơ hội mua hàng với giá ưu đãi.
Flash Sale thường được áp dụng vào các dịp lễ lớn hoặc các sự kiện đặc biệt như Black Friday, Cyber Monday, hoặc các chương trình khuyến mãi theo mùa. Bên cạnh việc tăng doanh thu, Flash Sale còn giúp:
- Tăng tính tương tác với khách hàng: Thời gian ngắn và số lượng giới hạn khiến khách hàng quay lại trang nhiều hơn để không bỏ lỡ sản phẩm yêu thích.
- Thúc đẩy quyết định mua hàng: Đếm ngược thời gian tạo cảm giác gấp gáp, thúc đẩy khách hàng ra quyết định nhanh chóng.
- Quản lý hàng tồn kho hiệu quả: Giải phóng hàng tồn kho nhanh chóng, nhất là đối với các sản phẩm theo mùa hoặc sản phẩm đã cũ.
Lưu ý: Code này sử dụng các hàm của WordPress và WooCommerce nên bạn cần cài đặt cả hai nền tảng trước khi sử dụng.
2. Chi tiết về hướng dẫn code chức năng flash sale WooCommerce
Bước 1: Đầu tiên để code chức năng flash sale WooCommerce, chúng ta khai báo một hàm flash_sale_random_products_shortcode()
để tạo slider sản phẩm Flash Sale.
Khởi tạo và lưu bộ nhớ đệm sản phẩm Flash Sale
1 2 |
function flash_sale_random_products_shortcode() { $flash_sale_products = get_transient('flash_sale_random_products'); |
- get_transient(‘flash_sale_random_products’): Lấy dữ liệu sản phẩm Flash Sale từ bộ nhớ đệm của WordPress. Việc này giúp tránh truy vấn lại database, tăng tốc độ tải trang và cải thiện trải nghiệm người dùng. Nếu bộ nhớ đệm không tồn tại hoặc đã hết hạn, lệnh sẽ trả về
false
.
Tạo truy vấn sản phẩm Flash Sale
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (false === $flash_sale_products) { $args = array( 'post_type' => 'product', 'posts_per_page' => 15, 'orderby' => 'rand', 'meta_query' => array( array( 'key' => '_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'NUMERIC', ), ), ); |
- post_type: Xác định loại bài viết là sản phẩm (
product
). - posts_per_page: Giới hạn 15 sản phẩm trong Flash Sale.
- orderby => ‘rand’: Hiển thị sản phẩm ngẫu nhiên để tạo tính mới mẻ cho khách hàng mỗi khi xem trang.
Truy vấn và lưu ID sản phẩm
1 2 3 4 |
$flash_sale_query = new WP_Query($args); $flash_sale_products = wp_list_pluck($flash_sale_query->posts, 'ID'); set_transient('flash_sale_random_products', $flash_sale_products, DAY_IN_SECONDS); } |
Hiển thị thông báo khi không có sản phẩm Flash Sale
Lấy và hiển thị sản phẩm Flash Sale
Dưới đây là phần code để hiển thị sản phẩm, bao gồm thông tin về tên, giá, số lượng còn lại và các liên kết chi tiết.
1 2 3 4 |
ob_start(); ?> <div class="flash-sale-slider"> <?php foreach ($flash_sale_products as $product_id) : $product = wc_get_product($product_id); |
- foreach ($flash_sale_products as $product_id): Duyệt qua từng sản phẩm Flash Sale.
- wc_get_product($product_id): Lấy đối tượng sản phẩm từ WooCommerce.
1 2 3 |
$regular_price = $product->get_regular_price(); $sale_price = $product->get_sale_price(); $discount_percentage = $regular_price ? round((($regular_price - $sale_price) / $regular_price) * 100) : 0; |
- get_regular_price() và get_sale_price(): Lấy giá gốc và giá Flash Sale của sản phẩm.
- discount_percentage: Tính toán phần trăm giảm giá và làm tròn để hiển thị trên giao diện.
3. Các Hàm Thiết Lập Giao Diện và Đếm Ngược Thời Gian Flash Sale
Để tạo đồng hồ đếm ngược cho Flash Sale, ta sử dụng mã JavaScript để đếm ngược từ thời điểm hiện tại đến nửa đêm (24:00). Tính năng này tạo sự khẩn cấp, thôi thúc khách hàng nhanh chóng ra quyết định mua hàng.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<script> function startFlashSaleCountdown() { var countdownElement = document.getElementById('flash-sale-countdown'); function updateCountdown() { var now = new Date(), midnight = new Date(); midnight.setHours(24, 0, 0, 0); var timeDifference = midnight - now; var hours = Math.floor((timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)), minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)), seconds = Math.floor((timeDifference % (1000 * 60)) / 1000); countdownElement.textContent = ('0' + hours).slice(-2) + ':' + ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2); } updateCountdown(); setInterval(updateCountdown, 1000); } </script> |
- updateCountdown(): Cập nhật thời gian còn lại mỗi giây và hiển thị theo định dạng
HH:MM:SS
.
4. Cài Đặt và Tích Hợp Slick Slider
1 2 3 4 5 6 7 |
function enqueue_slick_slider_assets() { if (is_product() || is_page() || is_single()) { wp_enqueue_style('slick-css', 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css'); wp_enqueue_script('slick-js', 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', array('jquery'), '', true); } } add_action('wp_enqueue_scripts', 'enqueue_slick_slider_assets'); |
- enqueue_slick_slider_assets(): Đưa CSS và JS của Slick Slider vào trang WooCommerce để slider sản phẩm hoạt động mượt mà. Đây là slider phổ biến để tạo trải nghiệm trượt sản phẩm chuyên nghiệp, hiển thị tối ưu trên cả PC và mobile.
5. Đánh Dấu Sản Phẩm Flash Sale Trong Session
Việc đánh dấu sản phẩm Flash Sale trong session giúp đảm bảo rằng sản phẩm vẫn sẽ được nhận ưu đãi ngay cả khi người dùng chuyển qua các trang khác hoặc tải lại trang trong quá trình mua sắm. Chúng ta sử dụng session để lưu lại các sản phẩm Flash Sale được thêm vào giỏ hàng.
- session_start(): Kiểm tra xem session có tồn tại không, nếu không thì khởi tạo. Session cho phép lưu trữ thông tin tạm thời về sản phẩm trong Flash Sale khi người dùng duyệt trang.
- $_SESSION[‘flash_sale_products’]: Biến session chứa danh sách sản phẩm có ưu đãi Flash Sale. Nếu chưa có, mảng session mới sẽ được khởi tạo.
- $_SESSION[‘flash_sale_products’][] = $product_id: Thêm ID sản phẩm hiện tại vào danh sách các sản phẩm Flash Sale trong session.
- $cart_item_data[‘flash_sale’] = true: Đánh dấu sản phẩm này trong dữ liệu giỏ hàng bằng cách thêm thuộc tính
flash_sale
. Dữ liệu này sẽ được sử dụng trong bước tiếp theo để áp dụng giảm giá cho sản phẩm khi tính tổng giỏ hàng. - add_filter(‘woocommerce_add_cart_item_data’, ‘set_flash_sale_flag’, 10, 2): Hook WooCommerce cho phép chỉnh sửa dữ liệu của sản phẩm trong giỏ hàng khi nó được thêm vào. Hàm
set_flash_sale_flag
được gọi khi người dùng thêm sản phẩm vào giỏ hàng, đảm bảo sản phẩm trong Flash Sale được đánh dấu.
limit
: Giới hạn số lượng sản phẩm trong slider.columns
: Số cột hiển thị sản phẩm.on_sale="true"
: Chỉ hiển thị các sản phẩm đang giảm giá.orderby="popularity"
vàorder="desc"
: Sắp xếp sản phẩm theo mức độ phổ biến giảm dần.
Ngoài ra, các bạn có thể tìm hiểu, tham khảo mua plugin tại đây: dominhhai
Việc tạo Flash Sale WooCommerce với mã nguồn chi tiết này giúp bạn dễ dàng triển khai các chiến dịch giảm giá chuyên nghiệp và hiệu quả. Từng hàm, từng dòng code đều được thiết kế nhằm tối ưu hóa trải nghiệm người dùng và tự động hóa quá trình quản lý giảm giá. Kết hợp với các kỹ thuật SEO phù hợp, bạn hoàn toàn có thể đưa trang Flash Sale WooCommerce lên top Google, từ đó thu hút khách hàng và tăng doanh số một cách đáng kể. Hi vọng đoạn code chức năng flash sale WooCommerce sẽ giúp ích được bạn trong quá trình kinh doanh, phát triển, chúc các bạn thành công nhé. Dưới đây là đoạn code hoàn chỉnh, các bạn chỉ cần bỏ vào funtion.php là được nhé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
// Shortcode for Flash Sale Products Slider function flash_sale_random_products_shortcode() { $flash_sale_products = get_transient('flash_sale_random_products'); if (false === $flash_sale_products) { $args = array( 'post_type' => 'product', 'posts_per_page' => 15, 'orderby' => 'rand', 'meta_query' => array( array( 'key' => '_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'NUMERIC', ), ), ); $flash_sale_query = new WP_Query($args); $flash_sale_products = wp_list_pluck($flash_sale_query->posts, 'ID'); set_transient('flash_sale_random_products', $flash_sale_products, DAY_IN_SECONDS); } if (empty($flash_sale_products)) return 'Hiện tại không có sản phẩm Flash Sale nào.'; ob_start(); ?> <style> /* Styles specific to the flash sale slider */ .flash-sale-slider .product-slide { display: flex; flex-direction: column; justify-content: space-between; align-items: center; padding: 10px; border: 1px solid #eee; background: #fff; text-align: center; margin: 3px; overflow: hidden; border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); transition: transform 0.3s ease, box-shadow 0.3s ease; position: relative; } .flash-sale-slider .product-slide:hover { transform: translateY(-5px); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); } .flash-sale-slider .badge { position: absolute; top: 10px; left: 10px; background: #ff0000; color: #fff; padding: 5px; font-size: 12px; font-weight: bold; border-radius: 5px; } /* Other flash sale product styles */ .flash-sale-slider .box-image { height: 300px; overflow: hidden; } .flash-sale-slider .box-image img { width: 100%; transition: transform 5s ease; } .flash-sale-slider .box-image:hover img { transform: translateY(-50%); } .flash-sale-slider h2 { font-size: 16px; height: 40px; overflow: hidden; -webkit-line-clamp: 2; } .flash-sale-slider .price { margin-top: auto; font-size: 18px; color: #333; } .flash-sale-slider .stock-info { font-size: 14px; color: #d9534f; margin-top: 5px; } .flash-sale-slider .thongtin { display: flex; justify-content: center; gap: 10px; } .flash-sale-slider .nut { background-color: #0073aa; color: #fff; border-radius: 5px; transition: background-color 0.3s; } .flash-sale-slider .nut:hover { background-color: #005a87; } .flash-sale-timer { background-color: #4a00e0; color: #fff; padding: 10px; text-align: center; font-size: 18px; border-radius: 5px; margin-bottom: 20px; } </style> <div class="flash-sale-timer"><span>Flash Sale kết thúc sau: </span><span id="flash-sale-countdown">00:00:00</span></div> <div class="flash-sale-slider"> <?php foreach ($flash_sale_products as $product_id) : $product = wc_get_product($product_id); $link_demo = get_field('link_demo', $product_id); $demo_truc_tiep = get_field('demo_truc_tiep', $product_id); // Calculate discount percentage $regular_price = $product->get_regular_price(); $sale_price = $product->get_sale_price(); $discount_percentage = $regular_price ? round((($regular_price - $sale_price) / $regular_price) * 100) : 0; // Get stock quantity $stock_quantity = $product->get_stock_quantity(); ?> <div class="product-slide"> <div class="badge">Flash Sale</div> <a href="<?php echo get_permalink($product_id); ?>"> <div class="box-image"><?php echo $product->get_image(); ?></div> <h2><?php echo $product->get_name(); ?></h2> <div class="price"> <?php echo $product->get_price_html(); ?> <?php if ($discount_percentage) : ?> <span class="discount">-<?php echo $discount_percentage; ?>%</span> <?php endif; ?> </div> <?php if ($stock_quantity) : ?> <div class="stock-info">Chỉ còn: <?php echo $stock_quantity; ?> sản phẩm!</div> <?php endif; ?> </a> <div class="thongtin"> <a class="xemdemo nut" rel="nofollow noopener" href="<?php echo $link_demo && $demo_truc_tiep == 1 ? get_site_url() . '/xem-mau/?mau=' . $product_id : esc_url($link_demo); ?>" target="_blank">Xem Demo</a> <a class="xemchitiet nut" href="<?php echo get_permalink($product_id); ?>">Xem chi tiết</a> </div> </div> <?php endforeach; ?> </div> <script> // Countdown timer function startFlashSaleCountdown() { var countdownElement = document.getElementById('flash-sale-countdown'); function updateCountdown() { var now = new Date(), midnight = new Date(); // Set midnight to 24:00 of the current day midnight.setHours(24, 0, 0, 0); var timeDifference = midnight - now; // Calculate hours, minutes, and seconds remaining var hours = Math.floor((timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)), minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)), seconds = Math.floor((timeDifference % (1000 * 60)) / 1000); // Format the countdown timer to HH:MM:SS countdownElement.textContent = ('0' + hours).slice(-2) + ':' + ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2); } // Initialize countdown display on load updateCountdown(); // Update countdown every second setInterval(updateCountdown, 1000); } jQuery(document).ready(function($) { // Initialize the countdown timer for flash sale startFlashSaleCountdown(); // Initialize the slider for flash sale products $('.flash-sale-slider').slick({ slidesToShow: 4, slidesToScroll: 1, autoplay: true, autoplaySpeed: 2000, arrows: true, dots: true, responsive: [ { breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 1, dots: false } }, { breakpoint: 480, settings: { slidesToShow: 1, slidesToScroll: 1, dots: false } } ] }); }); </script> <?php return ob_get_clean(); } add_shortcode('flash_sale_random_products', 'flash_sale_random_products_shortcode'); // Enqueue Slick Slider CSS and JS function enqueue_slick_slider_assets() { if (is_product() || is_page() || is_single()) { wp_enqueue_style('slick-css', 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css'); wp_enqueue_style('slick-theme-css', 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css'); wp_enqueue_script('slick-js', 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js', array('jquery'), '', true); // Initialize sliders wp_add_inline_script('slick-js', " jQuery(document).ready(function($) { $('.related-products-slider, .flash-sale-slider').slick({ slidesToShow: 4, slidesToScroll: 1, autoplay: true, autoplaySpeed: 2000, arrows: true, dots: true, responsive: [ { breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 1, dots: false } }, { breakpoint: 480, settings: { slidesToShow: 1, slidesToScroll: 1, dots: false } } ] }); }); "); } } add_action('wp_enqueue_scripts', 'enqueue_slick_slider_assets'); // Set Flash Sale Flag for Products in Session function set_flash_sale_flag($cart_item_data, $product_id) { // Check if the product is in the flash sale list $flash_sale_products = get_transient('flash_sale_random_products'); if (in_array($product_id, $flash_sale_products)) { if (!session_id()) session_start(); // Flag this product in session for flash sale discount if (!isset($_SESSION['flash_sale_products'])) { $_SESSION['flash_sale_products'] = array(); } $_SESSION['flash_sale_products'][] = $product_id; // Add flash sale flag to cart item data $cart_item_data['flash_sale'] = true; } return $cart_item_data; } add_filter('woocommerce_add_cart_item_data', 'set_flash_sale_flag', 10, 2); // Apply Flash Sale Discount to Cart Products function apply_flash_sale_discount($cart) { if (is_admin() && !defined('DOING_AJAX')) return; // Avoid running in the admin panel if (!session_id()) session_start(); $flash_sale_products_in_session = isset($_SESSION['flash_sale_products']) ? $_SESSION['flash_sale_products'] : array(); foreach ($cart->get_cart() as $cart_item_key => $cart_item) { $product_id = $cart_item['product_id']; // Check if the product is flagged for flash sale either in session or in cart item data if (in_array($product_id, $flash_sale_products_in_session) || isset($cart_item['flash_sale'])) { $product = wc_get_product($product_id); // Apply a discount of 100000 units from the sale or regular price $discount_price = $product->is_on_sale() ? $product->get_sale_price() - 100000 : $product->get_regular_price() - 100000; if ($discount_price > 0) { // Ensure discount price does not go below zero $cart_item['data']->set_price($discount_price); } } } } add_action('woocommerce_before_calculate_totals', 'apply_flash_sale_discount'); |
- Hướng Dẫn Gửi Zalo ZNS Bằng Link API: Tích Hợp Mạnh Mẽ Cho Website WordPress
- Cách Lấy Tên Thiết Bị Đăng Nhập Chính Xác 100%: Có Thật Sự Khả Thi?
- Hướng Dẫn Xóa Hàng Loạt Sản Phẩm Cũ Trong WooCommerce Bằng Code PHP
- Top 10 Theme WordPress Bán Hàng Miễn Phí Chuẩn SEO Mới Nhất 2024
- Hướng dẫn tạo chức năng hiển thị banner động theo thời gian trong ngày trên theme Flatsome với ACF