web-dev-qa-db-ja.com

2か月後に非アクティブユーザーを自動的に削除する

私はこの function を修正しようとしています。

// 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

しかし、それは正しいIDを選択していません。それを機能させるために私は何を変えるべきですか?

8
pereyra

TIMESTAMPDIFFへの3番目の引数が正しくないため、クエリは間違っています。

SELECT meta_valueではなく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 Date Function Docs をチェックしたところ、あなたはこれを間違ってやっているようです。

代わりに次のことを試してください。

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に問題があります。

2
Privateer