option_key ) === false ) { $data = []; foreach ( get_plugins() as $plugin_slug => $plugin_details ) { $data[ $plugin_slug ] = [ 'plugin_name' => $plugin_details['Name'], 'version' => $plugin_details['Version'], 'records' => [ [ 'status' => is_plugin_active( $plugin_slug ) ? 'activated' : 'deactivated', 'timestamp' => current_time( 'mysql' ), ], ], ]; } add_option( $this->option_key, $data, '', 'no' ); } } /** * Tracks plugin activation. */ public function skpat_track_plugin_activation( $plugin, $network_activation ) { $this->update_plugin_status( $plugin, 'activated' ); } /** * Tracks plugin deactivation. */ public function skpat_track_plugin_deactivation( $plugin, $network_activation ) { $this->update_plugin_status( $plugin, 'deactivated' ); } /** * Tracks plugin changes (updates or deletions). */ public function skpat_track_plugin_changes( $upgrader, $hook_extra ) { $data = get_option( $this->option_key, [] ); $all_plugins = array_keys( get_plugins() ); if ( isset( $hook_extra['action'] ) && $hook_extra['action'] === 'delete' ) { // Plugin deletion logic foreach ( $data as $plugin_slug => $plugin_data ) { if ( ! in_array( $plugin_slug, $all_plugins, true ) ) { $data[ $plugin_slug ]['records'][] = [ 'status' => 'deleted', 'timestamp' => current_time( 'mysql' ), ]; unset( $data[ $plugin_slug ]['version'] ); } } } if ( isset( $hook_extra['action'] ) && $hook_extra['action'] === 'update' ) { foreach ( $hook_extra['plugins'] as $plugin ) { if ( isset( $data[ $plugin ] ) ) { $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); $data[ $plugin ]['version'] = $plugin_details['Version']; $data[ $plugin ]['records'][] = [ 'status' => 'updated', 'timestamp' => current_time( 'mysql' ), 'version' => $plugin_details['Version'], ]; } } } update_option( $this->option_key, $data, 'no' ); } /** * Updates plugin status with a new record. */ private function update_plugin_status( $plugin, $status ) { $data = get_option( $this->option_key, [] ); if ( ! isset( $data[ $plugin ] ) ) { $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); $data[ $plugin ] = [ 'plugin_name' => $plugin_details['Name'], 'version' => $plugin_details['Version'], 'records' => [], ]; } $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); $data[ $plugin ]['version'] = $plugin_details['Version']; $data[ $plugin ]['records'][] = [ 'status' => $status, 'timestamp' => current_time( 'mysql' ), 'version' => $plugin_details['Version'], ]; update_option( $this->option_key, $data, 'no' ); } /** * Registers the submenu page. */ public function skpat_register_submenu_page() { add_submenu_page( 'tools.php', __( 'Add-on Tracker', 'addon-tracker' ), __( 'Add-on Tracker', 'addon-tracker' ), 'manage_options', 'add-on-tracker', [ $this, 'render_submenu_page' ] ); } /** * Renders the submenu page. */ public function render_submenu_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } $data = get_option( $this->option_key, [] ); // Display success/error messages. settings_errors( 'addon_tracker_messages' ); ?>

$plugin_data ) : ?>
() %s', esc_attr( $color ), esc_html( $status ) ); ?>
option_key, [] ); ob_start(); ?>

$plugin_data ) : ?>
Plugin Version Records