Автоматически удалять неактивных пользователей через 2 месяца

8

Я пытаюсь изменить эту функцию :

// automatically delete users after 7 days in wordpress
function wcs_auto_delete_users() {
global $wpdb;
$query = $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE datediff( now(), user_registered ) > 7" );
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(), 'daily', 'wcs_daily_clean_database' );

вместо этого работать по-другому - я хочу, чтобы он автоматически удалял пользователей, которые не были активны, скажем, в течение 2 месяцев. У меня есть плагин, который отслеживает активность пользователя и сохраняет данные в wp_usermeta. Пример:

user_id = 2; meta_key = wp_wp_kc_last_active_time; meta_value = 1422796627

Это запрос, который я придумал:

SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_wp_kc_last_active_time' AND TIMESTAMPDIFF( second, now(), TIMESTAMP(SELECT meta_value) ) > 5184000

Но это не выбор правильных идентификаторов. Что я должен изменить, чтобы это работало?

Перейра
источник

Ответы:

2

Ваш запрос неверен, потому что ваш третий аргумент TIMESTAMPDIFF неверен.

Вы должны использовать meta_value вместо SELECT meta_value.

SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_wp_kc_last_active_time' AND TIMESTAMPDIFF( second, now(), TIMESTAMP(meta_value) ) > 5184000;

Попробуйте и посмотрите, если результаты начнут выглядеть правильно.

Я только что проверил документы функции даты MySQL, и вы, кажется, делаете это неправильно.

Вместо этого попробуйте следующее:

SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_wp_kc_last_active_time' AND TIMESTAMPDIFF( MONTH, NOW(), FROM_UNIXTIME(meta_value) ) > 2;

Или, может быть...

global $wpdb;

$query = <<<SQL
 SELECT user_id 
 FROM {$wpdb->usermeta} 
 WHERE 
    meta_key = 'wp_wp_kc_last_active_time'
    AND DATEDIFF( NOW(), FROM_UNIXTIME( meta_value ) ) > 60
SQL;

$query = $wpdb->prepare( $query );

Который должен собрать нужных пользователей. Если нет, попробуйте это без оператора datediff и посмотрите, возвращено ли что-нибудь. Если нет, то что-то не так с meta_key (например, действительно ли это wp_wp _... или просто wp_kc _...)

капер
источник
Нет, на этот раз нет синтаксической ошибки, но: «MySQL вернул пустой набор результатов (т. Е. Ноль строк)», и определенно есть пользователи, которые не посещали сайт более 2 месяцев.
перейра
Попробуйте новый запрос, который я добавил. Я считаю, что ваш запрос не делает то, что вы думаете, что он делает.
Капер
К сожалению, все еще получаю "MySQL возвратил пустой набор результатов (то есть ноль строк)".
перейра
Добавлен еще один метод с примечанием для проверки значения мета-ключа. Кажется странным иметь wp_wp_kc_ * в качестве мета-ключа.
Капер
Значение мета-ключа верное. Кажется, это работает, спасибо! ВЫБЕРИТЕ user_id FROM wp_usermeta WHERE meta_key = 'wp_wp_kc_last_active_time' AND DATEDIFF (NOW (), FROM_UNIXTIME (meta_value))> 60;
перейра