我需要一些帮助,因为我找不到任何解决问题的方法,也没有自己解决问题的知识。
我想做的是:我想深入研究每一个超过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小时来调用函数,但现在这并不重要。
非常感谢您的帮助。
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个月已满?)