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