Trong quá trình vận hành một cửa hàng trực tuyến trên WooCommerce, việc quản lý kho sản phẩm là rất quan trọng. Đặc biệt, nếu bạn cần xóa các sản phẩm cũ không còn sử dụng hoặc không còn bán nữa, bài viết này sẽ hướng dẫn cách tự động xóa các sản phẩm cũ trước một ngày cố định bằng cách sử dụng đoạn code PHP dưới đây.
1. Giới thiệu về đoạn code xóa sản phẩm cũ
Đoạn code này giúp bạn xóa sản phẩm cũ trong WooCommerce dựa trên ngày tạo của sản phẩm. Các sản phẩm được tạo trước ngày 18/08/2024 sẽ bị xóa tự động, bao gồm cả hình ảnh đính kèm sản phẩm. Điều này giúp dọn dẹp kho sản phẩm cũ, giải phóng dung lượng lưu trữ trên hosting, và giữ cho trang web luôn sạch sẽ, gọn gàng.

2. Giải thích chi tiết từng phần của code
2.1. Hàm delete_old_products
Đây là hàm chính, chịu trách nhiệm xóa các sản phẩm cũ.
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 | function delete_old_products() { // Define the query to get products before 18/08/2024 $args = array( 'post_type' => 'product', 'posts_per_page' => -1, // Lấy tất cả sản phẩm không giới hạn số lượng 'date_query' => array( array( 'before' => '2024-08-18', // Chỉ lấy sản phẩm được tạo trước ngày 18/08/2024 ), ), 'fields' => 'ids', // Chỉ lấy ID sản phẩm để xử lý nhanh hơn ); // Lấy tất cả các sản phẩm phù hợp với query $old_products = new WP_Query( $args ); if ( $old_products->have_posts() ) { foreach ( $old_products->posts as $product_id ) { // Xóa tất cả media đính kèm delete_all_attached_media( $product_id ); // Chuyển sản phẩm vào thùng rác hoặc xóa vĩnh viễn wp_delete_post( $product_id, true ); } } wp_reset_postdata(); // Reset lại dữ liệu sau khi query } // Chạy hàm để xóa sản phẩm cũ delete_old_products(); |
2.2. Hàm delete_all_attached_media
Hàm này được dùng để xóa tất cả các hình ảnh và tệp tin đính kèm với sản phẩm trước khi xóa sản phẩm.
1 2 3 4 5 6 7 8 9 | function delete_all_attached_media( $post_id ) { if ( get_post_type($post_id) == 'product' ) { // Chỉ xử lý với loại post là 'product' $attachments = get_attached_media( '', $post_id ); // Lấy tất cả media đính kèm với sản phẩm foreach ( $attachments as $attachment ) { wp_delete_attachment( $attachment->ID, true ); // Xóa toàn bộ media đính kèm } } } add_action( 'before_delete_post', 'delete_all_attached_media' ); // Kích hoạt khi xóa sản phẩm |
3. Chi tiết các bước hoạt động của đoạn code
Bước 1: Xác định các sản phẩm cũ
- Đầu tiên, hàm
delete_old_products()
sẽ tạo một query để lấy tất cả sản phẩm có ngày tạo trước 18/08/2024. - Query này chỉ lấy ID của các sản phẩm để tăng tốc độ xử lý.
Bước 2: Xóa các sản phẩm cũ
- Với mỗi ID sản phẩm lấy được, hàm sẽ:
- Xóa toàn bộ hình ảnh và file đính kèm của sản phẩm bằng cách sử dụng hàm
delete_all_attached_media()
. - Sau đó, sử dụng hàm
wp_delete_post()
để xóa sản phẩm khỏi cơ sở dữ liệu WooCommerce.
- Xóa toàn bộ hình ảnh và file đính kèm của sản phẩm bằng cách sử dụng hàm
Bước 3: Đảm bảo dữ liệu được reset
- Cuối cùng, sau khi hoàn thành quá trình xóa, hàm
wp_reset_postdata()
được gọi để đảm bảo không ảnh hưởng đến các query khác trong WordPress.
4. Tại sao nên sử dụng đoạn code này?
- Tiết kiệm thời gian: Thay vì phải thủ công kiểm tra và xóa từng sản phẩm cũ, bạn có thể tự động hóa quá trình này.
- Giải phóng dung lượng lưu trữ: Khi xóa các sản phẩm cũ và các hình ảnh đính kèm, bạn sẽ giải phóng được không gian lưu trữ trên máy chủ, giúp website hoạt động trơn tru hơn.
- Quản lý kho hàng hiệu quả: Đoạn code này giúp bạn duy trì kho sản phẩm gọn gàng, xóa bỏ những sản phẩm không còn sử dụng.
5. Cách áp dụng đoạn code
- Bạn có thể thêm đoạn code này vào file
functions.php
của theme đang sử dụng hoặc tạo thành một plugin riêng để quản lý việc xóa sản phẩm cũ. - Để chạy hàm này tự động theo chu kỳ (ví dụ mỗi tháng), bạn có thể sử dụng WordPress Cron Jobs để lên lịch tự động thực hiện.
6. Lưu ý khi sử dụng
- Xóa vĩnh viễn: Đoạn code sử dụng
wp_delete_post()
với tham sốtrue
, có nghĩa là các sản phẩm sẽ bị xóa vĩnh viễn, không vào thùng rác. Bạn nên sao lưu dữ liệu trước khi chạy. - Ngày sản phẩm cũ: Bạn có thể thay đổi ngày giới hạn trong
before => '2024-08-18'
thành bất kỳ ngày nào bạn muốn để tùy chỉnh việc xóa sản phẩm.
Lưu ý quan trọng trước khi sử dụng đoạn code
Trước khi thực hiện đoạn code xóa sản phẩm cũ trong WooCommerce, có một số bước quan trọng bạn cần thực hiện để đảm bảo an toàn và tránh mất dữ liệu:
6.1. Sao lưu dữ liệu toàn bộ website
- Sao lưu toàn bộ cơ sở dữ liệu: Đảm bảo bạn có một bản sao lưu đầy đủ của cơ sở dữ liệu WordPress, bao gồm tất cả sản phẩm, đơn hàng, và thông tin liên quan khác.
- Sao lưu thư mục media: Vì đoạn code sẽ xóa cả sản phẩm và hình ảnh đính kèm, hãy sao lưu thư mục
wp-content/uploads
nơi chứa tất cả các tệp tin media.Công cụ hỗ trợ sao lưu:- Sử dụng plugin sao lưu tự động như UpdraftPlus, Duplicator, hoặc All-in-One WP Migration để tạo bản sao lưu.
- Nếu bạn có quyền truy cập cPanel hoặc hosting, bạn cũng có thể tải xuống toàn bộ thư mục và cơ sở dữ liệu từ đó.
6.2. Kiểm tra kỹ sản phẩm cần xóa
- Xác định rõ thời điểm giới hạn xóa sản phẩm trong đoạn code. Thay đổi ngày trong đoạn
before => '2024-08-18'
sao cho phù hợp với nhu cầu thực tế của bạn. - Để chắc chắn, bạn có thể chạy thử một query kiểm tra các sản phẩm sẽ bị xóa mà không thực hiện xóa thực tế. Cách đơn giản là chỉ chạy query và in ra danh sách sản phẩm trước khi xóa.
Ví dụ:
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 | // Chỉ in danh sách các sản phẩm cũ ra màn hình mà không xóa function list_old_products() { $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'date_query' => array( array( 'before' => '2024-08-18', ), ), 'fields' => 'ids', ); $old_products = new WP_Query( $args ); if ( $old_products->have_posts() ) { foreach ( $old_products->posts as $product_id ) { echo 'Sản phẩm cũ ID: ' . $product_id . '<br>'; // Hiển thị danh sách ID sản phẩm } } wp_reset_postdata(); } list_old_products(); |
6.3. Kiểm tra môi trường thử nghiệm (staging)
- Test trên môi trường thử nghiệm: Trước khi áp dụng trực tiếp lên trang web chính, hãy chạy thử đoạn code trên môi trường thử nghiệm (staging) để đảm bảo mọi thứ hoạt động chính xác và không có lỗi xảy ra.
- Sao lưu môi trường thử nghiệm để dễ dàng khôi phục nếu cần.
6.4. Thay đổi tạm thời để kiểm tra kết quả trước khi xóa
- Trước khi xóa vĩnh viễn, có thể thay đổi đoạn
wp_delete_post( $product_id, true );
thànhwp_trash_post( $product_id );
để các sản phẩm bị chuyển vào thùng rác thay vì bị xóa hoàn toàn. Điều này cho phép bạn kiểm tra sản phẩm nào sẽ bị xóa và có thể khôi phục nếu cần.
1 | wp_trash_post( $product_id ); // Chuyển sản phẩm vào thùng rác thay vì xóa vĩnh viễn |
6.5. Lưu ý về thời gian chạy và tài nguyên
- Hạn chế thời gian chạy: Nếu bạn có một số lượng sản phẩm lớn cần xóa, đoạn code có thể gây ảnh hưởng đến hiệu suất của website. Hãy cân nhắc chạy đoạn code vào những thời điểm ít khách hàng truy cập hoặc chia thành từng đợt xóa để giảm tải cho máy chủ.
6.6. Theo dõi và kiểm tra sau khi xóa
- Sau khi chạy code xóa, hãy kiểm tra lại kho sản phẩm và đảm bảo rằng các sản phẩm cần xóa đã được xử lý chính xác.
- Kiểm tra xem hình ảnh và file đính kèm đã được xóa đúng cách, và không còn sản phẩm cũ nào tồn tại trên website.
7. Đoạn code hoàn chỉ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 | function delete_old_products() { // Define the query to get products before 18/08/2024 $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'date_query' => array( array( 'before' => '2024-08-18', ), ), 'fields' => 'ids', ); // Get all the products IDs matching the query $old_products = new WP_Query( $args ); if ( $old_products->have_posts() ) { foreach ( $old_products->posts as $product_id ) { // Delete attached media delete_all_attached_media( $product_id ); // Trash the product wp_delete_post( $product_id, true ); } } wp_reset_postdata(); } // Run the function to delete old products delete_old_products(); /* Xóa ảnh khi xóa sản phẩm */ function delete_all_attached_media( $post_id ) { if ( get_post_type($post_id) == 'product' ) { $attachments = get_attached_media( '', $post_id ); foreach ( $attachments as $attachment ) { wp_delete_attachment( $attachment->ID, true ); } } } add_action( 'before_delete_post', 'delete_all_attached_media' ); |
- Hướng dẫn chi tiết cách triển khai hệ thống tích điểm và đổi quà trên WordPress
- Sharecode cách code chống spam đơn hàng bằng OTP gmail vào WooCommerce
- Cách Code Chức Năng Trang Slider Hình Ảnh Pokemon Cực Xịn
- Cách tách Product Tabs trong WooCommerce thành các section riêng biệt
- Hướng Dẫn Tự Code Tạo Chức Năng “Vòng Quay May Mắn” WordPress