Website bán hàng của mình sau nhiều năm hoạt động đã bị dính rất nhiều các tài khoản ảo do spam bot đăng ký tự động. Số lượng spam user hiện đã tăng lên vài ngàn, vừa làm ảnh hưởng đến hiệu năng hoạt động, vừa làm lãng phí tiền khi mỗi khi gửi email quảng cáo cho toàn bộ khách hàng.
Đặc điểm chung của tất cả các tài khoản spam user là đều không có đơn hàng nào trên web, do đó mình sẽ xóa tất cả các user nào chưa từng mua hàng.
Để xóa tất cả các tài khoản spam user này ra khỏi hệ thống, có thể sử dụng 2 cách sau: plugin Bulk Delete hoặc wp-cli.
Lưu ý: bạn cần backup database trước khi thực hiện, đề phòng bất trắc làm sai gì đó thì có thể cứu vãn được!
1. Sử dụng plugin Bulk Delete
Cài đặt plugin Bulk Delete vào website, sau đó truy cập vào mục Bulk WP -> Bulk Delete Users.
Trong phần By User Meta:
- Meta field: chọn
_order_count
- Chọn Equals to
- Nhập vào 0.
Sau đó bấm Bulk Delete để xác nhận xóa.
Thời gian xử lý sẽ tùy thuộc vào số lượng spam user đang có trên hệ thống. Nếu số lượng spam user quá nhiều, bạn sẽ bị lỗi 500 Connection Time Out. Lúc này cần phải quay lại để thực hiện lại để xóa tiếp các spam user còn lại.
2. Sử dụng WP-CLI
Nếu số lượng spam user lên đến vài ngàn, cách tốt hơn là sử dụng wp-cli, thao tác bằng dòng lệnh.
Kiểm tra số lượng user đang có trong hệ thống
wp user list --role=customer --allow-root | wc -l
Code language: Shell Session (shell)
Kết quả trả về: 6480
Để kiểm tra số lượng user chưa có bất kỳ đơn hàng nào trên web, mình dùng lệnh sau
wp wc customer list --fields=id,orders_count --user=2 --allow-root | awk '$2 == "0" {print $1}'
Code language: Shell Session (shell)
Chú ý: bạn cần thay thế --user=2
thành user id tương ứng của tài khoản admin trên web. Ví dụ: --user=1
hay --user=222
Kết quả sẽ trả về danh sách id của các spam user chưa từng đặt hàng trên web. Tuy nhiên, kết quả này chỉ bị giới hạn trong 100 user đầu tiên, vì khi truy cập thông qua REST API, mỗi lần truy cập chỉ hiện ra 100 kết quả đầu tiên.
Kiểm tra xem có bao nhiêu trang (mỗi trang 100 kết quả) khi liệt kê danh sách toàn bộ tài khoản trong hệ thống
wp user list --role=customer --allow-root | wc -l | awk '{print $1/100}' | awk '{print int($1+0.99)}'
Code language: Nginx (nginx)
Kết quả trả về: 65
, nghĩa là có 65 trang cần phải xử lý, tương ứng với số lượng 6480 đã kiểm tra ở trên.
Mình sẽ tạo 1 bash script để lưu id tất cả các tài khoản không có đơn hàng vào 1 file txt, sau đó sẽ xóa tất cả các id nằm trong file này.
Tạo bash script
nano check_user.sh
Code language: CSS (css)
Nhập vào nội dung sau:
Bạn cần thay đổi ADMINUSER=2
thành id tương ứng của tài khoản admin.
# define ADMIN user to use the REST API for WooCommerce via WP-CLI
ADMINUSER=2
# calculate number of pages and round up https://stackoverflow.com/questions/13182070/best-way-to-divide-in-bash-using-pipes
PAGES=$(wp user list --role=customer --allow-root | wc -l | awk '{print $1/100}' | awk '{print int($1+0.99)}')
# create the list of users and loop through each page
for i in $(seq 1 $PAGES); do
# redirect stdout to stderr so the text doesn't show up in our text file
echo "Processing page ${i} of ${PAGES}" 1>&2
# get the user ID and the number of orders per user, only show IDs that have 0 as order count with awk https://stackoverflow.com/questions/14739057/awk-print-column-3-if-2-a-specific-value
wp wc customer list --fields=id,orders_count --user=${ADMINUSER} --page=${i} --allow-root | awk '$2 == "0" {print $1}'
done > /tmp/user-ids.txt
Code language: Bash (bash)
Cho chạy bash script
chmod a+x check_user.sh
./check_user.sh
Code language: Shell Session (shell)
User ID của tất cả spam user chưa có đơn hàng trên web sẽ được lưu vào /tmp/user-ids.txt
Tạo thêm 1 file bash script khác để xóa tài khoản
nano delete_user.sh
Code language: CSS (css)
Nhập vào nội dung sau
# delete found users
ADMINUSER=2
USERCOUNT=$(cat /tmp/user-ids.txt | wc -l)
COUNT=1
while read -r USER
do
echo "Deleting ${USER} ${COUNT} of ${USERCOUNT}"
# delete customer
wp wc customer delete ${USER} --user=${ADMINUSER} --force=true --allow-root
# increment the COUNT
((COUNT++))
done < /tmp/user-ids.txt
Code language: Bash (bash)
Cho chạy bash script để xóa tài khoản spam user
chmod a+x delete_user.sh
./delete_user.sh
Code language: Shell Session (shell)
Thời gian thực thi của cả 2 script này sẽ từ vài chục phút đến vài tiếng tùy thuộc vào số lượng tài khoản đang có trên web.
Sau khi hoàn thành, kiểm tra lại số tài khoản trên web
wp user list --role=customer --allow-root | wc -l
Code language: PHP (php)
Số lượng giờ đã giảm xuống chỉ còn 2527
. Database giờ đã đã gọn nhẹ hơn hẳn.
[convertkit form=7087807]
Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!