Inaktive Benutzer nach 2 Monaten automatisch löschen

8

Ich versuche diese Funktion zu ändern :

// 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' );

stattdessen anders arbeiten - ich möchte, dass Benutzer, die seit beispielsweise 2 Monaten nicht mehr aktiv waren, automatisch gelöscht werden. Ich habe ein Plugin, das die Benutzeraktivität verfolgt und die Daten in wp_usermeta speichert. Beispiel:

user_id = 2; meta_key = wp_wp_kc_last_active_time; meta_value = 1422796627

Dies ist die Abfrage, die ich mir ausgedacht habe:

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

Es werden jedoch nicht die richtigen IDs ausgewählt. Was muss ich ändern, damit es funktioniert?

Pereyra
quelle

Antworten:

2

Ihre Abfrage ist falsch, weil Ihr drittes Argument für TIMESTAMPDIFF falsch ist.

Sie sollten meta_value anstelle von SELECT meta_value verwenden.

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

Versuchen Sie das und prüfen Sie, ob die Ergebnisse korrekt aussehen.

Ich habe gerade die mySQL Date Function Docs überprüft und Sie scheinen dies falsch zu machen.

Versuchen Sie stattdessen Folgendes:

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

Oder vielleicht...

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 );

Welches sollte die richtigen Benutzer sammeln. Wenn nicht, versuchen Sie es ohne die datierte Anweisung und prüfen Sie, ob etwas zurückgegeben wird. Wenn nicht, stimmt etwas mit dem meta_key nicht (z. B. ist es wirklich wp_wp _... oder nur wp_kc _...)

Freibeuter
quelle
Nein, diesmal kein Syntaxfehler, aber: "MySQL hat eine leere Ergebnismenge zurückgegeben (dh keine Zeilen)", und es gibt definitiv Benutzer, die die Site seit mehr als 2 Monaten nicht mehr besucht haben.
Pereyra
Probieren Sie die neue Abfrage aus, die ich hinzugefügt habe. Ich glaube, Ihre Anfrage macht nicht das, was Sie denken.
Privateer
Leider wird immer noch "MySQL hat eine leere Ergebnismenge (dh null Zeilen) zurückgegeben" angezeigt.
Pereyra
Es wurde eine weitere Methode mit einem Hinweis hinzugefügt, um auch Ihren Meta-Schlüsselwert zu überprüfen. Es scheint seltsam, wp_wp_kc_ * als Metaschlüssel zu haben.
Privateer
Der Meta-Schlüsselwert ist korrekt. Das scheint zu funktionieren, danke! SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_wp_kc_last_active_time' UND DATEDIFF (NOW (), FROM_UNIXTIME (meta_value))> 60;
Pereyra