| @@ -81,8 +81,33 @@ | ||
| 81 | 81 | add_action('wp_print_styles', 'c_ws_plugin__s2member_css_js_themes::add_css'); |
| 82 | 82 | add_action('wp_print_scripts', 'c_ws_plugin__s2member_css_js_themes::add_js_w_globals'); |
| 83 | 83 | add_filter('script_loader_tag', 'c_ws_plugin__s2member_css_js_themes::script_loader_tag', 10, 2); |
| 84 | 84 | |
| 85 | +//260904.0300 Fresh activation can update options before funcs.inc.php installs s2Member's class autoloader, so defer this callback until s2Member is fully loaded. | |
| 86 | +add_action('ws_plugin__s2member_loaded', function() { | |
| 87 | + add_action('updated_option', 'c_ws_plugin__s2member_utils_assets::maybe_invalidate_after_wp_option_update', 10, 3); | |
| 88 | +}); | |
| 89 | +//260911.1834 Relevant General Options saves rebuild enabled static assets after the complete new option set is available, instead of making the admin wait for a frontend page-load. | |
| 90 | +add_action('ws_plugin__s2member_after_update_all_options', 'c_ws_plugin__s2member_utils_assets::rebuild_static_assets_after_options_save', 10, 1); | |
| 91 | +add_action('activated_plugin', 'c_ws_plugin__s2member_utils_assets::invalidate_after_plugin_change'); | |
| 92 | +add_action('deactivated_plugin', 'c_ws_plugin__s2member_utils_assets::invalidate_after_plugin_change'); | |
| 93 | +add_action('upgrader_process_complete', 'c_ws_plugin__s2member_utils_assets::maybe_invalidate_after_upgrade', 10, 2); | |
| 94 | +add_action('ws_plugin__s2member_after_activation', 'c_ws_plugin__s2member_utils_assets::invalidate_static_assets', 10, 0); | |
| 95 | +add_action('wp_ajax_ws_plugin__s2member_refresh_static_assets', 'c_ws_plugin__s2member_utils_assets::ajax_refresh_static_assets'); | |
| 96 | +add_action('wp_ajax_ws_plugin__s2member_asset_http_health', 'c_ws_plugin__s2member_utils_assets::ajax_asset_http_health_report'); | |
| 97 | +add_action('wp_ajax_ws_plugin__s2member_clear_asset_health_details', 'c_ws_plugin__s2member_utils_assets::ajax_clear_asset_health_details'); //260913.0056 Clear only the requested persistent troubleshooting summary; scoring and current Health remain unchanged. | |
| 98 | +add_action('wp_ajax_ws_plugin__s2member_asset_runtime_suspect', 'c_ws_plugin__s2member_utils_assets::ajax_asset_runtime_suspicion'); | |
| 99 | +add_action('wp_ajax_nopriv_ws_plugin__s2member_asset_runtime_suspect', 'c_ws_plugin__s2member_utils_assets::ajax_asset_runtime_suspicion'); | |
| 100 | +//260912.0258 Frontend requests queue separate health events; the Health Logkeeper merges them later so page delivery never waits on the shared health-log writer. | |
| 101 | +add_action('ws_plugin__s2member_assets_health_logkeeper', 'c_ws_plugin__s2member_utils_assets::run_health_logkeeper'); | |
| 102 | +add_action('init', 'c_ws_plugin__s2member_utils_assets::maybe_upgrade_asset_health_format', 1); //260912.0522 Run before normal asset decisions so stale first-v260909 activation tags/builds cannot leak into the physical-response scoring format. | |
| 103 | +add_action('admin_init', 'c_ws_plugin__s2member_utils_assets::maybe_rebuild_static_assets_on_admin_request', 20); //260911.1924 Privileged admin page-loads are a cheap recovery opportunity for pending, ungenerated, or locally missing enabled static assets; frontend traffic remains a fallback. | |
| 104 | +add_action('admin_init', 'c_ws_plugin__s2member_utils_assets::dismiss_static_assets_admin_notice'); //260910.0709 Process the nonce-protected incident dismissal before the same request reaches admin_notices. | |
| 105 | +add_action('admin_notices', 'c_ws_plugin__s2member_utils_assets::static_assets_admin_notice'); | |
| 106 | +add_action('admin_footer', 'c_ws_plugin__s2member_utils_assets::asset_http_health_probe', 900); | |
| 107 | +add_action('wp_footer', 'c_ws_plugin__s2member_utils_assets::asset_http_health_probe', 900); | |
| 108 | +add_action('wp_footer', 'c_ws_plugin__s2member_utils_assets::page_asset_runtime_monitor', 1000); | |
| 109 | + | |
| 85 | 110 | add_action('wp_login_failed', 'c_ws_plugin__s2member_brute_force::track_failed_logins'); |
| 86 | 111 | add_filter('authenticate', 'c_ws_plugin__s2member_brute_force::stop_brute_force_logins', 100); |
| 87 | 112 | |
| 88 | 113 | add_filter('wp_authenticate_user', 'c_ws_plugin__s2member_login_checks::ms_wp_authenticate_user', 100); |
| @@ -168,17 +193,37 @@ | ||
| 168 | 193 | add_action('admin_print_scripts', 'c_ws_plugin__s2member_menu_pages::add_admin_scripts'); |
| 169 | 194 | add_action('admin_print_styles', 'c_ws_plugin__s2member_menu_pages::add_admin_styles'); |
| 170 | 195 | add_action('admin_menu', 'c_ws_plugin__s2member_menu_pages::get_help_panel', 12); //250824 |
| 171 | 196 | |
| 197 | +//260813 Warn administrators when shortcodes request user fields that have not been explicitly approved. | |
| 198 | +add_action('admin_init', 'c_ws_plugin__s2member_admin_notices::dismiss_shortcode_user_fields_notice'); | |
| 199 | +add_action('admin_notices', 'c_ws_plugin__s2member_admin_notices::shortcode_user_fields_notice', 11); | |
| 200 | + | |
| 201 | +//260820.0149 Escalate materially unhealthy Auto-EOT processing beyond its settings panel. | |
| 202 | +add_action('admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12); | |
| 203 | +add_action('user_admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12); | |
| 204 | +add_action('network_admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12); | |
| 205 | + | |
| 206 | +//260917.0425 Warn administrators from the current Framework when the installed Pro add-on predates the current Pro updater, without disabling otherwise-compatible Pro features. | |
| 207 | +add_action('admin_notices', 'c_ws_plugin__s2member_admin_notices::outdated_pro_notice', 10); | |
| 208 | +add_action('user_admin_notices', 'c_ws_plugin__s2member_admin_notices::outdated_pro_notice', 10); | |
| 209 | +add_action('network_admin_notices', 'c_ws_plugin__s2member_admin_notices::outdated_pro_notice', 10); | |
| 210 | + | |
| 172 | 211 | add_action('admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices'); |
| 173 | 212 | add_action('user_admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices'); |
| 174 | 213 | add_action('network_admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices'); |
| 175 | 214 | |
| 176 | 215 | add_action('pre_user_query', 'c_ws_plugin__s2member_users_list::users_list_query'); |
| 216 | +add_filter('views_users', 'c_ws_plugin__s2member_users_list::users_list_views'); //260828.0231 Reuse WordPress' native Users views for separate Current and Previous End-of-Term reports. | |
| 177 | 217 | add_filter('manage_users_columns', 'c_ws_plugin__s2member_users_list::users_list_cols'); |
| 218 | +add_filter('manage_users_columns', 'c_ws_plugin__s2member_users_list::users_list_required_eot_cols', PHP_INT_MAX); //260828.0231 Preserve each EOT review view's required columns after Users-table customization plugins apply saved layouts. | |
| 219 | +add_filter('default_hidden_columns', 'c_ws_plugin__s2member_users_list::users_list_default_hidden_cols', 10, 2); //260822.1509 Keep optional EOT history columns available without widening the normal Users table by default. | |
| 220 | +add_filter('hidden_columns', 'c_ws_plugin__s2member_users_list::users_list_hidden_cols', PHP_INT_MAX, 2); //260828.0231 Enforce each EOT review view's primary timestamps after other plugins filter Screen Options; normal Users views remain untouched. | |
| 178 | 221 | add_filter('manage_users_custom_column', 'c_ws_plugin__s2member_users_list::users_list_display_cols', 10, 3); |
| 179 | 222 | add_filter('manage_users_sortable_columns', 'c_ws_plugin__s2member_users_list::users_list_add_sortable'); |
| 180 | 223 | add_filter('pre_user_query', 'c_ws_plugin__s2member_users_list::users_list_make_sortable'); |
| 224 | +add_action('admin_notices', 'c_ws_plugin__s2member_users_list::users_list_eot_notice', 13); //260828.0231 Explain the Current and Previous End-of-Term reports directly on their Users views. | |
| 225 | +add_action('admin_notices', 'c_ws_plugin__s2member_users_list::users_list_pending_deletion_notice', 13); //260822.1519 Explain the native Pending Deletion review queue directly on that role-filtered Users page. | |
| 181 | 226 | add_action('edit_user_profile', 'c_ws_plugin__s2member_users_list::users_list_edit_cols'); |
| 182 | 227 | add_action('show_user_profile', 'c_ws_plugin__s2member_users_list::users_list_edit_cols'); |
| 183 | 228 | add_action('edit_user_profile_update', 'c_ws_plugin__s2member_users_list::users_list_update_cols'); |
| 184 | 229 | add_action('personal_options_update', 'c_ws_plugin__s2member_users_list::users_list_update_cols'); |
| @@ -193,8 +238,15 @@ | ||
| 193 | 238 | add_action('deleted_user_meta', 'c_ws_plugin__s2member_access_cap_times::log_access_cap_times_on_delete', 10, 3); |
| 194 | 239 | |
| 195 | 240 | add_filter('cron_schedules', 'c_ws_plugin__s2member_cron_jobs::extend_cron_schedules'); |
| 196 | 241 | add_action('ws_plugin__s2member_auto_eot_system__schedule', 'c_ws_plugin__s2member_auto_eots::auto_eot_system'); |
| 242 | +//260820.0056 Keep catch-up work on a separate one-off hook so it can process only overdue EOTs without repeatedly invoking collective Pro cron consumers. | |
| 243 | +add_action('ws_plugin__s2member_auto_eot_system__continuation', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_continuation'); | |
| 244 | +add_action('ws_plugin__s2member_eot_processed_time_backfill', 'c_ws_plugin__s2member_auto_eots::backfill_eot_processed_times'); //260822.2048 Recover historical EOT processing times from legacy Administrative Notes after upgrade. | |
| 245 | +//260819.0613 Repair a missing recurring Auto-EOT event during normal requests, and immediately after an EOT run if WordPress failed to reschedule it. | |
| 246 | +add_action('init', 'c_ws_plugin__s2member_auto_eots::ensure_auto_eot_system', 3); | |
| 247 | +add_action('init', 'c_ws_plugin__s2member_auto_eots::ensure_eot_processed_time_backfill', 4); //260822.2048 Self-heal only while the temporary upgrade backfill cursor exists. | |
| 248 | +add_action('ws_plugin__s2member_after_auto_eot_system', 'c_ws_plugin__s2member_auto_eots::ensure_auto_eot_system', 999); | |
| 197 | 249 | |
| 198 | 250 | add_action('wp_ajax_ws_plugin__s2member_update_roles_via_ajax', 'c_ws_plugin__s2member_roles_caps::update_roles_via_ajax'); |
| 199 | 251 | |
| 200 | 252 | add_action('wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax', 'c_ws_plugin__s2member_sp_access::sp_access_link_via_ajax'); |