' . __('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();
?>