Chuyên mục
Wordpress

[WordPress] Xóa tất cả tài khoản spam user khỏi hệ thống

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 -lCode 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.shCode 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.txtCode language: Bash (bash)

Cho chạy bash script

chmod a+x check_user.sh
./check_user.shCode 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.shCode 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.txtCode language: Bash (bash)

Cho chạy bash script để xóa tài khoản spam user

chmod a+x delete_user.sh
./delete_user.shCode 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 -lCode language: PHP (php)

Số lượng giờ đã giảm xuống chỉ còn 2527. Database giờ đã đã gọn nhẹ hơn hẳn.

Tham khảo: https://guides.wp-bullet.com/batch-deleting-woocommerce-customers-with-no-orders-or-money-spent-with-wp-cli/

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

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 mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *