問題描述

我有一萬個使用者,大約 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。