如何通过phpmyadmin SQL删除没有订单历史的用户?

时间:2019-10-22 作者:fraudjeff

我有一个wordpress电子商务网站,在一年多没有接触它之后,我开始更新它。我所做的第一件事是在所有查询和联系表单中实施reCaptcha,以减少发送到我的企业收件箱的垃圾邮件数量。我还让它用于登录和用户帐户创建,希望减少在我的网站上注册的机器人用户帐户的数量。

我想我现在有一个很好的位置来处理这次清理的用户方面,我的数据库中大约有14000个。在这些用户中,可能只有大约100-200人在我的电子商务网站上实际下单。我一直在寻找一种删除没有订单历史记录的用户的方法,我发现了以下帖子:https://wordpress.org/support/topic/how-do-i-delete-customers-with-no-orders/

在phpmyadmin下,我已经导航到SQL选项卡来运行查询,但没有成功使用上面链接提供的代码。下面是选择wp\\U tom2users数据库时我的SQL窗口的屏幕截图。https://ibb.co/8488Zyk

如果我尝试点击更新,不做任何更改,我会得到这个https://ibb.co/LrJcBmF如果我尝试将下面的代码粘贴到文本框中并点击update,情况也是如此。

SELECT * from wp_tom2users where wp_tom2users.ID not in (
    SELECT meta_value FROM wp_tom2postmeta WHERE meta_key = \'_customer_user\'
) AND wp_tom2users.ID not in (
    select distinct(post_author) from wp_tom2posts
)
我希望有人能帮我做这件事,因为我更愿意保留订单历史记录,而不是批量删除所有用户。我还想提及的是,我有三个拥有管理员权限的用户,我也想阻止他们删除。

感谢您抽出时间阅读我在本期中输入的文章。

编辑:再次查看上面提供的链接中的代码,并查看表索引后https://ibb.co/tHxpMCN 我认为我不能按“\\u customer\\u user”排序,因为它不是wp\\u tom2postmeta中的索引。

2 个回复
SO网友:Chad Reitsma

Hector的答案很好,但如果您有大量用户需要删除(在我的情况下,有13000多个垃圾邮件注册),我发现使用这个小实用程序脚本非常有效,并且不需要您手动检查和删除管理面板中的用户列表。

脚本可能仍会超时,因此,如果要清除大量用户,请密切关注它。

cleanusers.php

//Load WP functions and DB access
include(\'wp-load.php\');

//required for wp_user_delete
require_once( ABSPATH.\'wp-admin/includes/user.php\' );

//Let it run forever
set_time_limit(0);

//Get the $wpdb database object
global $wpdb;


//Loop through all users
foreach($wpdb->get_results(\'SELECT ID from \'.$wpdb->prefix.\'users ORDER BY ID DESC\') as $user) {


    //Get user object
    $user = get_user_by(\'ID\', $user->ID);

    //Check if this user\'s role (customer, subscriber, author, etc.)
    $roles = $user->roles;
    if ($roles[0] == "customer") {

        //Check the order count and delete if it is 0
        $order_count = wc_get_customer_order_count( $user->ID);
        if ($order_count === 0) wp_delete_user($user->ID);

    }

}

echo "DONE!";
将上述文件放在安装文件夹中,然后通过浏览器访问或通过命令行运行。

干杯,C。

SO网友:Hector

欢迎

Short Answer about SQL queries:

您在第一个图像中的查询不正确。应该是这样的SELECT * FROM wp_tom2users 它将选择表中的所有内容。如果它不工作,您可能需要向其中添加数据库名称,如SELECT * FROM myDbName.wp_tom2users.

上面提到的查询看起来很好,但可以通过添加如上所述的数据库名称来尝试。

Detailed answer to visualize the process:

由于您希望根据用户的订单删除某些用户,因此最好使用WordPress和WooCommerce中的现有函数,而不是使用直接SQL代码。

在WooCommerce中,有一个统计用户订单的功能。wc_get_customer_order_count 基于documentation 您需要将用户ID传递给此函数,它将返回订单数。

$oreder_count = wc_get_customer_order_count( $user_id );
因此,如果您为用户运行一个循环并计算他们的订单,您可以找到应该删除哪些用户。

以下代码可以在“管理”->“用户”中显示每个用户的订单计数,作为可排序列。

add_filter( \'manage_users_columns\', \'prefix5487_modify_user_columns\' );

function prefix5487_modify_user_columns( $column ) {
    $column[\'orders\'] = __( \'Order count\' );
    return $column;
}


add_filter( \'manage_users_custom_column\', \'prefix5487_user_order_column_value\', 10, 3 );

function prefix5487_user_order_column_value( $val, $column_name, $user_id ) {
    switch ($column_name) {
        case \'orders\' :
            return wc_get_customer_order_count( $user_id );
        default:
    }
    return $val;
}


add_filter( \'manage_users_sortable_columns\', \'prefix5487_make_registered_column_sortable\' );

function prefix5487_make_registered_column_sortable( $columns ) {
    return wp_parse_args( array( \'orders\' => \'orders\' ), $columns );
}
现在,您可以根据订单数量对用户进行排序,并使用批量操作删除用户,确保您没有删除管理员用户。