PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.9.2
Admin and Site Enhancements (ASE) v7.9.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 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
1106 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 Author Archives
826 if ( array_key_exists( 'disable_author_archives', $options ) && $options['disable_author_archives'] ) {
827 $disable_author_archives = new ASENHA\Classes\Disable_Author_Archives();
828 add_action( 'template_redirect', [$disable_author_archives, 'redirect_to_404'], 1 );
829 add_filter( 'author_link', [$disable_author_archives, 'disable_frontend_author_link'], PHP_INT_MAX );
830 add_filter( 'user_row_actions', [$disable_author_archives, 'remove_user_view_action'], PHP_INT_MAX );
831 if ( class_exists( 'WP_Sitemaps' ) ) {
832 add_filter(
833 'wp_sitemaps_add_provider',
834 [$disable_author_archives, 'remove_users_from_sitemap'],
835 PHP_INT_MAX,
836 2
837 );
838 }
839 add_filter( 'author_rewrite_rules', [$disable_author_archives, 'disable_rewrite_rules_for_authors'], 10 );
840 }
841 // Disable Smaller Components
842 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
843 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
844 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
845 remove_action( 'wp_head', 'wp_generator' );
846 }
847 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
848 add_filter(
849 'the_generator',
850 [$disable_smaller_components, 'remove_feed_generator_tag'],
851 10,
852 2
853 );
854 }
855 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
856 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
857 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
858 }
859 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
860 remove_action( 'wp_head', 'wlwmanifest_link' );
861 }
862 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
863 remove_action( 'wp_head', 'rsd_link' );
864 }
865 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
866 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
867 remove_action(
868 'template_redirect',
869 'wp_shortlink_header',
870 100,
871 0
872 );
873 }
874 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
875 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
876 }
877 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
878 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
879 }
880 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
881 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
882 }
883 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
884 // Disables the block editor from managing widgets in the Gutenberg plugin.
885 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
886 // Disables the block editor from managing widgets.
887 add_filter( 'use_widgets_block_editor', '__return_false' );
888 }
889 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
890 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
891 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
892 }
893 if ( array_key_exists( 'disable_application_passwords', $options ) && $options['disable_application_passwords'] ) {
894 add_filter( 'wp_is_application_passwords_available', '__return_false' );
895 }
896 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
897 if ( $options['disable_plugin_theme_editor'] ) {
898 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
899 } else {
900 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
901 }
902 }
903 }
904 // =================================================================
905 // SECURITY
906 // =================================================================
907 // Limit Login Attempts
908 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
909 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
910 add_filter(
911 'authenticate',
912 [$limit_login_attempts, 'maybe_allow_login'],
913 999,
914 3
915 );
916 // Very low priority so it is processed last
917 add_action(
918 'wp_login_errors',
919 [$limit_login_attempts, 'login_error_handler'],
920 999,
921 2
922 );
923 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
924 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
925 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
926 // Higher priority than one in Change Login URL
927 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
928 // Log table clean up
929 add_action( 'added_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
930 add_action( 'updated_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
931 add_action( 'plugins_loaded', [$limit_login_attempts, 'clear_or_schedule_log_clean_up_by_amount'] );
932 add_action( 'asenha_failed_login_attempts_log_cleanup_by_amount', [$limit_login_attempts, 'perform_failed_login_attempts_log_clean_up_by_amount'] );
933 }
934 // Obfuscate Author Slugs
935 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
936 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
937 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
938 add_filter(
939 'author_link',
940 [$obfuscate_author_slugs, 'alter_author_link'],
941 10,
942 3
943 );
944 add_filter(
945 'rest_prepare_user',
946 [$obfuscate_author_slugs, 'alter_json_users'],
947 10,
948 3
949 );
950 }
951 // Email Address Obfuscator
952 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
953 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
954 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
955 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
956 add_filter( 'widget_text', 'shortcode_unautop' );
957 add_filter( 'widget_text', 'do_shortcode' );
958 }
959 // Disable XML-RPC
960 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
961 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
962 add_filter( 'xmlrpc_enabled', '__return_false' );
963 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
964 add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] );
965 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
966 // Hide xmlrpc.php in HTTP response headers
967 add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] );
968 add_filter( 'pings_open', '__return_false', PHP_INT_MAX );
969 }
970 // =================================================================
971 // OPTIMIZATIONS
972 // =================================================================
973 // Image Upload Control
974 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
975 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
976 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
977 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
978 add_filter(
979 'wp_handle_upload_prefilter',
980 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
981 10,
982 1
983 );
984 add_filter(
985 'wp_handle_upload',
986 [$image_upload_control, 'maybe_fix_image_orientation'],
987 1,
988 3
989 );
990 }
991 // Resize and convert happens here
992 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
993 if ( array_key_exists( 'disabled_image_sizes', $options ) && isset( $options['disabled_image_sizes'] ) ) {
994 add_filter(
995 'intermediate_image_sizes_advanced',
996 [$image_upload_control, 'disable_intermediate_image_sizes__premium_only'],
997 10,
998 2
999 );
1000 }
1001 }
1002 // Revisions Control
1003 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
1004 $revisions_control = new ASENHA\Classes\Revisions_Control();
1005 add_filter(
1006 'wp_revisions_to_keep',
1007 [$revisions_control, 'limit_revisions_to_max_number'],
1008 10,
1009 2
1010 );
1011 }
1012 // Heartbeat Control
1013 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
1014 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
1015 add_filter(
1016 'heartbeat_settings',
1017 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
1018 99,
1019 2
1020 );
1021 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1022 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1023 }
1024 // =================================================================
1025 // UTILITIES
1026 // =================================================================
1027 // SMTP Email Delivery
1028 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
1029 $email_delivery = new ASENHA\Classes\Email_Delivery();
1030 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
1031 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
1032 }
1033 // Multiple User Roles
1034 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
1035 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
1036 // Show roles checkboxes
1037 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1038 // for when user edits their own profile
1039 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1040 // for when editing other user's profile
1041 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1042 // new user creation
1043 // Save roles selections
1044 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
1045 // for when user edits their own profile
1046 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
1047 // for when editing other user's profile
1048 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
1049 // new user creation
1050 }
1051 // Image Sizes Panel
1052 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
1053 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
1054 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
1055 }
1056 // View Admin as Role
1057 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1058 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1059 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1060 // Priority 8 so it is next to username section
1061 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1062 add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 );
1063 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1064 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1065 }
1066 // Password Protection
1067 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1068 $password_protection = new ASENHA\Classes\Password_Protection();
1069 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1070 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1071 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1072 // load early
1073 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1074 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1075 if ( function_exists( 'wp_site_icon' ) ) {
1076 // WP v4.3+
1077 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1078 }
1079 }
1080 // Maintenance Mode
1081 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1082 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1083 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1084 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1085 }
1086 // Redirect 404 to Homepage
1087 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1088 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1089 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1090 }
1091 // Display System Summary
1092 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1093 // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php';
1094 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1095 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1096 }
1097 // Search Engines Visibility Status
1098 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1099 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1100 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1101 }
1102 }
1103
1104 }
1105
1106 Admin_Site_Enhancements::get_instance();