n get_logs($log_type) { $logs = get_option(self::get_log_option_name($log_type), []); self::sort_logs($logs); return $logs; } public static function delete_logs($log_type) { $option_name = self::get_log_option_name($log_type); if ($option_name) { delete_option($option_name); return true; } return false; } public static function get_all_logs() { $all_logs = []; foreach (self::$log_options as $key => $val) { $logs = self::get_logs($key); foreach ($logs as $index => $log) { $logs[$index]['log_type'] = $key; } $all_logs = array_merge($all_logs, $logs); } self::sort_logs($all_logs); return $all_logs; } public static function get_log_option_name($log_type) { return (isset(self::$log_options[$log_type])) ? self::$log_options[$log_type] : null; } public function log_performance_requests_api_debug($response, $context, $class, $parsed_args, $url) { self::add_performance_requests_log($response, $url, $parsed_args); } public function log_performance_requests_http_response($response, $parsed_args, $url) { self::add_performance_requests_log($response, $url, $parsed_args); return $response; } public function two_daily_cron_hook_function() { foreach (array_values(self::$log_options) as $option_name) { $logs = get_option($option_name); $filtered_logs = []; $three_days_in_seconds = 3 * 24 * 60 * 60; foreach ($logs as $log) { if ($log['date'] + $three_days_in_seconds > time()) { $filtered_logs[] = $log; } } update_option($option_name, $filtered_logs, false); } } public static function sort_logs(&$logs) { usort($logs, function ($item1, $item2) { return $item2['date'] <=> $item1['date']; }); } protected static function get_stack_trace($limit = 10, $remove_first_n = 2) { $stack = []; foreach (debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit + $remove_first_n) as $num => $frame) { // phpcs:ignore // remove first n frames. This will remove get_stack_trace and add_log functions if ($num < $remove_first_n) { continue; } $file = !empty($frame['file']) ? str_replace(ABSPATH, '', $frame['file']) : ''; $line = !empty($frame['line']) ? $frame['line'] : ''; $func = $frame['function']; $class = (isset($frame['class'])) ? $frame['class'] : null; $type = (isset($frame['type'])) ? $frame['type'] : null; $stack_msg = '#' . $num . ' ' . $file . '(' . $line . '): '; if ($class) { $stack_msg .= $class . $type; } $stack[] = $stack_msg . $func . '()'; } return $stack; } public static function get_instance() { if (null == self::$instance) { self::$instance = new self(); } return self::$instance; } }