query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}smsportal_messages WHERE created_at < %s LIMIT %d", $cutoff, self::BATCH ) ); } ); self::in_batches( static function () use ( $wpdb, $cutoff ) { return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}smsportal_replies WHERE received_at < %s LIMIT %d", $cutoff, self::BATCH ) ); } ); self::in_batches( static function () use ( $wpdb, $cutoff ) { return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}smsportal_connection_log WHERE created_at < %s LIMIT %d", $cutoff, self::BATCH ) ); } ); // phpcs:enable } /** * Repeat a DELETE … LIMIT BATCH until it deletes fewer rows than a batch (or fails). * * @param callable $delete Runs one batch, returns the rows deleted or false. * @return void */ private static function in_batches( callable $delete ): void { do { $deleted = $delete(); } while ( false !== $deleted && (int) $deleted >= self::BATCH ); } }