Làm thế nào để xóa hàng loạt tất cả người dùng không có bài viết?


8

Tôi có 10 nghìn người dùng khoảng 98% trong số những người dùng này chưa bao giờ xuất bản một bài đăng (ý tôi là bài đăng không phải bình luận).

Tôi cần một cách để xóa hàng loạt người dùng với 0 bài viết.

Phương pháp phải tính tất cả các bài đăng bao gồm các loại bài đăng tùy chỉnh và phải sử dụng chức năng WordPress thích hợp để xóa người dùng như thể chúng đã bị xóa thủ công trong bảng điều khiển và không chỉ thả bảng / hàng trên mysql, vì điều đó có thể gây ra kết quả không mong muốn.

một plugin cũ thực hiện điều này nhưng không xem xét tất cả các loại bài đăng nên không thực sự được sử dụng.

Bất kỳ trợ giúp đánh giá cao.


3
Bạn chỉ có thể sử dụng lại mã trong câu trả lời của tôi ở đây: wordpress.stackexchange.com/a/231485/24875
Christine Cooper

Câu trả lời:


8

Nếu bạn có một số lượng lớn người dùng cần xóa, bạn có thể sử dụng lệnh wp người dùng xóa wp-cli để tránh thời gian chờ tập lệnh.

Đây là một ví dụ về truy vấn SQL để xóa tất cả người dùng mà không có bài đăng thuộc bất kỳ loại và trạng thái nào .

Do đó, bạn có thể thử một lớp lót chưa được kiểm tra này :

wp user delete $(wp db query "SELECT ID FROM wp_users WHERE ID NOT IN (SELECT DISTINCT post_author FROM wp_posts ) AND ID NOT IN (1,2,3)" | tail -n +2 ) --reassign=1

hoặc ở dạng mở rộng:

wp user delete $(wp db query
    "SELECT ID  
         FROM wp_users   
         WHERE ID NOT IN (  
            SELECT DISTINCT post_author FROM wp_posts 
         ) AND ID NOT IN (1,2,3)" | tail -n +2 
  ) --reassign=1

Lưu ý rằng chúng tôi đã thêm một AND ID NOT IN (1,2,3)hạn chế bổ sung để đảm bảo những người dùng này không bị xóa (ví dụ: người dùng quản trị viên). Bạn sẽ phải điều chỉnh nó theo nhu cầu của bạn và cả tiền tố bảng wp_.

Khi tôi thử nghiệm ngắn gọn điều này cho một vài người dùng, tôi nhận thấy tôi phải thêm tail -n +2phần này để tránh 3 dòng trên cùng trong tiêu đề và viền bảng của wp db queryđầu ra.

Ở đây chúng tôi chỉ định lại tất cả các bài đăng cho người dùng 1, để tránh thông báo:

--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] 

Hy vọng bạn có thể điều chỉnh nó theo nhu cầu của mình, như thư giãn điều kiện xóa người dùng bằng cách thêm WHERE post_status = 'publish'.

Lưu ý: Hãy nhớ sao lưu trước khi thử nghiệm!


Tôi không hiểu Việc trấn an bài viết không nên xảy ra Tôi không muốn xóa người dùng chỉ đăng những người có 0 bài đăng, không nên trấn an.
Michael Rogers

1
Nó không ảnh hưởng đến ví dụ cụ thể này khi chúng tôi nhắm mục tiêu bất kỳ loại bài đăng và trạng thái. Điều này chỉ để tránh thông báo về lệnh xóa người dùng wp .. Bạn cũng có thể bỏ qua nó và nhấn Yhoặc sử dụng --yescho tất cả. Nếu bạn sửa đổi sql để chỉ xóa người dùng đã đăng bài viết, thì bạn có thể cần nó để tránh xóa ví dụ như bản nháp. Lưu ý rằng bạn đã đề cập trong câu hỏi mà người dùng chưa bao giờ xuất bản bài đăng .. Điều đó có nghĩa là họ có thể có bản nháp. Tôi cho rằng bạn không có ý nghĩ đó ;-) Xin hãy thật cụ thể trong câu hỏi bạn muốn xóa gì để tránh phỏng đoán. @MichaelRogers
birgire

4

Đây là một cách để làm điều đó trong PHP. Nó có thể chậm và / hoặc hết thời gian, nhưng vì đó là việc một lần, nên nó không quá quan trọng. Tạm thời đặt bên trong hàm.php của bạn hoặc tải lên dưới dạng plugin mới.

//* You don't want to run this on admin_init. Run it once and deactivate
add_action( 'admin_init', 'wpse_262100_admin_init' );
function wpse_262100_admin_init() {
  $reserved_post_types = [
    'attachment',
    'revision',
    'nav_menu_item',
    'custom_css',
    'customize_changeset',
  ];

  //* Get the non-reserved post types
  $post_types = array_diff( array_keys( get_post_types() ), $reserved_post_types );
  foreach( get_users() as $user ) {
    if( 0 == count_user_posts( $user->ID, $post_types ) ) {
      wp_delete_user( $user->ID );
    }
  }
}

1

Đánh giá theo mã nguồn của plugin cũ mà bạn đã đề cập, các loại bài đăng mà nó không xem xét là tệp đính kèmsửa đổi . Tôi nghĩ bạn có thể dễ dàng sửa lỗi này bằng cách xóa mã này khỏi mã nguồn của tệp plugin no-post-user-xóa.php

    AND NOT WP.post_type in ('attachment', 'revision')

Lấy làm tiếc! Tôi có nghĩa là các loại bài tùy chỉnh. Tác giả đã viết trên các diễn đàn hỗ trợ, nó không tính các loại bài đăng tùy chỉnh chỉ "bài đăng" vì vậy nó sẽ xóa người dùng đã tạo bài đăng tùy chỉnh và điều đó không tốt.
Michael Rogers

@MichaelRogers Tôi không nghĩ rằng anh ấy có nghĩa như vậy. Như tôi đã nói các loại duy nhất không được tính là hai loại tôi đã viết. Vì vậy, các plugin nên ảnh hưởng đến các loại bài tùy chỉnh. Chúng được lưu trữ trong cùng một bảng cơ sở dữ liệu. Tôi khuyên bạn nên sao lưu và sau đó thử plugin và xem nó có hoạt động như bạn muốn không. Nếu không, khôi phục lại bản sao lưu.
Nikolay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.