insert($wpdb->prefix . 'wpmigpro_logs', array( 'backup_id' => $backup_id, 'level' => $level, 'message' => $message, 'created_at' => current_time('mysql'), ), array('%d', '%s', '%s', '%s')); self::log_to_file($message, $level); } private static function log_to_file($message, $level) { if (!is_dir(WPMIGPRO_LOGS_DIR)) { return; } $file = WPMIGPRO_LOGS_DIR . '/wpmigpro-' . gmdate('Y-m-d') . '.log'; $handle = WPMigPro_FS::open($file, 'ab'); if ($handle) { WPMigPro_FS::write($handle, '[' . gmdate('Y-m-d H:i:s') . '] [' . strtoupper($level) . '] ' . $message . "\n"); WPMigPro_FS::close($handle); } } /** * Most recent log file, or empty string. */ public static function latest_file() { $files = glob(WPMIGPRO_LOGS_DIR . '/wpmigpro-*.log'); if (empty($files)) { return ''; } usort($files, function ($a, $b) { return filemtime($b) - filemtime($a); }); return $files[0]; } /** * Delete log rows older than $days days. */ public static function clear_old_logs($days = 30) { global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- plugin's own log table. $wpdb->query($wpdb->prepare( 'DELETE FROM %i WHERE created_at < DATE_SUB(NOW(), INTERVAL %d DAY)', $wpdb->prefix . 'wpmigpro_logs', $days )); } }