' . __('Exclusions in Settings', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to the Activity Digest Email Reports section in Settings __('Stay informed with automated %s delivered to your inbox.', 'activity-log-pro'), '' . __('Email Reports', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to the Activity Digest Email Reports section in Settings __('Schedule %s daily, weekly, or monthly.', 'activity-log-pro'), '' . __('Email Digest Reports', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to the General Settings section in Settings __('Keep your database trim - set a Log Retention Period in %s.', 'activity-log-pro'), '' . __('Settings', 'activity-log-pro') . '' ), __('Enable Live Monitor to see activity events in real-time.', 'activity-log-pro'), __('Use the Search box to find specific events across all log fields.', 'activity-log-pro'), sprintf( // translators: %1$s is cache/transient wildcards, %2$s is a link to the Event Filtering & Exclusions section in Settings __('Large database? Exclude %1$s wildcards in %2$s.', 'activity-log-pro'), '*_cache and *_transient', '' . __('Settings', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to the Export page __('%s your logs as JSON or CSV from the Export page.', 'activity-log-pro'), '' . __('Export', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to the Stats & Insights page __('Monitor failed logins and security events in %s.', 'activity-log-pro'), '' . __('Stats & Insights', 'activity-log-pro') . '' ), sprintf( // translators: %s is a link to Security Alerts settings (premium) or the upgrade page (free) __('Set up %s to get instant suspicious activity notifications.', 'activity-log-pro'), '' . __('Security Alerts', 'activity-log-pro') . '' ), __('Combine filters (date + user + event) for precise investigations.', 'activity-log-pro'), sprintf( // translators: %s is a link to the Event Filtering & Exclusions section in Settings __('Auto-save events cluttering logs? Exclude them in %s.', 'activity-log-pro'), '' . __('Event Filtering', 'activity-log-pro') . '' ), __('Filter by IP address to track activities from specific locations.', 'activity-log-pro'), sprintf( // translators: %s is a link to the Export page __('Generate secure JSON and RSS feeds from %s.', 'activity-log-pro'), '' . __('Export', 'activity-log-pro') . '' ), __('Use date filters to investigate security incidents.', 'activity-log-pro'), sprintf( // translators: %1$s is temp_* wildcard, %2$s is *_backup wildcard, %3$s is a link to the Event Filtering & Exclusions section in Settings __('Database growing? Exclude %1$s and %2$s in %3$s.', 'activity-log-pro'), 'temp_*', '*_backup', '' . __('Settings', 'activity-log-pro') . '' ), __('Dashboard widget shows activity trends without visiting logs page.', 'activity-log-pro'), __('Track plugin/theme changes to detect unauthorized modifications.', 'activity-log-pro') ); } /** * Check if Quick Tips are dismissed for current user * * @since 1.0.0 * @return bool */ public static function is_dismissed() { $user_id = get_current_user_id(); $dismissed_notices = get_user_meta($user_id, 'actlogpro_dismissed_notices', true); return is_array($dismissed_notices) && isset($dismissed_notices['quick-tips']); } /** * Get current tip index for user * * @since 1.0.0 * @return int */ public static function get_current_tip_index() { $user_id = get_current_user_id(); $tip_index = get_user_meta($user_id, 'actlogpro_quick_tip_index', true); // Ensure index is valid if (!is_numeric($tip_index) || $tip_index < 0 || $tip_index >= count(self::$tips)) { $tip_index = 0; } return intval($tip_index); } /** * Get current tip content * * @since 1.0.0 * @return string */ public static function get_current_tip() { if (empty(self::$tips)) { self::init_tips(); } $index = self::get_current_tip_index(); return isset(self::$tips[$index]) ? self::$tips[$index] : ''; } /** * Get total number of tips * * @since 1.0.0 * @return int */ public static function get_tips_count() { if (empty(self::$tips)) { self::init_tips(); } return count(self::$tips); } /** * Render Quick Tips HTML * * @since 1.0.0 */ public static function render() { // Don't show if dismissed if (self::is_dismissed()) { return; } // Don't show if no tips if (self::get_tips_count() === 0) { return; } $current_tip = self::get_current_tip(); $current_index = self::get_current_tip_index(); $total_tips = self::get_tips_count(); ?>
💡 /
__('Security check failed.', 'activity-log-pro'))); } // Check user capabilities if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have permission to perform this action.', 'activity-log-pro'))); } $user_id = get_current_user_id(); $dismissed_notices = get_user_meta($user_id, 'actlogpro_dismissed_notices', true); if (!is_array($dismissed_notices)) { $dismissed_notices = array(); } $dismissed_notices['quick-tips'] = time(); update_user_meta($user_id, 'actlogpro_dismissed_notices', $dismissed_notices); wp_send_json_success(array('message' => __('Quick Tips dismissed.', 'activity-log-pro'))); } /** * AJAX handler for updating tip index * * @since 1.0.0 */ public static function ajax_update_tip_index() { // Check nonce if (!isset($_POST['nonce']) || !wp_verify_nonce(sanitize_key(wp_unslash($_POST['nonce'])), 'actlogpro_ajax_nonce')) { wp_send_json_error(array('message' => __('Security check failed.', 'activity-log-pro'))); } // Check user capabilities if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have permission to perform this action.', 'activity-log-pro'))); } // Validate tip index if (!isset($_POST['tip_index'])) { wp_send_json_error(array('message' => __('Invalid tip index.', 'activity-log-pro'))); } $tip_index_raw = sanitize_text_field(wp_unslash($_POST['tip_index'])); if (!is_numeric($tip_index_raw)) { wp_send_json_error(array('message' => __('Invalid tip index.', 'activity-log-pro'))); } $tip_index = intval($tip_index_raw); // Ensure index is within valid range (JavaScript should handle looping) if ($tip_index < 0 || $tip_index >= self::get_tips_count()) { wp_send_json_error(array('message' => __('Invalid tip index.', 'activity-log-pro'))); } $user_id = get_current_user_id(); update_user_meta($user_id, 'actlogpro_quick_tip_index', $tip_index); // Get the new tip content $new_tip = isset(self::$tips[$tip_index]) ? self::$tips[$tip_index] : ''; wp_send_json_success(array( 'message' => __('Tip updated.', 'activity-log-pro'), 'tip_content' => wp_kses_post($new_tip), 'tip_index' => $tip_index, 'total_tips' => self::get_tips_count() )); } }