# Remove Expired Login Sessions From the Database

> Once a day, removes expired login sessions that WordPress keeps in user meta until the user logs in again, which on membership sites and shops adds up to a lot of dead data.

- Type: PHP
- Runs: Run everywhere
- Category: [Performance](https://wpide.com/library/category/performance/)
- Tags: sessions, database, cron
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/perf-purge-expired-sessions/

## Code

```php
add_action( 'init', function () {
    if ( ! wp_next_scheduled( 'wpide_purge_sessions' ) ) {
        wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'wpide_purge_sessions' );
    }
} );

add_action( 'wpide_purge_sessions', function () {
    global $wpdb;

    $rows = $wpdb->get_results( "SELECT user_id, meta_value FROM {$wpdb->usermeta} WHERE meta_key = 'session_tokens' LIMIT 500" );

    foreach ( $rows as $row ) {
        $sessions = maybe_unserialize( $row->meta_value );

        if ( ! is_array( $sessions ) ) {
            continue;
        }

        $active = array_filter( $sessions, function ( $session ) {
            return isset( $session['expiration'] ) && $session['expiration'] >= time();
        } );

        if ( count( $active ) === count( $sessions ) ) {
            continue;
        }

        if ( $active ) {
            update_user_meta( (int) $row->user_id, 'session_tokens', $active );
        } else {
            delete_user_meta( (int) $row->user_id, 'session_tokens' );
        }
    }
} );
```

## Notes

Processes up to 500 users per run; active sessions are never touched.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Remove Expired Login Sessions From the Database" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
