私は70Kのスパム加入者がいるサイトを持っています、そして私はそれらのどれも必要としません。だから私はadminと/またはphpmyadminでクエリを使用してwp_usersからwp_usersとwp_usermetaから各ユーザーの関連メタからすべての購読者を削除する必要があります。
しかし、サーバーがクラッシュしないようにするには、どうすれば一度に数千個を削除できますか?
これは私が必要とする基本的な質問のようです。
DELETE
FROM wp_users
INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE meta_key = 'wp_capabilities'
AND meta_value LIKE '%subscriber%
//except how do I select a few thousand at a time?
しかし、どのように私は一度に数千を選ぶのですか?
このようなことをするための私のお気に入りの方法はデータベースハッキング(私はいつも副作用があるのではないかと心配している)経由ではなく、コマンドラインツール経由です。
たとえば、機能的な WP CLIインストール を指定すると、次のように簡単に実行できます。
wp user delete $(wp user list --role=subscriber --field=ID --number=10) --reassign=1
reassign
パラメータは、コンテンツの再割り当て先となるユーザーのユーザーIDです。 WP_User_Query がサポートしているので、 それはあまり文書化されていません _であっても "--number"(制限)を使うことができます。
そこにあなたはそれを持っています - このような操作をするためのきれいな、一行のコマンドラインユーティリティ。
この場合、最初に "wp user list .."という副照会を試して、どのユーザーを削除するのかを確認することをお勧めします。ワンライナーを実行すると、次のような情報が表示されます。
... Success: Removed user 123 from https://example.com/. Success: Removed user 124 from https://example.com/. ...
私は同様の問題を抱えていて、この質問を読んだ後に私はこのプラグインを作りました(あなたの質問に適応しました)。
一度インストールすると、 adminメニュー under Users called Bulk User Delete になります。あなたのSQLクエリあたり(私の元のクエリは少し異なっていた)。
あなたはバッチをより小さくまたはより大きくすることができます、しかしこれはあなたがサーバーのタイムアウトなしで多くのユーザーを削除することを可能にします、それはたくさんのスパムサインアップのために数分かかるかもしれません。
それは各バッチが処理された後にページをリロードするためにjqueryを使用します(これは私が推測するajaxで行うことができますが、私はすぐに何かが必要です)。
たぶん他の誰かがこれが役に立つと思うでしょう、あなたはたぶんあなたの状況にSQLクエリを適応させる必要があるでしょう。
<?php
/*
Plugin Name: Bulk Delete Spam Users
Description: Delete the spam sign ups
Version: 0.1
Author: Steven
Text Domain: bulk-delete-spam-users
*/
add_action('admin_menu', 'my_users_menu');
function my_users_menu() {
add_users_page('Bulk User Delete', 'Bulk User Delete', 'read', 'bulk-user-delete', 'active_users_nodel');
}
function active_users_nodel() {
global $wpdb;
$result = array();
$result = $wpdb->get_results('
SELECT wp_users.id, wp_users.user_login FROM wp_users
INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE meta_key = "wp_capabilities"
AND meta_value LIKE "%subscriber%"
');
$users = $result;
$i = 0;
echo '<div class="bud-box">';
$users_remain = $users ? 'true' : 'false';
$current_user = wp_get_current_user();
echo '<strong>Orphaned content will be reassigned to:</strong><br />';
echo 'Username: ' . $current_user->user_login . '<br />';
echo 'User ID: ' . $current_user->ID . '<br />';
<h3>currently deleting...</h3>
foreach($users as $user) {
$i++;
if($i < 20) {
wp_delete_user( $user->ID, $current_user->ID );
var_dump($user->user_login);
}
}
echo '</div>';
?>
<script>
(function($){
$(document).ready(function(){
var uremain = <?php echo $users_remain; ?>;
if( uremain == true){
location.reload();
}
});
})(jQuery);
</script>
<?php } ?>
これにはWp関数を使うことができます。 wp_delete_user();この機能はユーザーIDで機能します。この方法ですべての購読者のユーザーIDを取得することができます。
$get_subscribers = get_users('role=subscriber');
foreach($get_subscribers as $user){
wp_delete_user($user->ID);
}