Xoá toàn bộ bài viết theo id user trong WordPress

Vừa rồi mình vừa xử lý 1 website của khách bị hack và chèn hơn 13k bài viết vài phần post, mình thử tăng giới hạn hiển thị và xoá tầm 100 bài 1 lúc ở wp-admin (wp dashboard) bằng cách cài đặt auto IT để xoá thì liên tục bị timeout do hosting dỏm, dù đã tăng limit lên cao nhất, hạ xuống xoá mỗi 50 bài 1 lúc thì vẫn bị Request Timeout nên mình quyết định xoá bằng câu lệnh SQL trong phpMyAdmin

13k bai viet

Xoá toàn bộ bài viết theo id user trong WordPress

Trước khi thực hiện các thao tác trong cơ sở dữ liệu bạn nên sao lưu dữ liệu lại để đề phòng các trường hợp xấu nhất xảy ra.

Để xoá toàn bộ bài viết bằng câu lệnh SQL theo tên người dùng bạn có thể vào phpMyAdmin và chạy câu lệnh như sau.

1. Xác định ID của người dùng đã đăng bài viết bằng câu lệnh sau, trong ví dụ này nhidnll là user của người dùng

SELECT ID FROM wp_users WHERE user_login = 'nhidnll';

Sau khi chay câu lệnh này bạn sẽ nhìn thấy ngay ID của người dùng này là 13

2. Câu lệnh SQL để xoá toàn bộ bài viết post trong WordPress

DELETE FROM wp_posts WHERE post_author = 13;
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);

3. Xoá các bài viết bạn vừa xoá ở thùng rác

DELETE FROM wp_posts WHERE post_author = 13 AND post_status = 'trash';

Sau khi xoá theo các câu lệnh ở trên thì trong phần post chỉ còn 80 bài viết, giờ có thể xoá thủ công 1 số bài viết thuộc user khác là xong.

sau khi xoa bai viet

Vậy là giải quyết xong 1 case đơn giản về việc xoá toàn bộ bài viết trong WordPress bằng câu lệnh sql giúp tiết kiệm rất nhiều thời gian.

Ngoài ra nếu bạn gặp trường hợp bị tạo spam category như trường hợp mình gặp có thể sử dụng code PHP phía dưới để xoá toàn bộ chuyên mục do người dùng có id 13 đi là xong.

xoá toàn bộ spam category

$categories = get_categories(array('hide_empty' => false, 'author' => 13));

foreach ($categories as $category) {
    wp_delete_category($category->term_id);
}

hoặc bạn cũng có thể sử dụng SQL để xử lý để tránh bị timeout

DELETE FROM wp_terms WHERE term_id IN (
    SELECT term_id FROM wp_term_taxonomy WHERE taxonomy = 'category' AND term_id IN (
        SELECT term_taxonomy_id FROM wp_term_relationships WHERE object_id IN (
            SELECT ID FROM wp_posts WHERE post_author = 13
        )
    )
);

Have fun!