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