私はこれらのユーザーの98%が1度も投稿を公開していないユーザーを1万人持っています(私は投稿がコメントではないことを意味します)。
私は0の投稿を持つユーザを一括削除する方法が必要です。
このメソッドはカスタム投稿タイプを含むすべての投稿をカウントしなければならず、ユーザーがダッシュボードで手動で削除されたように適切なWordPress関数を使用しなければなりません。
古いプラグインがあります これはすべての投稿タイプを考慮していないので、実際には使用できません。
任意の助けをいただければ幸いです。
削除するユーザー数が多い場合は、 wp user deletewp-cli コマンドを使用してスクリプトのタイムアウトを回避することをお勧めします。
これは すべてのユーザーを削除するためのSQLクエリの例 タイプやステータスの投稿なし です。
したがってこれを試すことができます 未試験 ワンライナー:
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)
の制限を追加したことに注意してください(例:adminユーザー)。あなたはそれをあなたの必要性そしてまたテーブルプレフィックスwp_
に適応させる必要があるでしょう。
2人のユーザーに対してこれを簡単にテストしたところ、ヘッダーの上位3行と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でそれを行う方法です。遅くなったりタイムアウトしたりするかもしれませんが、それは一度限りのことなので、それほど問題にはなりません。 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 );
}
}
}
あなたが言及した古いプラグインのソースコードから判断すると、それが考慮しない投稿タイプは attachment と revision です。私はあなたがプラグインファイルno-posts-user-delete.phpのソースコードからこれを取り除くことによってこれを簡単に直せると思う。
AND NOT WP.post_type in ('attachment', 'revision')