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