PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0.3
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0.3
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / modules / logs / classes / class-log-admin.php

class-log-admin.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.0.3, at modules/logs/classes/class-log-admin.php

351 lines 10.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Centralized manager for WordPress backend functionality.
4 *
5 * @package MainWP\Dashboard
6 * @version 4.5.1
7 */
8
9 namespace MainWP\Dashboard\Module\Log;
10
11 use MainWP\Dashboard\MainWP_Logger;
12 use MainWP\Dashboard\MainWP_Post_Handler;
13
14
15 defined( 'ABSPATH' ) || exit;
16
17 use DateTime;
18 use DateTimeZone;
19 use DateInterval;
20 use WP_CLI;
21
22 /**
23 * Class - Log_Admin
24 */
25 class Log_Admin {
26
27 /**
28 * Holds Instance of manager object
29 *
30 * @var Log_manager
31 */
32 public $manager;
33
34
35 /**
36 * Menu page screen id
37 *
38 * @var string
39 */
40 public $screen_id = array();
41
42 /**
43 * List table object
44 *
45 * @var List_Table
46 */
47 public $list_table = null;
48
49 /**
50 * Parent page of the records and settings pages
51 *
52 * @var string
53 */
54 public $admin_parent_page = 'admin.php';
55
56 /**
57 * Class constructor.
58 *
59 * @param Log_Manager $manager Instance of manager object.
60 */
61 public function __construct( $manager ) {
62 $this->manager = $manager;
63 add_filter( 'mainwp_getsubpages_settings', array( $this, 'add_subpage_menu_logs' ) );
64 // Load admin scripts and styles.
65 add_action(
66 'admin_enqueue_scripts',
67 array(
68 $this,
69 'admin_enqueue_scripts',
70 ),
71 9
72 );
73
74 // Auto purge setup.
75 add_action( 'wp_loaded', array( $this, 'hook_purge_scheduled_action' ) );
76 add_action( 'admin_init', array( $this, 'admin_init' ) );
77 }
78
79 /**
80 * Handle admin_init action.
81 */
82 public function admin_init() {
83 MainWP_Post_Handler::instance()->add_action( 'mainwp_module_log_display_rows', array( $this, 'ajax_display_rows' ) );
84 MainWP_Post_Handler::instance()->add_action( 'mainwp_module_log_delete_records', array( $this, 'ajax_delete_records' ) );
85 MainWP_Post_Handler::instance()->add_action( 'mainwp_module_log_compact_records', array( $this, 'ajax_compact_records' ) );
86 MainWP_Post_Handler::instance()->add_action( 'mainwp_module_log_events_display_rows', array( Log_Insights_Page::instance(), 'ajax_events_display_rows' ) );
87 Log_Events_Filter_Segment::get_instance()->admin_init();
88 }
89
90
91 /**
92 * Init sub menu logs.
93 *
94 * @param array $subpages sub pages.
95 *
96 * @action init
97 */
98 public function add_subpage_menu_logs( $subpages = array() ) {
99 $subpages[] = array(
100 'title' => esc_html__( 'Dashboard Insights', 'mainwp' ),
101 'slug' => 'DashboardInsights',
102 'callback' => array( $this, 'render_list_table' ),
103 'class' => 'mainwp-logs-menu',
104 );
105 return $subpages;
106 }
107
108 /**
109 * Render main page
110 */
111 public function render_list_table() {
112 $this->list_table = new Log_List_Table( $this->manager );
113 /** This action is documented in ../pages/page-mainwp-manage-sites.php */
114 do_action( 'mainwp_pageheader_settings', 'DashboardInsights' );
115 ?>
116 <div id="mainwp-manage-sites-content" class="ui segment">
117 <div class="ui form">
118 <h3 class="ui dividing header"><?php esc_html_e( 'Dashboard Insights', 'mainwp' ); ?></h3>
119 <h4 class="ui header"><?php printf( esc_html__( 'Total logs size: %1$s (MB)', 'mainwp' ), esc_html( $this->get_db_size() ) ); ?></h4>
120 <div id="mainwp-message-zone" style="display:none;" class="ui message"></div>
121 <form method="post" class="mainwp-table-container">
122 <?php
123 wp_nonce_field( 'mainwp-admin-nonce' );
124 $this->list_table->display();
125 ?>
126 </form>
127 </div>
128 </div>
129 <?php
130 /** This action is documented in ../pages/page-mainwp-manage-sites.php */
131 do_action( 'mainwp_pagefooter_settings', 'DashboardInsights' );
132 }
133
134 /**
135 * Enqueue scripts/styles for admin screen
136 *
137 * @action admin_enqueue_scripts
138 *
139 * @param string $hook Current hook.
140 *
141 * @return void
142 */
143 public function admin_enqueue_scripts( $hook ) {
144 $script_screens = array( 'mainwp_page_InsightsOverview', 'mainwp_page_SettingsDashboardInsights', 'mainwp_page_SettingsInsights' );
145 wp_enqueue_style( 'mainwp-module-log-admin', $this->manager->locations['url'] . 'ui/css/admin.css', array(), $this->manager->get_version() );
146
147 if ( in_array( $hook, $script_screens, true ) ) {
148 wp_enqueue_script(
149 'mainwp-module-log-admin',
150 $this->manager->locations['url'] . 'ui/js/admin.js',
151 array(
152 'jquery',
153 'mainwp',
154 ),
155 $this->manager->get_version(),
156 false
157 );
158
159 if ( in_array( $hook, array( 'mainwp_page_InsightsOverview' ), true ) ) {
160 add_filter(
161 'mainwp_admin_enqueue_scripts',
162 function ( $scripts ) {
163 if ( is_array( $scripts ) ) {
164 $scripts['apexcharts'] = true;
165 }
166 return $scripts;
167 }
168 );
169 }
170
171 wp_localize_script(
172 'mainwp-module-log-admin',
173 'mainwpModuleLog',
174 array(
175 'i18n' => array(),
176 'gmt_offset' => get_option( 'gmt_offset' ),
177 )
178 );
179 }
180 }
181
182
183 /**
184 * Method ajax_display_rows()
185 *
186 * Display table rows, optimize for shared hosting or big networks.
187 */
188 public function ajax_display_rows() {
189 MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_display_rows' );
190 $this->load_list_table();
191 $this->list_table->prepare_items();
192 $output = $this->list_table->ajax_get_datatable_rows();
193 MainWP_Logger::instance()->log_execution_time( 'ajax_display_rows()' );
194 wp_send_json( $output );
195 }
196
197 /**
198 * Handle ajax delete logs records.
199 */
200 public function ajax_delete_records() {
201 MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_delete_records' );
202
203 $start_date = isset( $_POST['startdate'] ) ? sanitize_text_field( wp_unslash( $_POST['startdate'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
204 $end_date = isset( $_POST['enddate'] ) ? sanitize_text_field( wp_unslash( $_POST['enddate'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
205
206 $start_time = ! empty( $start_date ) ? strtotime( $start_date . ' 00:00:00' ) : '';
207 $end_time = ! empty( $end_date ) ? strtotime( $end_date . ' 23:59:59' ) : '';
208
209 if ( ! is_numeric( $start_time ) || ! is_numeric( $end_time ) || $start_time > $end_time ) {
210 die( wp_json_encode( array( 'error' => esc_html__( 'Invalid Start date or end date. Please try again.' ) ) ) );
211 }
212
213 $this->manager->db->create_compact_and_erase_records( $start_time, $end_time );
214
215 wp_send_json( array( 'result' => 'SUCCESS' ) );
216 }
217
218
219 /**
220 * Handle ajax compact logs records.
221 */
222 public function ajax_compact_records() {
223 MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_compact_records' );
224
225 $year = isset( $_POST['year'] ) ? intval( $_POST['year'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
226
227 if ( $year < 2022 ) {
228 die( wp_json_encode( array( 'error' => esc_html__( 'Invalid selected year. Please try again.' ) ) ) );
229 }
230
231 $aday = $year . '-12-15'; // a day in last month.
232
233 $start_time = strtotime( $year . '-1-1 00:00:00' );
234 $end_time = strtotime( gmdate( 'Y-m-t', strtotime( $aday ) ) . ' 23:59:59' );
235
236 $this->manager->db->create_compact_and_erase_records( $start_time, $end_time );
237
238 wp_send_json( array( 'result' => 'SUCCESS' ) );
239 }
240
241 /**
242 * Method load_sites_table()
243 *
244 * Load sites table.
245 */
246 public function load_list_table() {
247 $this->list_table = new Log_List_Table( $this->manager );
248 }
249
250
251 /**
252 * Schedules a purge of records.
253 *
254 * @return void
255 */
256 public function hook_purge_scheduled_action() {
257 $enable_schedule = is_array( $this->manager->settings->options ) && ! empty( $this->manager->settings->options['enabled'] ) && ! empty( $this->manager->settings->options['auto_purge'] ) ? true : false;
258 if ( $enable_schedule ) {
259 $last_purge = get_option( 'mainwp_module_log_last_time_auto_purge_logs' );
260 $next_purge = get_option( 'mainwp_module_log_next_time_auto_purge_logs' );
261 $days = false;
262 if ( is_array( $this->manager->settings->options ) && isset( $this->manager->settings->options['records_ttl'] ) ) {
263 $days = intval( $this->manager->settings->options['records_ttl'] );
264 } else {
265 $days = 100;
266 }
267
268 if ( defined( 'MAINWP_MODULE_LOG_KEEP_RECORDS_TTL' ) && is_numeric( MAINWP_MODULE_LOG_KEEP_RECORDS_TTL ) && MAINWP_MODULE_LOG_KEEP_RECORDS_TTL > 0 ) {
269 $days = MAINWP_MODULE_LOG_KEEP_RECORDS_TTL;
270 }
271
272 if ( $days ) {
273 $time = time();
274 $next_time_purge = false;
275 if ( false === $last_purge && false === $next_purge ) {
276 $next_purge = $time + $days * DAY_IN_SECONDS;
277 } elseif ( ! empty( $next_purge ) && $time > (int) $next_purge ) {
278 do_action( 'mainwp_log_action', 'module log :: purge logs schedule start.', MainWP_Logger::LOGS_AUTO_PURGE_LOG_PRIORITY );
279
280 $end_time = $time - $days * DAY_IN_SECONDS;
281 $start_time = ! empty( $last_purge ) ? $last_purge : $end_time - $days * DAY_IN_SECONDS;
282
283 $this->manager->db->create_compact_and_erase_records( false, $end_time );
284 update_option( 'mainwp_module_log_last_time_auto_purge_logs', $time );
285 $next_time_purge = $time + $days * DAY_IN_SECONDS;
286 }
287 if ( $next_time_purge ) {
288 update_option( 'mainwp_module_log_next_time_auto_purge_logs', $next_time_purge );
289 }
290 }
291 }
292 }
293
294
295
296 /**
297 * Get db size.
298 *
299 * @return string Return current db size.
300 */
301 public function get_db_size() {
302 $size = get_transient( 'mainwp_module_log_transient_db_logs_size' );
303 if ( false !== $size ) {
304 return $size;
305 }
306
307 global $wpdb;
308 $sql = $wpdb->prepare(
309 'SELECT
310 ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2)
311 FROM INFORMATION_SCHEMA.TABLES
312 WHERE
313 TABLE_SCHEMA = %s
314 AND table_name = %s
315 OR table_name = %s',
316 $wpdb->dbname,
317 $wpdb->mainwp_tbl_logs,
318 $wpdb->mainwp_tbl_logs_meta
319 );
320
321 $dbsize_mb = $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery -- prepared SQL.
322
323 set_transient( 'mainwp_module_log_transient_db_logs_size', $dbsize_mb, 15 * MINUTE_IN_SECONDS );
324
325 return $dbsize_mb;
326 }
327
328 /**
329 * Get WP users.
330 *
331 * @return array Array of users.
332 */
333 public function get_all_users() {
334 $list_users = array();
335 $all_users = get_users();
336 if ( is_array( $all_users ) ) {
337 foreach ( $all_users as $user ) {
338 if ( empty( $user->ID ) ) {
339 continue;
340 }
341 $fields = array();
342 $fields['id'] = $user->ID;
343 $fields['login'] = $user->user_login;
344 $fields['nicename'] = $user->user_nicename;
345 $list_users[] = $fields;
346 }
347 }
348 return $list_users;
349 }
350 }
351