PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 8.6.2
Admin and Site Enhancements (ASE) v8.6.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 4 months ago classes 4 months ago includes 4 months ago languages 4 months ago vendor 4 months ago CHANGELOG.md 4 months ago LICENSE.md 4 months ago README.md 4 months ago admin-site-enhancements.php 4 months ago bootstrap.php 4 months ago functions.php 4 months ago settings.php 4 months ago
bootstrap.php
1131 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 add_action( 'admin_head', 'asenha_admin_menu_organizer_css' );
47 // Enqueue block editor scripts and styles
48 add_action( 'enqueue_block_editor_assets', 'asenha_block_editor_scripts' );
49 // Enqueue public scripts and styles
50 add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' );
51 // Dequeue scripts that prevents settings page from working
52 add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
53 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
54 add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
55 add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
56 // Add admin bar inline styles
57 add_action( 'admin_head', 'asenha_admin_bar_item_js_css' );
58 add_action( 'wp_head', 'asenha_admin_bar_item_js_css' );
59 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
60 // Mark that a user have supported ASE (via AJAX)
61 add_action( 'wp_ajax_have_supported', 'asenha_have_supported' );
62 // Dismiss upgrade nudge (via AJAX)
63 add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' );
64 // Dismiss promo nudge (via AJAX)
65 add_action( 'wp_ajax_dismiss_promo_nudge', 'asenha_dismiss_promo_nudge' );
66 // Dismiss support nudge (via AJAX)
67 add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' );
68 // Release login lock (via AJAX)
69 add_action( 'wp_ajax_asenha_release_login_lock', 'asenha_release_login_lock' );
70 if ( function_exists( 'bwasenha_fs' ) ) {
71 bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' );
72 }
73 // Get all ASE options, default to empty array in case it's not been created yet
74 $options = get_option( ASENHA_SLUG_U, array() );
75 // Add style="display:[something];" to the safe CSS attributes.
76 // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329
77 // Ref: https://wordpress.stackexchange.com/a/195433
78 add_filter( 'safe_style_css', function ( $styles ) {
79 $styles[] = 'display';
80 return $styles;
81 } );
82 // ===== Activate modules based on settings =====
83 // Ensure SVG admin menu icons render with the correct admin color scheme on first paint.
84 // Modules can register SVG data URI icons with this helper and then use a Dashicon placeholder.
85 if ( is_admin() ) {
86 add_action( 'admin_enqueue_scripts', array('ASENHA\\Classes\\Admin_Menu_Svg_Icon_Mask', 'enqueue_mask_css'), 99 );
87 }
88 // Content Duplication
89 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
90 $content_duplication = new ASENHA\Classes\Content_Duplication();
91 add_action( 'admin_action_duplicate_content', [$content_duplication, 'duplicate_content'] );
92 add_filter(
93 'page_row_actions',
94 [$content_duplication, 'add_duplication_action_link'],
95 20,
96 2
97 );
98 add_filter(
99 'post_row_actions',
100 [$content_duplication, 'add_duplication_action_link'],
101 20,
102 2
103 );
104 add_action( 'admin_bar_menu', [$content_duplication, 'add_admin_bar_duplication_link'], 100 );
105 }
106 // Content Order
107 if ( array_key_exists( 'content_order', $options ) && $options['content_order'] ) {
108 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'] ) ) {
109 $content_order = new ASENHA\Classes\Content_Order();
110 add_action( 'admin_menu', [$content_order, 'add_content_order_submenu'] );
111 add_action( 'admin_init', [$content_order, 'maybe_perform_menu_link_redirects'] );
112 add_action( 'admin_footer', [$content_order, 'add_additional_elements'] );
113 add_filter( 'admin_enqueue_scripts', [$content_order, 'add_list_tables_scripts'] );
114 add_action( 'wp_ajax_save_custom_order', [$content_order, 'save_custom_content_order'] );
115 add_filter( 'pre_get_posts', [$content_order, 'orderby_menu_order'], PHP_INT_MAX );
116 // TODO: https://developer.wordpress.org/reference/hooks/ajax_query_attachments_args/ (for grid view of media library)
117 add_filter(
118 'save_post',
119 [$content_order, 'set_menu_order_for_new_posts'],
120 10,
121 3
122 );
123 }
124 }
125 // Media Library Access Control
126 if ( array_key_exists( 'media_files_visibility_control', $options ) && $options['media_files_visibility_control'] ) {
127 $media_files_visibility_control = new ASENHA\Classes\Media_Files_Visibility_Control();
128 add_filter( 'ajax_query_attachments_args', [$media_files_visibility_control, 'filter_attachments_grid'] );
129 add_action( 'pre_get_posts', [$media_files_visibility_control, 'filter_attachments_list'] );
130 }
131 // Media Replacement
132 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
133 $media_replacement = new ASENHA\Classes\Media_Replacement();
134 $disable_media_replacement_cache_busting = ( isset( $options['disable_media_replacement_cache_busting'] ) ? $options['disable_media_replacement_cache_busting'] : false );
135 add_filter(
136 'media_row_actions',
137 [$media_replacement, 'modify_media_list_table_edit_link'],
138 10,
139 2
140 );
141 add_filter(
142 'attachment_fields_to_edit',
143 [$media_replacement, 'add_media_replacement_button'],
144 10,
145 2
146 );
147 add_action( 'edit_attachment', [$media_replacement, 'replace_media'] );
148 add_filter( 'post_updated_messages', [$media_replacement, 'attachment_updated_custom_message'] );
149 // Mayve bust browser cache of old/replaced images by appending a time stamp URL parameter
150 if ( !$disable_media_replacement_cache_busting ) {
151 add_filter(
152 'wp_calculate_image_srcset',
153 [$media_replacement, 'append_cache_busting_param_to_image_srcset'],
154 10,
155 5
156 );
157 add_filter(
158 'wp_get_attachment_image_src',
159 [$media_replacement, 'append_cache_busting_param_to_attachment_image_src'],
160 10,
161 2
162 );
163 add_filter(
164 'wp_prepare_attachment_for_js',
165 [$media_replacement, 'append_cache_busting_param_to_attachment_for_js'],
166 10,
167 2
168 );
169 add_filter(
170 'wp_get_attachment_url',
171 [$media_replacement, 'append_cache_busting_param_to_attachment_url'],
172 20,
173 2
174 );
175 }
176 }
177 // Media Library Infinite Scrolling
178 if ( array_key_exists( 'media_library_infinite_scrolling', $options ) && $options['media_library_infinite_scrolling'] ) {
179 add_filter( 'media_library_infinite_scrolling', '__return_true' );
180 }
181 // SVG Upload
182 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'] ) ) {
183 global $roles_svg_upload_enabled;
184 $enable_svg_upload = $options['enable_svg_upload'];
185 $for_roles = $options['enable_svg_upload_for'];
186 // User has role(s). Do further checks.
187 if ( isset( $for_roles ) && count( $for_roles ) > 0 ) {
188 // Assemble single-dimensional array of roles for which SVG upload would be enabled
189 $roles_svg_upload_enabled = array();
190 foreach ( $for_roles as $role_slug => $svg_upload_enabled ) {
191 if ( $svg_upload_enabled ) {
192 $roles_svg_upload_enabled[] = $role_slug;
193 }
194 }
195 }
196 $svg_upload = new ASENHA\Classes\SVG_Upload();
197 add_filter( 'upload_mimes', [$svg_upload, 'add_svg_mime'] );
198 add_filter(
199 'wp_check_filetype_and_ext',
200 [$svg_upload, 'confirm_file_type_is_svg'],
201 10,
202 4
203 );
204 add_filter( 'wp_handle_sideload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
205 add_filter( 'wp_handle_upload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
206 add_filter(
207 'xmlrpc_prepare_media_item',
208 [$svg_upload, 'sanitize_xmlrpc_svg_upload'],
209 10,
210 2
211 );
212 add_action(
213 'rest_insert_attachment',
214 [$svg_upload, 'sanitize_after_upload'],
215 10,
216 3
217 );
218 add_filter(
219 'wp_generate_attachment_metadata',
220 [$svg_upload, 'generate_svg_metadata'],
221 10,
222 3
223 );
224 add_filter( 'wp_calculate_image_srcset', [$svg_upload, 'disable_svg_srcset'] );
225 if ( !in_array( 'auto-sizes/auto-sizes.php', get_option( 'active_plugins', array() ) ) ) {
226 // Only add this filter when https://wordpress.org/plugins/auto-sizes/ is not active to prevent PHP deprecation notice
227 add_filter(
228 'wp_calculate_image_sizes',
229 [$svg_upload, 'remove_svg_responsive_image_attr'],
230 10,
231 3
232 );
233 }
234 add_action( 'wp_ajax_svg_get_attachment_url', [$svg_upload, 'get_svg_attachment_url'] );
235 add_filter( 'wp_prepare_attachment_for_js', [$svg_upload, 'get_svg_url_in_media_library'] );
236 }
237 // AVIF Upload
238 if ( array_key_exists( 'enable_avif_upload', $options ) && $options['enable_avif_upload'] ) {
239 $avif_upload = new ASENHA\Classes\AVIF_Upload();
240 add_filter( 'mime_types', [$avif_upload, 'add_avif_mime_type'] );
241 add_filter( 'upload_mimes', [$avif_upload, 'allow_avif_mime_type_upload'] );
242 add_filter( 'getimagesize_mimes_to_exts', [$avif_upload, 'add_avif_mime_type_to_exts'] );
243 add_filter(
244 'wp_generate_attachment_metadata',
245 [$avif_upload, 'add_avif_image_dimension'],
246 10,
247 3
248 );
249 add_filter(
250 'file_is_displayable_image',
251 [$avif_upload, 'make_avif_displayable'],
252 10,
253 2
254 );
255 add_filter(
256 'wp_check_filetype_and_ext',
257 [$avif_upload, 'handle_exif_and_fileinfo_fail'],
258 10,
259 5
260 );
261 }
262 // External Permalinks
263 if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) {
264 if ( array_key_exists( 'enable_external_permalinks_for', $options ) && !empty( $options['enable_external_permalinks_for'] ) ) {
265 $external_permalinks = new ASENHA\Classes\External_Permalinks();
266 add_action(
267 'add_meta_boxes',
268 [$external_permalinks, 'add_external_permalink_meta_box'],
269 10,
270 2
271 );
272 add_action( 'save_post', [$external_permalinks, 'save_external_permalink'] );
273 // Filter the permalink for use by get_permalink()
274 add_filter(
275 'page_link',
276 [$external_permalinks, 'use_external_permalink_for_pages'],
277 20,
278 2
279 );
280 add_filter(
281 'post_link',
282 [$external_permalinks, 'use_external_permalink_for_posts'],
283 20,
284 2
285 );
286 add_filter(
287 'post_type_link',
288 [$external_permalinks, 'use_external_permalink_for_posts'],
289 20,
290 2
291 );
292 // Enable redirection to external permalink when page/post is opened directly via it's WP permalink
293 add_action( 'wp', [$external_permalinks, 'redirect_to_external_permalink'] );
294 }
295 }
296 // Open All External Links in New Tab
297 if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) {
298 $open_external_links_in_new_tab = new ASENHA\Classes\Open_External_Links_In_New_Tab();
299 add_filter( 'the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
300 if ( in_array( 'elementor/elementor.php', get_option( 'active_plugins', array() ) ) ) {
301 add_filter( 'elementor/frontend/the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
302 }
303 }
304 // Allow Custom Menu Links to Open in New Tab
305 if ( array_key_exists( 'custom_nav_menu_items_new_tab', $options ) && $options['custom_nav_menu_items_new_tab'] ) {
306 $custom_nav_menu_items_in_new_tab = new ASENHA\Classes\Custom_Nav_Menu_Items_In_New_Tab();
307 add_filter(
308 'wp_nav_menu_item_custom_fields',
309 [$custom_nav_menu_items_in_new_tab, 'add_custom_nav_menu_open_in_new_tab_field'],
310 10,
311 4
312 );
313 add_action(
314 'wp_update_nav_menu_item',
315 [$custom_nav_menu_items_in_new_tab, 'save_custom_nav_menu_open_in_new_tab_status'],
316 10,
317 3
318 );
319 add_action(
320 'nav_menu_link_attributes',
321 [$custom_nav_menu_items_in_new_tab, 'add_attributes_to_custom_nav_menu_item'],
322 10,
323 3
324 );
325 }
326 // Auto-Publishing of Posts with Missed Schedules
327 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
328 $auto_publish_posts_with_missed_schedule = new ASENHA\Classes\Auto_Publish_Posts_With_Missed_Schedule();
329 add_action( 'wp_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
330 add_action( 'admin_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
331 }
332 // Hide or Modify Elements / Clean Up Admin Bar
333 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
334 $cleanup_admin_bar = new ASENHA\Classes\Cleanup_Admin_Bar();
335 // Priority 5 to execute earlier than the normal 10. This is for removing default items.
336 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'modify_admin_bar_menu'], 5 );
337 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'remove_howdy'], PHP_INT_MAX - 100 );
338 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
339 add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] );
340 }
341 }
342 // Hide Admin Notices
343 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
344 $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices();
345 add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 );
346 // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] );
347 // add_action( 'admin_notices', [ $hide_admin_notices, 'show_test_admin_notice_for_all_user_roles' ] );
348 add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] );
349 add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] );
350 }
351 // Disable Dashboard Widgets
352 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
353 $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets();
354 add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], PHP_INT_MAX );
355 add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] );
356 }
357 // Hide Admin Bar
358 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) {
359 $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar();
360 }
361 // On the frontend
362 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'] ) ) {
363 add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] );
364 }
365 // Wider Admin Menu
366 if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) {
367 $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu();
368 add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 );
369 }
370 // Admin Menu Organizer
371 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
372 $options_extra = get_option( ASENHA_SLUG_U . '_extra', array() );
373 $admin_menu_options = ( isset( $options_extra['admin_menu'] ) ? $options_extra['admin_menu'] : array() );
374 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
375 if ( array_key_exists( 'admin_menu_organizer_sticky_collapse_menu', $options ) && $options['admin_menu_organizer_sticky_collapse_menu'] ) {
376 add_action( 'admin_head', [$admin_menu_organizer, 'make_collapse_menu_item_sticky'] );
377 }
378 add_action( 'admin_menu', [$admin_menu_organizer, 'add_menu_item'] );
379 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
380 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
381 if ( array_key_exists( 'custom_menu_order', $admin_menu_options ) ) {
382 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
383 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
384 }
385 if ( array_key_exists( 'custom_menu_titles', $admin_menu_options ) ) {
386 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 10000000001 );
387 add_action( 'init', [$admin_menu_organizer, 'apply_custom_title_for_posts_menu'] );
388 }
389 if ( array_key_exists( 'custom_menu_hidden', $admin_menu_options ) || array_key_exists( 'custom_menu_always_hidden', $admin_menu_options ) ) {
390 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
391 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
392 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
393 }
394 add_action( 'wp_ajax_save_admin_menu', [$admin_menu_organizer, 'save_admin_menu'] );
395 }
396 // Show Custom Taxonomy Filters
397 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
398 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
399 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
400 }
401 // Enhance List Tables
402 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
403 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
404 // Show Featured Image Column
405 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
406 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
407 }
408 // Show Excerpt Column
409 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
410 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
411 }
412 // Show Last Modified Column
413 if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) {
414 add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] );
415 }
416 // Show ID Column
417 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
418 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
419 }
420 // Show File Size Column in Media Library
421 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
422 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
423 add_action(
424 'manage_media_custom_column',
425 [$enhance_list_tables, 'display_file_size'],
426 10,
427 2
428 );
429 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
430 }
431 // Show ID in Action Row
432 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
433 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
434 }
435 // Hide Date Column
436 if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) {
437 add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] );
438 }
439 // Hide Comments Column
440 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
441 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
442 }
443 // Hide Post Tags Column
444 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
445 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
446 }
447 }
448 // Various Admin UI Enhancements
449 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
450 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
451 // Display Active Plugins First
452 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
453 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
454 }
455 }
456 // Custom Admin Footer Text
457 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
458 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
459 // Update footer text
460 if ( is_asenha() ) {
461 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
462 } else {
463 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
464 }
465 // Update footer version text
466 if ( is_asenha() ) {
467 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
468 } else {
469 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
470 }
471 } else {
472 // Update footer text
473 if ( is_asenha() ) {
474 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
475 }
476 // Update footer version text
477 if ( is_asenha() ) {
478 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
479 }
480 }
481 // =================================================================
482 // LOG IN | LOG OUT
483 // =================================================================
484 // Change Login URL
485 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
486 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
487 $change_login_url = new ASENHA\Classes\Change_Login_URL();
488 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
489 if ( in_array( 'gravityforms/gravityforms.php', get_option( 'active_plugins', array() ) ) ) {
490 // Load earlier than Gravity Forms process_exterior_pages()
491 add_action( 'wp', [$change_login_url, 'prevent_redirect_to_custom_login_url'], 0 );
492 }
493 add_filter(
494 'login_url',
495 [$change_login_url, 'customize_login_url'],
496 10,
497 3
498 );
499 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
500 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
501 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
502 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
503 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
504 // No need to modify logout_url or perform redirect on logout
505 // The customized login URL is already being returned after logout
506 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
507 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
508 }
509 }
510 // Login ID Type
511 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
512 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
513 $login_id_type = new ASENHA\Classes\Login_ID_Type();
514 switch ( $options['login_id_type'] ) {
515 case 'username':
516 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
517 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
518 add_filter(
519 'gettext',
520 [$login_id_type, 'gettext_login_id_username'],
521 20,
522 3
523 );
524 break;
525 case 'email':
526 add_filter(
527 'authenticate',
528 [$login_id_type, 'authenticate_email'],
529 20,
530 2
531 );
532 add_filter(
533 'gettext',
534 [$login_id_type, 'gettext_login_id_email'],
535 20,
536 3
537 );
538 break;
539 }
540 }
541 }
542 // Use Site Identity on the Login Page
543 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
544 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
545 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
546 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
547 }
548 // Login Logout Menu
549 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
550 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
551 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
552 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
553 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
554 }
555 // Last Login Column
556 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
557 $last_login_column = new ASENHA\Classes\Last_Login_Column();
558 add_action(
559 'wp_login',
560 [$last_login_column, 'log_login_datetime'],
561 3,
562 1
563 );
564 // Earlier than Redirect After Login
565 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
566 add_filter(
567 'manage_users_custom_column',
568 [$last_login_column, 'show_last_login_info'],
569 10,
570 3
571 );
572 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
573 }
574 // Registration Date Column
575 if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) {
576 $registration_date_column = new ASENHA\Classes\Registration_Date_Column();
577 add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] );
578 add_filter(
579 'manage_users_custom_column',
580 [$registration_date_column, 'display_registration_date'],
581 10,
582 3
583 );
584 }
585 // Redirect After Login
586 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
587 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
588 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
589 add_filter(
590 'wp_login',
591 [$redirect_after_login, 'redirect_after_login'],
592 5,
593 2
594 );
595 }
596 }
597 // Redirect After Logout
598 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
599 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
600 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
601 add_action(
602 'wp_logout',
603 [$redirect_after_logout, 'redirect_after_logout'],
604 5,
605 1
606 );
607 // load earlier than Change Login URL add_action
608 // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 );
609 // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 );
610 }
611 }
612 // Enable Custom Admin / Frontend CSS
613 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'] ) {
614 $custom_css = new ASENHA\Classes\Custom_Css();
615 }
616 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
617 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
618 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
619 }
620 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
621 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
622 }
623 // Insert <head>, <body> and <footer> code
624 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
625 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
626 if ( isset( $options['head_code_priority'] ) ) {
627 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
628 } else {
629 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
630 }
631 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
632 if ( isset( $options['body_code_priority'] ) ) {
633 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
634 } else {
635 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
636 }
637 }
638 if ( isset( $options['footer_code_priority'] ) ) {
639 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
640 } else {
641 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
642 }
643 }
644 // Custom Body Class
645 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
646 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
647 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
648 add_action(
649 'add_meta_boxes',
650 [$custom_body_class, 'add_custom_body_class_meta_box'],
651 10,
652 2
653 );
654 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
655 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
656 }
657 }
658 // Manage ads.txt and app-ads.txt
659 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
660 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
661 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
662 }
663 // Manage robots.txt
664 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
665 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
666 add_filter(
667 'robots_txt',
668 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
669 PHP_INT_MAX,
670 2
671 );
672 }
673 // =================================================================
674 // DISABLE COMPONENTS
675 // =================================================================
676 // Disable Gutenberg
677 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
678 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
679 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
680 if ( !class_exists( 'Classic_Editor' ) ) {
681 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
682 }
683 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
684 add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] );
685 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
686 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 999999 );
687 add_action( 'wp_footer', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'] );
688 }
689 }
690 }
691 // Disable Comments
692 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
693 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
694 $disable_comments = new ASENHA\Classes\Disable_Comments();
695 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
696 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
697 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
698 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
699 add_filter(
700 'comments_array',
701 [$disable_comments, 'maybe_return_empty_comments'],
702 20,
703 2
704 );
705 add_filter(
706 'comments_open',
707 [$disable_comments, 'close_comments_pings_on_frontend'],
708 20,
709 2
710 );
711 add_filter(
712 'pings_open',
713 [$disable_comments, 'close_comments_pings_on_frontend'],
714 20,
715 2
716 );
717 add_filter(
718 'get_comments_number',
719 [$disable_comments, 'return_zero_comments_count'],
720 20,
721 2
722 );
723 // Disable commenting via XML-RPC
724 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
725 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
726 // Disable commenting via REST API
727 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
728 add_filter(
729 'rest_pre_insert_comment',
730 [$disable_comments, 'return_blank_comment'],
731 10,
732 2
733 );
734 }
735 }
736 // Disable REST API
737 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
738 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
739 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
740 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
741 } else {
742 // REST API 1.x
743 add_filter( 'json_enabled', '__return_false' );
744 add_filter( 'json_jsonp_enabled', '__return_false' );
745 // REST API 2.x
746 add_filter( 'rest_enabled', '__return_false' );
747 add_filter( 'rest_jsonp_enabled', '__return_false' );
748 }
749 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
750 // Disable REST API links in HTML <head>
751 remove_action(
752 'template_redirect',
753 'rest_output_link_header',
754 11,
755 0
756 );
757 // Disable REST API link in HTTP headers
758 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
759 // Remove REST API URL from the WP RSD endpoint.
760 }
761 // Disable Feeds
762 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
763 remove_action( 'wp_head', 'feed_links', 2 );
764 // Remove feed links in <head>
765 remove_action( 'wp_head', 'feed_links_extra', 3 );
766 // Remove feed links in <head>
767 remove_action(
768 'do_feed_rdf',
769 'do_feed_rdf',
770 10,
771 0
772 );
773 remove_action(
774 'do_feed_rss',
775 'do_feed_rss',
776 10,
777 0
778 );
779 remove_action(
780 'do_feed_rss2',
781 'do_feed_rss2',
782 10,
783 1
784 );
785 remove_action(
786 'do_feed_atom',
787 'do_feed_atom',
788 10,
789 1
790 );
791 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
792 add_action(
793 'template_redirect',
794 [$disable_feeds, 'redirect_feed_to_403'],
795 10,
796 1
797 );
798 }
799 // Disable Embeds
800 if ( array_key_exists( 'disable_embeds', $options ) && $options['disable_embeds'] ) {
801 $disable_embeds = new ASENHA\Classes\Disable_Embeds();
802 add_action( 'init', [$disable_embeds, 'disable_embeds_init'], 9999 );
803 $activation_embeds = new ASENHA\Classes\Activation();
804 add_action( 'init', [$activation_embeds, 'maybe_flush_disable_embeds_rewrite_rules'], 9999 );
805 }
806 // Disable All Updates
807 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
808 $disable_updates = new ASENHA\Classes\Disable_Updates();
809 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
810 // Disable core update
811 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
812 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
813 // Disable theme updates
814 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
815 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
816 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
817 // Disable plugin updates
818 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
819 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
820 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
821 // Disable auto updates
822 add_filter( 'automatic_updater_disabled', '__return_true' );
823 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
824 define( 'AUTOMATIC_UPDATER_DISABLED', true );
825 }
826 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
827 define( 'WP_AUTO_UPDATE_CORE', false );
828 }
829 add_filter( 'auto_update_core', '__return_false' );
830 add_filter( 'wp_auto_update_core', '__return_false' );
831 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
832 add_filter( 'allow_major_auto_core_updates', '__return_false' );
833 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
834 add_filter( 'auto_update_plugin', '__return_false' );
835 add_filter( 'auto_update_theme', '__return_false' );
836 add_filter( 'auto_update_translation', '__return_false' );
837 remove_action( 'init', 'wp_schedule_update_checks' );
838 // Disable update emails
839 add_filter( 'auto_core_update_send_email', '__return_false' );
840 add_filter( 'send_core_update_notification_email', '__return_false' );
841 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
842 // Remove Dashboard >> Updates menu
843 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
844 }
845 // Disable Author Archives
846 if ( array_key_exists( 'disable_author_archives', $options ) && $options['disable_author_archives'] ) {
847 $disable_author_archives = new ASENHA\Classes\Disable_Author_Archives();
848 add_action( 'template_redirect', [$disable_author_archives, 'redirect_to_404'], 1 );
849 add_filter( 'author_link', [$disable_author_archives, 'disable_frontend_author_link'], PHP_INT_MAX );
850 add_filter( 'user_row_actions', [$disable_author_archives, 'remove_user_view_action'], PHP_INT_MAX );
851 if ( class_exists( 'WP_Sitemaps' ) ) {
852 add_filter(
853 'wp_sitemaps_add_provider',
854 [$disable_author_archives, 'remove_users_from_sitemap'],
855 PHP_INT_MAX,
856 2
857 );
858 }
859 add_filter( 'author_rewrite_rules', [$disable_author_archives, 'disable_rewrite_rules_for_authors'], 10 );
860 }
861 // Disable Smaller Components
862 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
863 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
864 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
865 remove_action( 'wp_head', 'wp_generator' );
866 }
867 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
868 add_filter(
869 'the_generator',
870 [$disable_smaller_components, 'remove_feed_generator_tag'],
871 10,
872 2
873 );
874 }
875 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
876 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
877 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
878 }
879 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
880 remove_action( 'wp_head', 'wlwmanifest_link' );
881 }
882 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
883 remove_action( 'wp_head', 'rsd_link' );
884 }
885 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
886 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L358
887 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
888 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L363
889 remove_action(
890 'template_redirect',
891 'wp_shortlink_header',
892 11,
893 0
894 );
895 }
896 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
897 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
898 }
899 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
900 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
901 }
902 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
903 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
904 }
905 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
906 // Disables the block editor from managing widgets in the Gutenberg plugin.
907 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
908 // Disables the block editor from managing widgets.
909 add_filter( 'use_widgets_block_editor', '__return_false' );
910 }
911 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
912 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
913 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
914 }
915 if ( array_key_exists( 'disable_application_passwords', $options ) && $options['disable_application_passwords'] ) {
916 add_filter( 'wp_is_application_passwords_available', '__return_false' );
917 }
918 if ( array_key_exists( 'disable_site_admin_email_verification_screen', $options ) && $options['disable_site_admin_email_verification_screen'] ) {
919 add_filter( 'admin_email_check_interval', '__return_false' );
920 }
921 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
922 if ( $options['disable_plugin_theme_editor'] ) {
923 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
924 } else {
925 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
926 }
927 }
928 }
929 // =================================================================
930 // SECURITY
931 // =================================================================
932 // Limit Login Attempts
933 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
934 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
935 add_filter(
936 'authenticate',
937 [$limit_login_attempts, 'maybe_allow_login'],
938 999,
939 3
940 );
941 // Very low priority so it is processed last
942 add_action(
943 'wp_login_errors',
944 [$limit_login_attempts, 'login_error_handler'],
945 999,
946 2
947 );
948 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
949 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
950 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
951 // Higher priority than one in Change Login URL
952 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
953 // Log table clean up
954 add_action( 'added_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
955 add_action( 'updated_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
956 add_action( 'plugins_loaded', [$limit_login_attempts, 'clear_or_schedule_log_clean_up_by_amount'] );
957 add_action( 'asenha_failed_login_attempts_log_cleanup_by_amount', [$limit_login_attempts, 'perform_failed_login_attempts_log_clean_up_by_amount'] );
958 }
959 // Obfuscate Author Slugs
960 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
961 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
962 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
963 add_filter(
964 'author_link',
965 [$obfuscate_author_slugs, 'alter_author_link'],
966 10,
967 3
968 );
969 add_filter(
970 'rest_prepare_user',
971 [$obfuscate_author_slugs, 'alter_json_users'],
972 10,
973 3
974 );
975 }
976 // Email Address Obfuscator
977 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
978 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
979 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
980 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
981 add_filter( 'widget_text', 'shortcode_unautop' );
982 add_filter( 'widget_text', 'do_shortcode' );
983 }
984 // Disable XML-RPC
985 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
986 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
987 add_filter( 'xmlrpc_enabled', '__return_false' );
988 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
989 add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] );
990 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
991 // Hide xmlrpc.php in HTTP response headers
992 add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] );
993 add_filter( 'pings_open', '__return_false', PHP_INT_MAX );
994 }
995 // =================================================================
996 // OPTIMIZATIONS
997 // =================================================================
998 // Image Upload Control
999 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
1000 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
1001 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
1002 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
1003 add_filter(
1004 'wp_handle_upload_prefilter',
1005 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
1006 10,
1007 1
1008 );
1009 add_filter(
1010 'wp_handle_upload',
1011 [$image_upload_control, 'maybe_fix_image_orientation'],
1012 1,
1013 3
1014 );
1015 }
1016 // Resize and convert happens here
1017 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
1018 if ( array_key_exists( 'disabled_image_sizes', $options ) && isset( $options['disabled_image_sizes'] ) ) {
1019 add_filter(
1020 'intermediate_image_sizes_advanced',
1021 [$image_upload_control, 'disable_intermediate_image_sizes__premium_only'],
1022 10,
1023 2
1024 );
1025 }
1026 }
1027 // Revisions Control
1028 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
1029 $revisions_control = new ASENHA\Classes\Revisions_Control();
1030 add_filter(
1031 'wp_revisions_to_keep',
1032 [$revisions_control, 'limit_revisions_to_max_number'],
1033 10,
1034 2
1035 );
1036 }
1037 // Heartbeat Control
1038 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
1039 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
1040 add_filter(
1041 'heartbeat_settings',
1042 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
1043 99,
1044 2
1045 );
1046 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1047 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1048 }
1049 // =================================================================
1050 // UTILITIES
1051 // =================================================================
1052 // SMTP Email Delivery
1053 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
1054 $email_delivery = new ASENHA\Classes\Email_Delivery();
1055 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
1056 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
1057 }
1058 // Multiple User Roles
1059 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
1060 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
1061 // Show roles checkboxes
1062 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1063 // for when user edits their own profile
1064 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1065 // for when editing other user's profile
1066 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1067 // new user creation
1068 // Save roles selections
1069 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
1070 // for when user edits their own profile
1071 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
1072 // for when editing other user's profile
1073 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
1074 // new user creation
1075 }
1076 // Image Sizes Panel
1077 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
1078 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
1079 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
1080 }
1081 // View Admin as Role
1082 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1083 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1084 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1085 // Priority 8 so it is next to username section
1086 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1087 add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 );
1088 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1089 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1090 }
1091 // Password Protection
1092 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1093 $password_protection = new ASENHA\Classes\Password_Protection();
1094 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1095 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1096 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1097 // load early
1098 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1099 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1100 if ( function_exists( 'wp_site_icon' ) ) {
1101 // WP v4.3+
1102 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1103 }
1104 }
1105 // Maintenance Mode
1106 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1107 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1108 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1109 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1110 }
1111 // Redirect 404 to Homepage
1112 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1113 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1114 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1115 }
1116 // Display System Summary
1117 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1118 // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php';
1119 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1120 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1121 }
1122 // Search Engines Visibility Status
1123 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1124 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1125 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1126 }
1127 }
1128
1129 }
1130
1131 Admin_Site_Enhancements::get_instance();