PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.1.2
Admin and Site Enhancements (ASE) v7.1.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 2 years ago classes 2 years ago includes 2 years ago languages 2 years ago vendor 2 years ago CHANGELOG.md 2 years ago LICENSE.md 2 years ago README.md 2 years ago admin-site-enhancements.php 2 years ago bootstrap.php 2 years ago functions.php 2 years ago settings.php 2 years ago
bootstrap.php
973 lines
1 <?php
2
3 // We're using the singleton design pattern
4 // https://code.tutsplus.com/articles/design-patterns-in-wordpress-the-singleton-pattern--wp-31621
5 // https://carlalexander.ca/singletons-in-wordpress/
6 // https://torquemag.io/2016/11/singletons-wordpress-good-evil/
7 /**
8 * Main class of the plugin used to add functionalities
9 *
10 * @since 1.0.0
11 */
12 class Admin_Site_Enhancements {
13 // Refers to a single instance of this class
14 private static $instance = null;
15
16 /**
17 * Creates or returns a single instance of this class
18 *
19 * @return Admin_Site_Enhancements a single instance of this class
20 * @since 1.0.0
21 */
22 public static function get_instance() {
23 if ( null == self::$instance ) {
24 self::$instance = new self();
25 }
26 return self::$instance;
27 }
28
29 /**
30 * Initialize plugin functionalities
31 */
32 private function __construct() {
33 global $wp_post_types, $pagenow, $typenow;
34 // Setup admin menu, admin page, settings, settings sections, sections fields, admin scripts, plugin action links, etc.
35 // Register admin menu and add the settings page.
36 add_action( 'admin_menu', 'asenha_register_admin_menu' );
37 // Register plugin settings
38 // Instantiate object for registration of settings section and fields
39 $settings = new ASENHA\Classes\Settings_Sections_Fields();
40 add_action( 'admin_init', [$settings, 'register_sections_fields'] );
41 // Suppress all notices on the plugin's main page. Then add notification for successful settings update.
42 add_action( 'admin_notices', 'asenha_suppress_add_notices', 5 );
43 add_action( 'all_admin_notices', 'asenha_suppress_generic_notices', 5 );
44 // Enqueue admin scripts and styles
45 add_action( 'admin_enqueue_scripts', 'asenha_admin_scripts' );
46 // Enqueue public scripts and styles
47 add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' );
48 // Dequeue scripts that prevents settings page from working
49 add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
50 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
51 add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
52 add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
53 // Add admin bar inline styles
54 add_action( 'admin_head', 'asenha_admin_bar_item_js_css' );
55 add_action( 'wp_head', 'asenha_admin_bar_item_js_css' );
56 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
57 // Mark that a user have supported ASE (via AJAX)
58 add_action( 'wp_ajax_have_supported', 'asenha_have_supported' );
59 // Dismiss upgrade nudge (via AJAX)
60 add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' );
61 // Dismiss support nudge (via AJAX)
62 add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' );
63 if ( function_exists( 'bwasenha_fs' ) ) {
64 bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' );
65 }
66 // Add style="display:[something];" to the safe CSS attributes.
67 // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329
68 // Ref: https://wordpress.stackexchange.com/a/195433
69 add_filter( 'safe_style_css', function ( $styles ) {
70 $styles[] = 'display';
71 return $styles;
72 } );
73 // ===== Activate features based on settings =====
74 // Get all WP Enhancements options, default to empty array in case it's not been created yet
75 $options = get_option( ASENHA_SLUG_U, array() );
76 // Content Duplication
77 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
78 $content_duplication = new ASENHA\Classes\Content_Duplication();
79 add_action( 'admin_action_duplicate_content', [$content_duplication, 'duplicate_content'] );
80 add_filter(
81 'page_row_actions',
82 [$content_duplication, 'add_duplication_action_link'],
83 10,
84 2
85 );
86 add_filter(
87 'post_row_actions',
88 [$content_duplication, 'add_duplication_action_link'],
89 10,
90 2
91 );
92 add_action( 'admin_bar_menu', [$content_duplication, 'add_admin_bar_duplication_link'], 100 );
93 }
94 // Content Order
95 if ( array_key_exists( 'content_order', $options ) && $options['content_order'] ) {
96 if ( array_key_exists( 'content_order_for', $options ) && !empty( $options['content_order_for'] ) || array_key_exists( 'content_order_for_other_post_types', $options ) && !empty( $options['content_order_for_other_post_types'] ) ) {
97 $content_order = new ASENHA\Classes\Content_Order();
98 add_action( 'admin_menu', [$content_order, 'add_content_order_submenu'] );
99 add_action( 'wp_ajax_save_custom_order', [$content_order, 'save_custom_content_order'] );
100 add_filter( 'pre_get_posts', [$content_order, 'orderby_menu_order'], PHP_INT_MAX );
101 // TODO: https://developer.wordpress.org/reference/hooks/ajax_query_attachments_args/ (for grid view of media library)
102 add_filter(
103 'save_post',
104 [$content_order, 'set_menu_order_for_new_posts'],
105 10,
106 3
107 );
108 }
109 }
110 // Media Replacement
111 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
112 $media_replacement = new ASENHA\Classes\Media_Replacement();
113 add_filter(
114 'media_row_actions',
115 [$media_replacement, 'modify_media_list_table_edit_link'],
116 10,
117 2
118 );
119 add_filter(
120 'attachment_fields_to_edit',
121 [$media_replacement, 'add_media_replacement_button'],
122 10,
123 2
124 );
125 add_action( 'edit_attachment', [$media_replacement, 'replace_media'] );
126 add_filter( 'post_updated_messages', [$media_replacement, 'attachment_updated_custom_message'] );
127 // Bust browser cache of old/replaced images
128 add_filter(
129 'wp_calculate_image_srcset',
130 [$media_replacement, 'append_cache_busting_param_to_image_srcset'],
131 10,
132 5
133 );
134 add_filter(
135 'wp_get_attachment_image_src',
136 [$media_replacement, 'append_cache_busting_param_to_attachment_image_src'],
137 10,
138 2
139 );
140 add_filter(
141 'wp_prepare_attachment_for_js',
142 [$media_replacement, 'append_cache_busting_param_to_attachment_for_js'],
143 10,
144 2
145 );
146 add_filter(
147 'wp_get_attachment_url',
148 [$media_replacement, 'append_cache_busting_param_to_attachment_url'],
149 20,
150 2
151 );
152 }
153 // Media Library Infinite Scrolling
154 if ( array_key_exists( 'media_library_infinite_scrolling', $options ) && $options['media_library_infinite_scrolling'] ) {
155 add_filter( 'media_library_infinite_scrolling', '__return_true' );
156 }
157 // SVG Upload
158 if ( array_key_exists( 'enable_svg_upload', $options ) && $options['enable_svg_upload'] && array_key_exists( 'enable_svg_upload_for', $options ) && isset( $options['enable_svg_upload_for'] ) ) {
159 global $roles_svg_upload_enabled;
160 $enable_svg_upload = $options['enable_svg_upload'];
161 $for_roles = $options['enable_svg_upload_for'];
162 // User has role(s). Do further checks.
163 if ( isset( $for_roles ) && count( $for_roles ) > 0 ) {
164 // Assemble single-dimensional array of roles for which SVG upload would be enabled
165 $roles_svg_upload_enabled = array();
166 foreach ( $for_roles as $role_slug => $svg_upload_enabled ) {
167 if ( $svg_upload_enabled ) {
168 $roles_svg_upload_enabled[] = $role_slug;
169 }
170 }
171 }
172 $svg_upload = new ASENHA\Classes\SVG_Upload();
173 add_filter( 'upload_mimes', [$svg_upload, 'add_svg_mime'] );
174 add_filter(
175 'wp_check_filetype_and_ext',
176 [$svg_upload, 'confirm_file_type_is_svg'],
177 10,
178 4
179 );
180 add_filter( 'wp_handle_upload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
181 add_filter(
182 'wp_generate_attachment_metadata',
183 [$svg_upload, 'generate_svg_metadata'],
184 10,
185 3
186 );
187 add_action( 'wp_ajax_svg_get_attachment_url', [$svg_upload, 'get_svg_attachment_url'] );
188 add_filter( 'wp_prepare_attachment_for_js', [$svg_upload, 'get_svg_url_in_media_library'] );
189 }
190 // AVIF Upload
191 if ( array_key_exists( 'enable_avif_upload', $options ) && $options['enable_avif_upload'] ) {
192 $avif_upload = new ASENHA\Classes\AVIF_Upload();
193 add_filter( 'mime_types', [$avif_upload, 'add_avif_mime_type'] );
194 add_filter( 'upload_mimes', [$avif_upload, 'allow_avif_mime_type_upload'] );
195 add_filter( 'getimagesize_mimes_to_exts', [$avif_upload, 'add_avif_mime_type_to_exts'] );
196 add_filter(
197 'wp_generate_attachment_metadata',
198 [$avif_upload, 'add_avif_image_dimension'],
199 10,
200 3
201 );
202 add_filter(
203 'file_is_displayable_image',
204 [$avif_upload, 'make_avif_displayable'],
205 10,
206 2
207 );
208 add_filter(
209 'wp_check_filetype_and_ext',
210 [$avif_upload, 'handle_exif_and_fileinfo_fail'],
211 10,
212 5
213 );
214 }
215 // External Permalinks
216 if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) {
217 if ( array_key_exists( 'enable_external_permalinks_for', $options ) && !empty( $options['enable_external_permalinks_for'] ) ) {
218 $external_permalinks = new ASENHA\Classes\External_Permalinks();
219 add_action(
220 'add_meta_boxes',
221 [$external_permalinks, 'add_external_permalink_meta_box'],
222 10,
223 2
224 );
225 add_action( 'save_post', [$external_permalinks, 'save_external_permalink'] );
226 // Filter the permalink for use by get_permalink()
227 add_filter(
228 'page_link',
229 [$external_permalinks, 'use_external_permalink_for_pages'],
230 20,
231 2
232 );
233 add_filter(
234 'post_link',
235 [$external_permalinks, 'use_external_permalink_for_posts'],
236 20,
237 2
238 );
239 add_filter(
240 'post_type_link',
241 [$external_permalinks, 'use_external_permalink_for_posts'],
242 20,
243 2
244 );
245 // Enable redirection to external permalink when page/post is opened directly via it's WP permalink
246 add_action( 'wp', [$external_permalinks, 'redirect_to_external_permalink'] );
247 }
248 }
249 // Open All External Links in New Tab
250 if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) {
251 $open_external_links_in_new_tab = new ASENHA\Classes\Open_External_Links_In_New_Tab();
252 add_filter( 'the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
253 }
254 // Allow Custom Menu Links to Open in New Tab
255 if ( array_key_exists( 'custom_nav_menu_items_new_tab', $options ) && $options['custom_nav_menu_items_new_tab'] ) {
256 $custom_nav_menu_items_in_new_tab = new ASENHA\Classes\Custom_Nav_Menu_Items_In_New_Tab();
257 add_filter(
258 'wp_nav_menu_item_custom_fields',
259 [$custom_nav_menu_items_in_new_tab, 'add_custom_nav_menu_open_in_new_tab_field'],
260 10,
261 4
262 );
263 add_action(
264 'wp_update_nav_menu_item',
265 [$custom_nav_menu_items_in_new_tab, 'save_custom_nav_menu_open_in_new_tab_status'],
266 10,
267 3
268 );
269 add_action(
270 'nav_menu_link_attributes',
271 [$custom_nav_menu_items_in_new_tab, 'add_attributes_to_custom_nav_menu_item'],
272 10,
273 3
274 );
275 }
276 // Auto-Publishing of Posts with Missed Schedules
277 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
278 $auto_publish_posts_with_missed_schedule = new ASENHA\Classes\Auto_Publish_Posts_With_Missed_Schedule();
279 add_action( 'wp_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
280 add_action( 'admin_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
281 }
282 // =================================================================
283 // ADMIN INTERFACE
284 // =================================================================
285 // Hide or Modify Elements / Clean Up Admin Bar
286 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
287 $cleanup_admin_bar = new ASENHA\Classes\Cleanup_Admin_Bar();
288 // Priority 5 to execute earlier than the normal 10. This is for removing default items.
289 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'modify_admin_bar_menu'], 5 );
290 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
291 add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] );
292 }
293 }
294 // Hide Admin Notices
295 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
296 $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices();
297 add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 );
298 // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] );
299 add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] );
300 add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] );
301 }
302 // Disable Dashboard Widgets
303 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
304 $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets();
305 add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], 99 );
306 add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] );
307 }
308 // Hide Admin Bar
309 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) {
310 $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar();
311 }
312 // On the frontend
313 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] && array_key_exists( 'hide_admin_bar_for', $options ) && isset( $options['hide_admin_bar_for'] ) ) {
314 add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] );
315 }
316 // Wider Admin Menu
317 if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) {
318 $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu();
319 add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 );
320 }
321 // Admin Menu Organizer
322 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
323 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
324 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
325 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
326 if ( array_key_exists( 'custom_menu_order', $options ) ) {
327 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
328 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
329 }
330 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
331 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 999995 );
332 // For 'Posts' menu, if the title has been changed, try changing the labels for it everywhere
333 $custom_menu_titles = explode( ',', $options['custom_menu_titles'] );
334 foreach ( $custom_menu_titles as $custom_menu_title ) {
335 if ( false !== strpos( $custom_menu_title, 'menu-posts__' ) ) {
336 $custom_menu_title = explode( '__', $custom_menu_title );
337 $posts_custom_title = $custom_menu_title[1];
338 $posts_default_title = $wp_post_types['post']->label;
339 if ( $posts_default_title != $posts_custom_title ) {
340 add_filter( 'post_type_labels_post', [$admin_menu_organizer, 'change_post_labels'] );
341 add_action( 'init', [$admin_menu_organizer, 'change_post_object_label'] );
342 add_action( 'admin_menu', [$admin_menu_organizer, 'change_post_menu_label'], PHP_INT_MAX );
343 add_action( 'admin_bar_menu', [$admin_menu_organizer, 'change_wp_admin_bar'], 80 );
344 }
345 }
346 }
347 }
348 if ( array_key_exists( 'custom_menu_hidden', $options ) || array_key_exists( 'custom_menu_always_hidden', $options ) ) {
349 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 999996 );
350 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 999997 );
351 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
352 }
353 }
354 // Show Custom Taxonomy Filters
355 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
356 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
357 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
358 }
359 // Enhance List Tables
360 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
361 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
362 // Show Featured Image Column
363 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
364 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
365 }
366 // Show Excerpt Column
367 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
368 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
369 }
370 // Show ID Column
371 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
372 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
373 }
374 // Show File Size Column in Media Library
375 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
376 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
377 add_action(
378 'manage_media_custom_column',
379 [$enhance_list_tables, 'display_file_size'],
380 10,
381 2
382 );
383 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
384 }
385 // Show ID in Action Row
386 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
387 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
388 }
389 // Hide Comments Column
390 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
391 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
392 }
393 // Hide Post Tags Column
394 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
395 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
396 }
397 }
398 // Various Admin UI Enhancements
399 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
400 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
401 // Display Active Plugins First
402 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
403 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
404 }
405 }
406 // Custom Admin Footer Text
407 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
408 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
409 // Update footer text
410 if ( is_asenha() ) {
411 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
412 } else {
413 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
414 }
415 // Update footer version text
416 if ( is_asenha() ) {
417 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
418 } else {
419 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
420 }
421 } else {
422 // Update footer text
423 if ( is_asenha() ) {
424 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
425 }
426 // Update footer version text
427 if ( is_asenha() ) {
428 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
429 }
430 }
431 // =================================================================
432 // LOG IN | LOG OUT
433 // =================================================================
434 // Change Login URL
435 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
436 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
437 $change_login_url = new ASENHA\Classes\Change_Login_URL();
438 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
439 add_filter(
440 'login_url',
441 [$change_login_url, 'customize_login_url'],
442 10,
443 3
444 );
445 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
446 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
447 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
448 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
449 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
450 // No need to modify logout_url or perform redirect on logout
451 // The customized login URL is already being returned after logout
452 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
453 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
454 }
455 }
456 // Login ID Type
457 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
458 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
459 $login_id_type = new ASENHA\Classes\Login_ID_Type();
460 switch ( $options['login_id_type'] ) {
461 case 'username':
462 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
463 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
464 add_filter(
465 'gettext',
466 [$login_id_type, 'gettext_login_id_username'],
467 20,
468 3
469 );
470 break;
471 case 'email':
472 add_filter(
473 'authenticate',
474 [$login_id_type, 'authenticate_email'],
475 20,
476 2
477 );
478 add_filter(
479 'gettext',
480 [$login_id_type, 'gettext_login_id_email'],
481 20,
482 3
483 );
484 break;
485 }
486 }
487 }
488 // Use Site Identity on the Login Page
489 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
490 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
491 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
492 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
493 }
494 // Login Logout Menu
495 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
496 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
497 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
498 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
499 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
500 }
501 // Enable Last Login Column
502 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
503 $last_login_column = new ASENHA\Classes\Last_Login_Column();
504 add_action( 'wp_login', [$last_login_column, 'log_login_datetime'] );
505 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
506 add_filter(
507 'manage_users_custom_column',
508 [$last_login_column, 'show_last_login_info'],
509 10,
510 3
511 );
512 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
513 }
514 // Redirect After Login
515 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
516 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
517 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
518 add_filter(
519 'wp_login',
520 [$redirect_after_login, 'redirect_after_login'],
521 5,
522 2
523 );
524 }
525 }
526 // Redirect After Logout
527 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
528 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
529 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
530 add_action(
531 'wp_logout',
532 [$redirect_after_logout, 'redirect_after_logout'],
533 5,
534 1
535 );
536 // load earlier than Change Login URL add_action
537 }
538 }
539 // Enable Custom Admin / Frontend CSS
540 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] || array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
541 $custom_css = new ASENHA\Classes\Custom_Css();
542 }
543 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
544 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
545 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
546 }
547 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
548 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
549 }
550 // Insert <head>, <body> and <footer> code
551 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
552 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
553 if ( isset( $options['head_code_priority'] ) ) {
554 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
555 } else {
556 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
557 }
558 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
559 if ( isset( $options['body_code_priority'] ) ) {
560 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
561 } else {
562 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
563 }
564 }
565 if ( isset( $options['footer_code_priority'] ) ) {
566 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
567 } else {
568 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
569 }
570 }
571 // Custom Body Class
572 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
573 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
574 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
575 add_action(
576 'add_meta_boxes',
577 [$custom_body_class, 'add_custom_body_class_meta_box'],
578 10,
579 2
580 );
581 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
582 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
583 }
584 }
585 // Manage ads.txt and app-ads.txt
586 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
587 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
588 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
589 }
590 // Manage robots.txt
591 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
592 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
593 add_filter(
594 'robots_txt',
595 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
596 10,
597 2
598 );
599 }
600 // =================================================================
601 // DISABLE COMPONENTS
602 // =================================================================
603 // Disable Gutenberg
604 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
605 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
606 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
607 if ( !class_exists( 'Classic_Editor' ) ) {
608 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
609 }
610 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
611 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
612 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 );
613 }
614 }
615 }
616 // Disable Comments
617 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
618 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
619 $disable_comments = new ASENHA\Classes\Disable_Comments();
620 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
621 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
622 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
623 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
624 add_filter(
625 'comments_array',
626 [$disable_comments, 'maybe_return_empty_comments'],
627 20,
628 2
629 );
630 add_filter(
631 'comments_open',
632 [$disable_comments, 'close_comments_pings_on_frontend'],
633 20,
634 2
635 );
636 add_filter(
637 'pings_open',
638 [$disable_comments, 'close_comments_pings_on_frontend'],
639 20,
640 2
641 );
642 add_filter(
643 'get_comments_number',
644 [$disable_comments, 'return_zero_comments_count'],
645 20,
646 2
647 );
648 // Disable commenting via XML-RPC
649 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
650 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
651 // Disable commenting via REST API
652 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
653 add_filter(
654 'rest_pre_insert_comment',
655 [$disable_comments, 'return_blank_comment'],
656 10,
657 2
658 );
659 }
660 }
661 // Disable REST API
662 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
663 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
664 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
665 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
666 } else {
667 // REST API 1.x
668 add_filter( 'json_enabled', '__return_false' );
669 add_filter( 'json_jsonp_enabled', '__return_false' );
670 // REST API 2.x
671 add_filter( 'rest_enabled', '__return_false' );
672 add_filter( 'rest_jsonp_enabled', '__return_false' );
673 }
674 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
675 // Disable REST API links in HTML <head>
676 remove_action(
677 'template_redirect',
678 'rest_output_link_header',
679 11,
680 0
681 );
682 // Disable REST API link in HTTP headers
683 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
684 // Remove REST API URL from the WP RSD endpoint.
685 }
686 // Disable Feeds
687 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
688 remove_action( 'wp_head', 'feed_links', 2 );
689 // Remove feed links in <head>
690 remove_action( 'wp_head', 'feed_links_extra', 3 );
691 // Remove feed links in <head>
692 remove_action(
693 'do_feed_rdf',
694 'do_feed_rdf',
695 10,
696 0
697 );
698 remove_action(
699 'do_feed_rss',
700 'do_feed_rss',
701 10,
702 0
703 );
704 remove_action(
705 'do_feed_rss2',
706 'do_feed_rss2',
707 10,
708 1
709 );
710 remove_action(
711 'do_feed_atom',
712 'do_feed_atom',
713 10,
714 1
715 );
716 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
717 add_action(
718 'template_redirect',
719 [$disable_feeds, 'redirect_feed_to_403'],
720 10,
721 1
722 );
723 }
724 // Disable All Updates
725 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
726 $disable_updates = new ASENHA\Classes\Disable_Updates();
727 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
728 // Disable core update
729 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
730 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
731 // Disable theme updates
732 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
733 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
734 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
735 // Disable plugin updates
736 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
737 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
738 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
739 // Disable auto updates
740 add_filter( 'automatic_updater_disabled', '__return_true' );
741 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
742 define( 'AUTOMATIC_UPDATER_DISABLED', true );
743 }
744 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
745 define( 'WP_AUTO_UPDATE_CORE', false );
746 }
747 add_filter( 'auto_update_core', '__return_false' );
748 add_filter( 'wp_auto_update_core', '__return_false' );
749 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
750 add_filter( 'allow_major_auto_core_updates', '__return_false' );
751 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
752 add_filter( 'auto_update_plugin', '__return_false' );
753 add_filter( 'auto_update_theme', '__return_false' );
754 add_filter( 'auto_update_translation', '__return_false' );
755 remove_action( 'init', 'wp_schedule_update_checks' );
756 // Disable update emails
757 add_filter( 'auto_core_update_send_email', '__return_false' );
758 add_filter( 'send_core_update_notification_email', '__return_false' );
759 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
760 // Remove Dashboard >> Updates menu
761 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
762 }
763 // Disable Smaller Components
764 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
765 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
766 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
767 remove_action( 'wp_head', 'wp_generator' );
768 }
769 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
770 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
771 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
772 }
773 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
774 remove_action( 'wp_head', 'wlwmanifest_link' );
775 }
776 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
777 remove_action( 'wp_head', 'rsd_link' );
778 }
779 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
780 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
781 remove_action(
782 'template_redirect',
783 'wp_shortlink_header',
784 100,
785 0
786 );
787 }
788 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
789 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
790 }
791 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
792 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
793 }
794 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
795 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
796 }
797 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
798 // Disables the block editor from managing widgets in the Gutenberg plugin.
799 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
800 // Disables the block editor from managing widgets.
801 add_filter( 'use_widgets_block_editor', '__return_false' );
802 }
803 }
804 // =================================================================
805 // SECURITY
806 // =================================================================
807 // Limit Login Attempts
808 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
809 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
810 add_filter(
811 'authenticate',
812 [$limit_login_attempts, 'maybe_allow_login'],
813 999,
814 3
815 );
816 // Very low priority so it is processed last
817 add_action(
818 'wp_login_errors',
819 [$limit_login_attempts, 'login_error_handler'],
820 999,
821 2
822 );
823 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
824 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
825 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
826 // Higher priority than one in Change Login URL
827 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
828 }
829 // Obfuscate Author Slugs
830 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
831 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
832 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
833 add_filter(
834 'author_link',
835 [$obfuscate_author_slugs, 'alter_author_link'],
836 10,
837 3
838 );
839 add_filter(
840 'rest_prepare_user',
841 [$obfuscate_author_slugs, 'alter_json_users'],
842 10,
843 3
844 );
845 }
846 // Email Address Obfuscator
847 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
848 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
849 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
850 add_filter( 'widget_text', 'shortcode_unautop' );
851 add_filter( 'widget_text', 'do_shortcode' );
852 if ( array_key_exists( 'obfuscate_email_address_in_content', $options ) && $options['obfuscate_email_address_in_content'] ) {
853 add_filter( 'the_content', [$email_address_obfuscator, 'obfuscate_emails_in_content__premium_only'] );
854 }
855 }
856 // Disable XML-RPC
857 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
858 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
859 add_filter( 'xmlrpc_enabled', '__return_false' );
860 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
861 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
862 }
863 // =================================================================
864 // OPTIMIZATIONS
865 // =================================================================
866 // Image Upload Control
867 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
868 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
869 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
870 }
871 // Revisions Control
872 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
873 $revisions_control = new ASENHA\Classes\Revisions_Control();
874 add_filter(
875 'wp_revisions_to_keep',
876 [$revisions_control, 'limit_revisions_to_max_number'],
877 10,
878 2
879 );
880 }
881 // Heartbeat Control
882 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
883 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
884 add_filter(
885 'heartbeat_settings',
886 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
887 99,
888 2
889 );
890 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
891 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
892 }
893 // =================================================================
894 // UTILITIES
895 // =================================================================
896 // SMTP Email Delivery
897 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
898 $email_delivery = new ASENHA\Classes\Email_Delivery();
899 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
900 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
901 }
902 // Multiple User Roles
903 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
904 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
905 // Show roles checkboxes
906 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
907 // for when user edits their own profile
908 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
909 // for when editing other user's profile
910 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
911 // new user creation
912 // Save roles selections
913 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
914 // for when user edits their own profile
915 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
916 // for when editing other user's profile
917 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
918 // new user creation
919 }
920 // Image Sizes Panel
921 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
922 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
923 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
924 }
925 // View Admin as Role
926 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
927 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
928 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
929 // Priority 8 so it is next to username section
930 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
931 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
932 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
933 }
934 // Password Protection
935 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
936 $password_protection = new ASENHA\Classes\Password_Protection();
937 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
938 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
939 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
940 // load early
941 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
942 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
943 if ( function_exists( 'wp_site_icon' ) ) {
944 // WP v4.3+
945 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
946 }
947 }
948 // Maintenance Mode
949 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
950 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
951 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
952 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
953 }
954 // Redirect 404 to Homepage
955 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
956 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
957 add_filter( 'wp', [$redirect_fourofour, 'redirect_404'] );
958 }
959 // Display System Summary
960 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
961 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
962 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
963 }
964 // Search Engines Visibility Status
965 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
966 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
967 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
968 }
969 }
970
971 }
972
973 Admin_Site_Enhancements::get_instance();