PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 8.2.2
Admin and Site Enhancements (ASE) v8.2.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 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
1113 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 add_action( 'admin_menu', [$admin_menu_organizer, 'add_menu_item'] );
366 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
367 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
368 if ( array_key_exists( 'custom_menu_order', $admin_menu_options ) ) {
369 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
370 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
371 }
372 if ( array_key_exists( 'custom_menu_titles', $admin_menu_options ) ) {
373 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 9999999995 );
374 add_action( 'init', [$admin_menu_organizer, 'apply_custom_title_for_posts_menu'] );
375 }
376 if ( array_key_exists( 'custom_menu_hidden', $admin_menu_options ) || array_key_exists( 'custom_menu_always_hidden', $admin_menu_options ) ) {
377 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
378 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
379 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
380 }
381 add_action( 'wp_ajax_save_admin_menu', [$admin_menu_organizer, 'save_admin_menu'] );
382 }
383 // Show Custom Taxonomy Filters
384 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
385 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
386 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
387 }
388 // Enhance List Tables
389 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
390 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
391 // Show Featured Image Column
392 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
393 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
394 }
395 // Show Excerpt Column
396 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
397 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
398 }
399 // Show Last Modified Column
400 if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) {
401 add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] );
402 }
403 // Show ID Column
404 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
405 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
406 }
407 // Show File Size Column in Media Library
408 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
409 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
410 add_action(
411 'manage_media_custom_column',
412 [$enhance_list_tables, 'display_file_size'],
413 10,
414 2
415 );
416 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
417 }
418 // Show ID in Action Row
419 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
420 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
421 }
422 // Hide Date Column
423 if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) {
424 add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] );
425 }
426 // Hide Comments Column
427 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
428 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
429 }
430 // Hide Post Tags Column
431 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
432 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
433 }
434 }
435 // Various Admin UI Enhancements
436 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
437 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
438 // Display Active Plugins First
439 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
440 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
441 }
442 }
443 // Custom Admin Footer Text
444 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
445 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
446 // Update footer text
447 if ( is_asenha() ) {
448 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
449 } else {
450 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
451 }
452 // Update footer version text
453 if ( is_asenha() ) {
454 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
455 } else {
456 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
457 }
458 } else {
459 // Update footer text
460 if ( is_asenha() ) {
461 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
462 }
463 // Update footer version text
464 if ( is_asenha() ) {
465 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
466 }
467 }
468 // =================================================================
469 // LOG IN | LOG OUT
470 // =================================================================
471 // Change Login URL
472 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
473 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
474 $change_login_url = new ASENHA\Classes\Change_Login_URL();
475 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
476 if ( in_array( 'gravityforms/gravityforms.php', get_option( 'active_plugins', array() ) ) ) {
477 // Load earlier than Gravity Forms process_exterior_pages()
478 add_action( 'wp', [$change_login_url, 'prevent_redirect_to_custom_login_url'], 0 );
479 }
480 add_filter(
481 'login_url',
482 [$change_login_url, 'customize_login_url'],
483 10,
484 3
485 );
486 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
487 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
488 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
489 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
490 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
491 // No need to modify logout_url or perform redirect on logout
492 // The customized login URL is already being returned after logout
493 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
494 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
495 }
496 }
497 // Login ID Type
498 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
499 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
500 $login_id_type = new ASENHA\Classes\Login_ID_Type();
501 switch ( $options['login_id_type'] ) {
502 case 'username':
503 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
504 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
505 add_filter(
506 'gettext',
507 [$login_id_type, 'gettext_login_id_username'],
508 20,
509 3
510 );
511 break;
512 case 'email':
513 add_filter(
514 'authenticate',
515 [$login_id_type, 'authenticate_email'],
516 20,
517 2
518 );
519 add_filter(
520 'gettext',
521 [$login_id_type, 'gettext_login_id_email'],
522 20,
523 3
524 );
525 break;
526 }
527 }
528 }
529 // Use Site Identity on the Login Page
530 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
531 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
532 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
533 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
534 }
535 // Login Logout Menu
536 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
537 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
538 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
539 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
540 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
541 }
542 // Last Login Column
543 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
544 $last_login_column = new ASENHA\Classes\Last_Login_Column();
545 add_action(
546 'wp_login',
547 [$last_login_column, 'log_login_datetime'],
548 3,
549 1
550 );
551 // Earlier than Redirect After Login
552 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
553 add_filter(
554 'manage_users_custom_column',
555 [$last_login_column, 'show_last_login_info'],
556 10,
557 3
558 );
559 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
560 }
561 // Registration Date Column
562 if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) {
563 $registration_date_column = new ASENHA\Classes\Registration_Date_Column();
564 add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] );
565 add_filter(
566 'manage_users_custom_column',
567 [$registration_date_column, 'display_registration_date'],
568 10,
569 3
570 );
571 }
572 // Redirect After Login
573 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
574 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
575 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
576 add_filter(
577 'wp_login',
578 [$redirect_after_login, 'redirect_after_login'],
579 5,
580 2
581 );
582 }
583 }
584 // Redirect After Logout
585 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
586 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
587 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
588 add_action(
589 'wp_logout',
590 [$redirect_after_logout, 'redirect_after_logout'],
591 5,
592 1
593 );
594 // load earlier than Change Login URL add_action
595 // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 );
596 // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 );
597 }
598 }
599 // Enable Custom Admin / Frontend CSS
600 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'] ) {
601 $custom_css = new ASENHA\Classes\Custom_Css();
602 }
603 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
604 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
605 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
606 }
607 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
608 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
609 }
610 // Insert <head>, <body> and <footer> code
611 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
612 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
613 if ( isset( $options['head_code_priority'] ) ) {
614 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
615 } else {
616 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
617 }
618 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
619 if ( isset( $options['body_code_priority'] ) ) {
620 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
621 } else {
622 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
623 }
624 }
625 if ( isset( $options['footer_code_priority'] ) ) {
626 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
627 } else {
628 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
629 }
630 }
631 // Custom Body Class
632 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
633 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
634 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
635 add_action(
636 'add_meta_boxes',
637 [$custom_body_class, 'add_custom_body_class_meta_box'],
638 10,
639 2
640 );
641 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
642 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
643 }
644 }
645 // Manage ads.txt and app-ads.txt
646 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
647 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
648 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
649 }
650 // Manage robots.txt
651 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
652 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
653 add_filter(
654 'robots_txt',
655 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
656 PHP_INT_MAX,
657 2
658 );
659 }
660 // =================================================================
661 // DISABLE COMPONENTS
662 // =================================================================
663 // Disable Gutenberg
664 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
665 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
666 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
667 if ( !class_exists( 'Classic_Editor' ) ) {
668 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
669 }
670 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
671 add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] );
672 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
673 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 999999 );
674 add_action( 'wp_footer', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'] );
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 Feeds
787 if ( array_key_exists( 'disable_embeds', $options ) && $options['disable_embeds'] ) {
788 $disable_embeds = new ASENHA\Classes\Disable_Embeds();
789 add_action( 'init', [$disable_embeds, 'disable_embeds_init'], 9999 );
790 }
791 // Disable All Updates
792 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
793 $disable_updates = new ASENHA\Classes\Disable_Updates();
794 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
795 // Disable core update
796 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
797 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
798 // Disable theme updates
799 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
800 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
801 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
802 // Disable plugin updates
803 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
804 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
805 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
806 // Disable auto updates
807 add_filter( 'automatic_updater_disabled', '__return_true' );
808 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
809 define( 'AUTOMATIC_UPDATER_DISABLED', true );
810 }
811 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
812 define( 'WP_AUTO_UPDATE_CORE', false );
813 }
814 add_filter( 'auto_update_core', '__return_false' );
815 add_filter( 'wp_auto_update_core', '__return_false' );
816 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
817 add_filter( 'allow_major_auto_core_updates', '__return_false' );
818 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
819 add_filter( 'auto_update_plugin', '__return_false' );
820 add_filter( 'auto_update_theme', '__return_false' );
821 add_filter( 'auto_update_translation', '__return_false' );
822 remove_action( 'init', 'wp_schedule_update_checks' );
823 // Disable update emails
824 add_filter( 'auto_core_update_send_email', '__return_false' );
825 add_filter( 'send_core_update_notification_email', '__return_false' );
826 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
827 // Remove Dashboard >> Updates menu
828 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
829 }
830 // Disable Author Archives
831 if ( array_key_exists( 'disable_author_archives', $options ) && $options['disable_author_archives'] ) {
832 $disable_author_archives = new ASENHA\Classes\Disable_Author_Archives();
833 add_action( 'template_redirect', [$disable_author_archives, 'redirect_to_404'], 1 );
834 add_filter( 'author_link', [$disable_author_archives, 'disable_frontend_author_link'], PHP_INT_MAX );
835 add_filter( 'user_row_actions', [$disable_author_archives, 'remove_user_view_action'], PHP_INT_MAX );
836 if ( class_exists( 'WP_Sitemaps' ) ) {
837 add_filter(
838 'wp_sitemaps_add_provider',
839 [$disable_author_archives, 'remove_users_from_sitemap'],
840 PHP_INT_MAX,
841 2
842 );
843 }
844 add_filter( 'author_rewrite_rules', [$disable_author_archives, 'disable_rewrite_rules_for_authors'], 10 );
845 }
846 // Disable Smaller Components
847 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
848 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
849 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
850 remove_action( 'wp_head', 'wp_generator' );
851 }
852 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
853 add_filter(
854 'the_generator',
855 [$disable_smaller_components, 'remove_feed_generator_tag'],
856 10,
857 2
858 );
859 }
860 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
861 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
862 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
863 }
864 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
865 remove_action( 'wp_head', 'wlwmanifest_link' );
866 }
867 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
868 remove_action( 'wp_head', 'rsd_link' );
869 }
870 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
871 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L358
872 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
873 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L363
874 remove_action(
875 'template_redirect',
876 'wp_shortlink_header',
877 11,
878 0
879 );
880 }
881 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
882 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
883 }
884 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
885 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
886 }
887 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
888 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
889 }
890 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
891 // Disables the block editor from managing widgets in the Gutenberg plugin.
892 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
893 // Disables the block editor from managing widgets.
894 add_filter( 'use_widgets_block_editor', '__return_false' );
895 }
896 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
897 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
898 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
899 }
900 if ( array_key_exists( 'disable_application_passwords', $options ) && $options['disable_application_passwords'] ) {
901 add_filter( 'wp_is_application_passwords_available', '__return_false' );
902 }
903 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
904 if ( $options['disable_plugin_theme_editor'] ) {
905 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
906 } else {
907 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
908 }
909 }
910 }
911 // =================================================================
912 // SECURITY
913 // =================================================================
914 // Limit Login Attempts
915 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
916 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
917 add_filter(
918 'authenticate',
919 [$limit_login_attempts, 'maybe_allow_login'],
920 999,
921 3
922 );
923 // Very low priority so it is processed last
924 add_action(
925 'wp_login_errors',
926 [$limit_login_attempts, 'login_error_handler'],
927 999,
928 2
929 );
930 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
931 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
932 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
933 // Higher priority than one in Change Login URL
934 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
935 // Log table clean up
936 add_action( 'added_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
937 add_action( 'updated_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
938 add_action( 'plugins_loaded', [$limit_login_attempts, 'clear_or_schedule_log_clean_up_by_amount'] );
939 add_action( 'asenha_failed_login_attempts_log_cleanup_by_amount', [$limit_login_attempts, 'perform_failed_login_attempts_log_clean_up_by_amount'] );
940 }
941 // Obfuscate Author Slugs
942 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
943 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
944 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
945 add_filter(
946 'author_link',
947 [$obfuscate_author_slugs, 'alter_author_link'],
948 10,
949 3
950 );
951 add_filter(
952 'rest_prepare_user',
953 [$obfuscate_author_slugs, 'alter_json_users'],
954 10,
955 3
956 );
957 }
958 // Email Address Obfuscator
959 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
960 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
961 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
962 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
963 add_filter( 'widget_text', 'shortcode_unautop' );
964 add_filter( 'widget_text', 'do_shortcode' );
965 }
966 // Disable XML-RPC
967 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
968 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
969 add_filter( 'xmlrpc_enabled', '__return_false' );
970 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
971 add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] );
972 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
973 // Hide xmlrpc.php in HTTP response headers
974 add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] );
975 add_filter( 'pings_open', '__return_false', PHP_INT_MAX );
976 }
977 // =================================================================
978 // OPTIMIZATIONS
979 // =================================================================
980 // Image Upload Control
981 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
982 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
983 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
984 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
985 add_filter(
986 'wp_handle_upload_prefilter',
987 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
988 10,
989 1
990 );
991 add_filter(
992 'wp_handle_upload',
993 [$image_upload_control, 'maybe_fix_image_orientation'],
994 1,
995 3
996 );
997 }
998 // Resize and convert happens here
999 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
1000 if ( array_key_exists( 'disabled_image_sizes', $options ) && isset( $options['disabled_image_sizes'] ) ) {
1001 add_filter(
1002 'intermediate_image_sizes_advanced',
1003 [$image_upload_control, 'disable_intermediate_image_sizes__premium_only'],
1004 10,
1005 2
1006 );
1007 }
1008 }
1009 // Revisions Control
1010 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
1011 $revisions_control = new ASENHA\Classes\Revisions_Control();
1012 add_filter(
1013 'wp_revisions_to_keep',
1014 [$revisions_control, 'limit_revisions_to_max_number'],
1015 10,
1016 2
1017 );
1018 }
1019 // Heartbeat Control
1020 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
1021 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
1022 add_filter(
1023 'heartbeat_settings',
1024 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
1025 99,
1026 2
1027 );
1028 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1029 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1030 }
1031 // =================================================================
1032 // UTILITIES
1033 // =================================================================
1034 // SMTP Email Delivery
1035 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
1036 $email_delivery = new ASENHA\Classes\Email_Delivery();
1037 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
1038 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
1039 }
1040 // Multiple User Roles
1041 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
1042 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
1043 // Show roles checkboxes
1044 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1045 // for when user edits their own profile
1046 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1047 // for when editing other user's profile
1048 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1049 // new user creation
1050 // Save roles selections
1051 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
1052 // for when user edits their own profile
1053 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
1054 // for when editing other user's profile
1055 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
1056 // new user creation
1057 }
1058 // Image Sizes Panel
1059 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
1060 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
1061 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
1062 }
1063 // View Admin as Role
1064 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1065 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1066 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1067 // Priority 8 so it is next to username section
1068 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1069 add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 );
1070 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1071 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1072 }
1073 // Password Protection
1074 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1075 $password_protection = new ASENHA\Classes\Password_Protection();
1076 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1077 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1078 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1079 // load early
1080 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1081 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1082 if ( function_exists( 'wp_site_icon' ) ) {
1083 // WP v4.3+
1084 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1085 }
1086 }
1087 // Maintenance Mode
1088 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1089 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1090 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1091 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1092 }
1093 // Redirect 404 to Homepage
1094 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1095 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1096 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1097 }
1098 // Display System Summary
1099 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1100 // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php';
1101 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1102 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1103 }
1104 // Search Engines Visibility Status
1105 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1106 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1107 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1108 }
1109 }
1110
1111 }
1112
1113 Admin_Site_Enhancements::get_instance();