自动删除用户(AUTO_DELETE_USERS)

时间:2022-03-04 作者:Still Ready

我需要一些帮助,因为我找不到任何解决问题的方法,也没有自己解决问题的知识。

我想做的是:我想深入研究每一个超过X天的WordPress用户(订阅者)。出于测试目的,我需要短时间间隔,在生产中,用户应在6个月后删除。因此,每个用户都应该在注册6个月后删除。

我为测试目的所做的尝试:

function wcs_auto_delete_users() {
    global $wpdb;
    $query = $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE datediff( now(), user_registered ) > 0.1" );
    if ( $oldUsers = $wpdb->get_results( $query, ARRAY_N ) ) {
        foreach ( $oldUsers as $user_id ) {
            wp_delete_user( $user_id[0] );
        }
    }
}
add_action( \'wcs_daily_clean_database\', \'wcs_auto_delete_users\' );
wp_schedule_event( time(), \'hourly\', \'wcs_daily_clean_database\' );
上面的代码段可以工作,但它会删除每个用户,这是我不想要的。

这就是我为了测试目的而进一步尝试的:

function auto_delete_users() {
    global $wpdb;
    $userlevel = 0; //0 = subscriber
    $deleteafter = (1/48); //delete User after 30 mins

    $query = $wpdb->prepare("SELECT $wpdb->users.ID FROM $wpdb->users LEFT JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id WHERE $wpdb->usermeta.meta_key = %s AND $wpdb->usermeta.meta_value = %d AND DATEDIFF(CURDATE(), $wpdb->users.user_registered) > %d", $wpdb->prefix.\'user_level\',$userlevel,$deleteafter);

    if($oldUsers = $wpdb->get_results($query, ARRAY_N)){
        foreach ($oldUsers as $user_id) {
            wp_delete_user($user_id[0]);
        }
    }
}
add_action(\'daily_clean_database\', \'auto_delete_users\');
wp_schedule_event(time(), \'hourly\', \'daily_clean_database\');
上面的片段不起作用,也许你可以解释我做错了什么,或者我需要调整什么。

我还尝试将活动安排为;cron\\u时间表;每15分钟一次,以避免等待1小时来调用函数,但现在这并不重要。

非常感谢您的帮助。

1 个回复
SO网友:Tom J Nowell

您不需要使用原始SQL,WordPress已经提供了WP_User_Query, 甚至还提供了基于日期的查询示例,例如,官方文档称这将检索过去12小时内注册的所有用户:

$args = array(
    \'date_query\' => array( 
        array( \'after\' => \'12 hours ago\', \'inclusive\' => true )  
    )
);
$user_query = new WP_User_Query( $args );
摘自:https://developer.wordpress.org/reference/classes/wp_user_query/#date-parameters

这表明这可能有效:

$args = [
    \'date_query\' => [
        [
            \'before\' => \'6 months ago\',
            \'inclusive\' => true
        ]
    ]
];
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->get_results() ) ) {
    foreach ( $user_query->get_results() as $user ) {
        echo \'<p>delete: \' . $user->display_name . \'</p>\';
    }
} else {
    echo \'No users found.\';
}
如果您需要使用原始SQL在WordPress中获取某些内容,而您没有使用自定义表,那么这通常意味着您做了一些错误的事情,或者没有意识到重要的核心API或参数。

其他需要注意的事项:

如果你的网站很受欢迎,这将无法扩展,因为你的查询获取的用户数量没有限制,你应该更频繁地分批运行,除非你的主机有系统级cron作业,否则这不会每6个月发生一次,根据网站的繁忙程度,可能会有一些变化。法律和监管义务可能需要6个月以上,例如,如果这里的目标是阻止订阅后的访问,那么这不是最好的方式(没有追加订阅?或消息称6个月已满?)