問題描述

我有一萬個用户,大約 98%的用户從未發表過一篇文章 (我的意思是發表評論) 。

我需要一種方法來大量刪除 0 個帖子的用户。

該方法必須對包含自定義帖子類型的所有帖子進行計數,並且必須使用正確的 WordPress 功能來刪除用户,就像在儀錶板中手動刪除一樣,而不僅僅是在 mysql 上放置一個表/行,因為這可能會導致意外的結果。

an old plugin 這樣做,但不考慮所有的帖子類型,所以不能真正使用。

任何幫助讚賞。

最佳解決方案

如果您有大量用户要刪除,可以使用 wp user delete wp-cli 命令來避免腳本超時。

Here’s 是一個 SQL 查詢的示例,可以刪除所有沒有任何類型和狀態的帖子的用户。

因此,您可以嘗試此未經測試的 one-liner:

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

或擴展形式:

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

請注意,我們添加了一個額外的 AND ID NOT IN (1,2,3)限制,以確保這些用户不被刪除 (例如管理員用户) 。您將不得不根據自己的需要進行調整,並將表前綴 wp_

當我簡單地測試了幾個用户,我注意到我不得不添加 tail -n +2 部分,以避免頭三個行和 wp db query 輸出的表邊界。

在這裏,我們將所有帖子重新分配給用户 1,以避免通知:

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

希望您可以進一步調整您的需求,如通過添加 WHERE post_status = 'publish'放寬用户刪除條件。

注意:記住在測試之前進行備份!

次佳解決方案

這是 PHP 的一種方法。它可能是緩慢的和/或超時的,但是由於它是一個 one-time 的事情,這不應該太重要。臨時放置在你的 functions.php 裏面或作為一個新的插件上傳。

//* 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 );
    }
  }
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。