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
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}'
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)}'
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
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.
ADMINUSER=2
PAGES=$(wp user list --role=customer --allow-root | wc -l | awk '{print $1/100}' | awk '{print int($1+0.99)}')
for i in $(seq 1 $PAGES); do
echo "Processing page ${i} of ${PAGES}" 1>&2
wp wc customer list --fields=id,orders_count --user=${ADMINUSER} --page=${i} --allow-root | awk '$2 == "0" {print $1}'
done > /tmp/user-ids.txt
Cho chạy bash script
chmod a+x check_user.sh
./check_user.sh
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
Nhập vào nội dung sau
ADMINUSER=2
USERCOUNT=$(cat /tmp/user-ids.txt | wc -l)
COUNT=1
while read -r USER
do
echo "Deleting ${USER} ${COUNT} of ${USERCOUNT}"
wp wc customer delete ${USER} --user=${ADMINUSER} --force=true --allow-root
((COUNT++))
done < /tmp/user-ids.txt
Cho chạy bash script để xóa tài khoản spam user
chmod a+x delete_user.sh
./delete_user.sh
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
Số lượng giờ đã giảm xuống chỉ còn 2527
. Database giờ đã đã gọn nhẹ hơn hẳn.
Nhớ chia sẻ bài viết cho bạn bè nếu các bạn thấy bài viết này hữu ích cho mọi người nhé!
Nguồn : thuanbui.me