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