PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.6.10
Admin and Site Enhancements (ASE) v7.6.10
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
1063 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 // Enqueue public scripts and styles
47 add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' );
48 // Dequeue scripts that prevents settings page from working
49 add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
50 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
51 add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
52 add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
53 // Add admin bar inline styles
54 add_action( 'admin_head', 'asenha_admin_bar_item_js_css' );
55 add_action( 'wp_head', 'asenha_admin_bar_item_js_css' );
56 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
57 // Mark that a user have supported ASE (via AJAX)
58 add_action( 'wp_ajax_have_supported', 'asenha_have_supported' );
59 // Dismiss upgrade nudge (via AJAX)
60 add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' );
61 // Dismiss promo nudge (via AJAX)
62 add_action( 'wp_ajax_dismiss_promo_nudge', 'asenha_dismiss_promo_nudge' );
63 // Dismiss support nudge (via AJAX)
64 add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' );
65 if ( function_exists( 'bwasenha_fs' ) ) {
66 bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' );
67 }
68 // Add style="display:[something];" to the safe CSS attributes.
69 // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329
70 // Ref: https://wordpress.stackexchange.com/a/195433
71 add_filter( 'safe_style_css', function ( $styles ) {
72 $styles[] = 'display';
73 return $styles;
74 } );
75 // ===== Activate features based on settings =====
76 // Get all WP Enhancements options, default to empty array in case it's not been created yet
77 $options = get_option( ASENHA_SLUG_U, array() );
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 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
347 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
348 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
349 if ( array_key_exists( 'custom_menu_order', $options ) ) {
350 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
351 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
352 }
353 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
354 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 9999999995 );
355 // For 'Posts' menu, if the title has been changed, try changing the labels for it everywhere
356 $custom_menu_titles = explode( ',', $options['custom_menu_titles'] );
357 foreach ( $custom_menu_titles as $custom_menu_title ) {
358 if ( false !== strpos( $custom_menu_title, 'menu-posts__' ) ) {
359 $custom_menu_title = explode( '__', $custom_menu_title );
360 $posts_custom_title = $custom_menu_title[1];
361 $posts_default_title = $wp_post_types['post']->label;
362 if ( $posts_default_title != $posts_custom_title ) {
363 add_filter( 'post_type_labels_post', [$admin_menu_organizer, 'change_post_labels'] );
364 add_action( 'init', [$admin_menu_organizer, 'change_post_object_label'] );
365 add_action( 'admin_menu', [$admin_menu_organizer, 'change_post_menu_label'], PHP_INT_MAX );
366 add_action( 'admin_bar_menu', [$admin_menu_organizer, 'change_wp_admin_bar'], 80 );
367 }
368 }
369 }
370 }
371 if ( array_key_exists( 'custom_menu_hidden', $options ) || array_key_exists( 'custom_menu_always_hidden', $options ) ) {
372 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
373 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
374 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
375 }
376 }
377 // Show Custom Taxonomy Filters
378 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
379 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
380 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
381 }
382 // Enhance List Tables
383 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
384 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
385 // Show Featured Image Column
386 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
387 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
388 }
389 // Show Excerpt Column
390 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
391 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
392 }
393 // Show Last Modified Column
394 if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) {
395 add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] );
396 }
397 // Show ID Column
398 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
399 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
400 }
401 // Show File Size Column in Media Library
402 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
403 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
404 add_action(
405 'manage_media_custom_column',
406 [$enhance_list_tables, 'display_file_size'],
407 10,
408 2
409 );
410 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
411 }
412 // Show ID in Action Row
413 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
414 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
415 }
416 // Hide Date Column
417 if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) {
418 add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] );
419 }
420 // Hide Comments Column
421 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
422 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
423 }
424 // Hide Post Tags Column
425 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
426 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
427 }
428 }
429 // Various Admin UI Enhancements
430 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
431 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
432 // Display Active Plugins First
433 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
434 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
435 }
436 }
437 // Custom Admin Footer Text
438 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
439 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
440 // Update footer text
441 if ( is_asenha() ) {
442 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
443 } else {
444 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
445 }
446 // Update footer version text
447 if ( is_asenha() ) {
448 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
449 } else {
450 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
451 }
452 } else {
453 // Update footer text
454 if ( is_asenha() ) {
455 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
456 }
457 // Update footer version text
458 if ( is_asenha() ) {
459 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
460 }
461 }
462 // =================================================================
463 // LOG IN | LOG OUT
464 // =================================================================
465 // Change Login URL
466 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
467 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
468 $change_login_url = new ASENHA\Classes\Change_Login_URL();
469 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
470 add_filter(
471 'login_url',
472 [$change_login_url, 'customize_login_url'],
473 10,
474 3
475 );
476 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
477 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
478 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
479 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
480 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
481 // No need to modify logout_url or perform redirect on logout
482 // The customized login URL is already being returned after logout
483 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
484 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
485 }
486 }
487 // Login ID Type
488 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
489 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
490 $login_id_type = new ASENHA\Classes\Login_ID_Type();
491 switch ( $options['login_id_type'] ) {
492 case 'username':
493 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
494 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
495 add_filter(
496 'gettext',
497 [$login_id_type, 'gettext_login_id_username'],
498 20,
499 3
500 );
501 break;
502 case 'email':
503 add_filter(
504 'authenticate',
505 [$login_id_type, 'authenticate_email'],
506 20,
507 2
508 );
509 add_filter(
510 'gettext',
511 [$login_id_type, 'gettext_login_id_email'],
512 20,
513 3
514 );
515 break;
516 }
517 }
518 }
519 // Use Site Identity on the Login Page
520 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
521 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
522 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
523 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
524 }
525 // Login Logout Menu
526 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
527 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
528 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
529 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
530 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
531 }
532 // Last Login Column
533 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
534 $last_login_column = new ASENHA\Classes\Last_Login_Column();
535 add_action(
536 'wp_login',
537 [$last_login_column, 'log_login_datetime'],
538 3,
539 1
540 );
541 // Earlier than Redirect After Login
542 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
543 add_filter(
544 'manage_users_custom_column',
545 [$last_login_column, 'show_last_login_info'],
546 10,
547 3
548 );
549 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
550 }
551 // Registration Date Column
552 if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) {
553 $registration_date_column = new ASENHA\Classes\Registration_Date_Column();
554 add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] );
555 add_filter(
556 'manage_users_custom_column',
557 [$registration_date_column, 'display_registration_date'],
558 10,
559 3
560 );
561 }
562 // Redirect After Login
563 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
564 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
565 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
566 add_filter(
567 'wp_login',
568 [$redirect_after_login, 'redirect_after_login'],
569 5,
570 2
571 );
572 }
573 }
574 // Redirect After Logout
575 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
576 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
577 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
578 add_action(
579 'wp_logout',
580 [$redirect_after_logout, 'redirect_after_logout'],
581 5,
582 1
583 );
584 // load earlier than Change Login URL add_action
585 // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 );
586 // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 );
587 }
588 }
589 // Enable Custom Admin / Frontend CSS
590 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'] ) {
591 $custom_css = new ASENHA\Classes\Custom_Css();
592 }
593 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
594 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
595 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
596 }
597 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
598 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
599 }
600 // Insert <head>, <body> and <footer> code
601 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
602 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
603 if ( isset( $options['head_code_priority'] ) ) {
604 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
605 } else {
606 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
607 }
608 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
609 if ( isset( $options['body_code_priority'] ) ) {
610 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
611 } else {
612 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
613 }
614 }
615 if ( isset( $options['footer_code_priority'] ) ) {
616 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
617 } else {
618 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
619 }
620 }
621 // Custom Body Class
622 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
623 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
624 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
625 add_action(
626 'add_meta_boxes',
627 [$custom_body_class, 'add_custom_body_class_meta_box'],
628 10,
629 2
630 );
631 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
632 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
633 }
634 }
635 // Manage ads.txt and app-ads.txt
636 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
637 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
638 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
639 }
640 // Manage robots.txt
641 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
642 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
643 add_filter(
644 'robots_txt',
645 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
646 PHP_INT_MAX,
647 2
648 );
649 }
650 // =================================================================
651 // DISABLE COMPONENTS
652 // =================================================================
653 // Disable Gutenberg
654 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
655 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
656 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
657 if ( !class_exists( 'Classic_Editor' ) ) {
658 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
659 }
660 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
661 add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] );
662 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
663 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 );
664 }
665 }
666 }
667 // Disable Comments
668 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
669 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
670 $disable_comments = new ASENHA\Classes\Disable_Comments();
671 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
672 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
673 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
674 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
675 add_filter(
676 'comments_array',
677 [$disable_comments, 'maybe_return_empty_comments'],
678 20,
679 2
680 );
681 add_filter(
682 'comments_open',
683 [$disable_comments, 'close_comments_pings_on_frontend'],
684 20,
685 2
686 );
687 add_filter(
688 'pings_open',
689 [$disable_comments, 'close_comments_pings_on_frontend'],
690 20,
691 2
692 );
693 add_filter(
694 'get_comments_number',
695 [$disable_comments, 'return_zero_comments_count'],
696 20,
697 2
698 );
699 // Disable commenting via XML-RPC
700 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
701 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
702 // Disable commenting via REST API
703 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
704 add_filter(
705 'rest_pre_insert_comment',
706 [$disable_comments, 'return_blank_comment'],
707 10,
708 2
709 );
710 }
711 }
712 // Disable REST API
713 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
714 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
715 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
716 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
717 } else {
718 // REST API 1.x
719 add_filter( 'json_enabled', '__return_false' );
720 add_filter( 'json_jsonp_enabled', '__return_false' );
721 // REST API 2.x
722 add_filter( 'rest_enabled', '__return_false' );
723 add_filter( 'rest_jsonp_enabled', '__return_false' );
724 }
725 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
726 // Disable REST API links in HTML <head>
727 remove_action(
728 'template_redirect',
729 'rest_output_link_header',
730 11,
731 0
732 );
733 // Disable REST API link in HTTP headers
734 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
735 // Remove REST API URL from the WP RSD endpoint.
736 }
737 // Disable Feeds
738 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
739 remove_action( 'wp_head', 'feed_links', 2 );
740 // Remove feed links in <head>
741 remove_action( 'wp_head', 'feed_links_extra', 3 );
742 // Remove feed links in <head>
743 remove_action(
744 'do_feed_rdf',
745 'do_feed_rdf',
746 10,
747 0
748 );
749 remove_action(
750 'do_feed_rss',
751 'do_feed_rss',
752 10,
753 0
754 );
755 remove_action(
756 'do_feed_rss2',
757 'do_feed_rss2',
758 10,
759 1
760 );
761 remove_action(
762 'do_feed_atom',
763 'do_feed_atom',
764 10,
765 1
766 );
767 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
768 add_action(
769 'template_redirect',
770 [$disable_feeds, 'redirect_feed_to_403'],
771 10,
772 1
773 );
774 }
775 // Disable All Updates
776 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
777 $disable_updates = new ASENHA\Classes\Disable_Updates();
778 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
779 // Disable core update
780 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
781 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
782 // Disable theme updates
783 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
784 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
785 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
786 // Disable plugin updates
787 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
788 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
789 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
790 // Disable auto updates
791 add_filter( 'automatic_updater_disabled', '__return_true' );
792 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
793 define( 'AUTOMATIC_UPDATER_DISABLED', true );
794 }
795 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
796 define( 'WP_AUTO_UPDATE_CORE', false );
797 }
798 add_filter( 'auto_update_core', '__return_false' );
799 add_filter( 'wp_auto_update_core', '__return_false' );
800 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
801 add_filter( 'allow_major_auto_core_updates', '__return_false' );
802 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
803 add_filter( 'auto_update_plugin', '__return_false' );
804 add_filter( 'auto_update_theme', '__return_false' );
805 add_filter( 'auto_update_translation', '__return_false' );
806 remove_action( 'init', 'wp_schedule_update_checks' );
807 // Disable update emails
808 add_filter( 'auto_core_update_send_email', '__return_false' );
809 add_filter( 'send_core_update_notification_email', '__return_false' );
810 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
811 // Remove Dashboard >> Updates menu
812 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
813 }
814 // Disable Smaller Components
815 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
816 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
817 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
818 remove_action( 'wp_head', 'wp_generator' );
819 }
820 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
821 add_filter(
822 'the_generator',
823 [$disable_smaller_components, 'remove_feed_generator_tag'],
824 10,
825 2
826 );
827 }
828 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
829 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
830 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
831 }
832 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
833 remove_action( 'wp_head', 'wlwmanifest_link' );
834 }
835 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
836 remove_action( 'wp_head', 'rsd_link' );
837 }
838 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
839 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
840 remove_action(
841 'template_redirect',
842 'wp_shortlink_header',
843 100,
844 0
845 );
846 }
847 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
848 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
849 }
850 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
851 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
852 }
853 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
854 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
855 }
856 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
857 // Disables the block editor from managing widgets in the Gutenberg plugin.
858 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
859 // Disables the block editor from managing widgets.
860 add_filter( 'use_widgets_block_editor', '__return_false' );
861 }
862 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
863 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
864 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
865 }
866 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
867 if ( $options['disable_plugin_theme_editor'] ) {
868 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
869 } else {
870 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
871 }
872 }
873 }
874 // =================================================================
875 // SECURITY
876 // =================================================================
877 // Limit Login Attempts
878 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
879 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
880 add_filter(
881 'authenticate',
882 [$limit_login_attempts, 'maybe_allow_login'],
883 999,
884 3
885 );
886 // Very low priority so it is processed last
887 add_action(
888 'wp_login_errors',
889 [$limit_login_attempts, 'login_error_handler'],
890 999,
891 2
892 );
893 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
894 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
895 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
896 // Higher priority than one in Change Login URL
897 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
898 }
899 // Obfuscate Author Slugs
900 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
901 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
902 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
903 add_filter(
904 'author_link',
905 [$obfuscate_author_slugs, 'alter_author_link'],
906 10,
907 3
908 );
909 add_filter(
910 'rest_prepare_user',
911 [$obfuscate_author_slugs, 'alter_json_users'],
912 10,
913 3
914 );
915 }
916 // Email Address Obfuscator
917 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
918 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
919 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
920 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
921 add_filter( 'widget_text', 'shortcode_unautop' );
922 add_filter( 'widget_text', 'do_shortcode' );
923 }
924 // Disable XML-RPC
925 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
926 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
927 add_filter( 'xmlrpc_enabled', '__return_false' );
928 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
929 add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] );
930 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
931 // Hide xmlrpc.php in HTTP response headers
932 add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] );
933 add_filter( 'pings_open', '__return_false', PHP_INT_MAX );
934 }
935 // =================================================================
936 // OPTIMIZATIONS
937 // =================================================================
938 // Image Upload Control
939 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
940 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
941 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
942 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
943 add_filter(
944 'wp_handle_upload_prefilter',
945 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
946 10,
947 1
948 );
949 add_filter(
950 'wp_handle_upload',
951 [$image_upload_control, 'maybe_fix_image_orientation'],
952 1,
953 3
954 );
955 }
956 // Resize and convert happens here
957 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
958 }
959 // Revisions Control
960 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
961 $revisions_control = new ASENHA\Classes\Revisions_Control();
962 add_filter(
963 'wp_revisions_to_keep',
964 [$revisions_control, 'limit_revisions_to_max_number'],
965 10,
966 2
967 );
968 }
969 // Heartbeat Control
970 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
971 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
972 add_filter(
973 'heartbeat_settings',
974 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
975 99,
976 2
977 );
978 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
979 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
980 }
981 // =================================================================
982 // UTILITIES
983 // =================================================================
984 // SMTP Email Delivery
985 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
986 $email_delivery = new ASENHA\Classes\Email_Delivery();
987 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
988 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
989 }
990 // Multiple User Roles
991 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
992 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
993 // Show roles checkboxes
994 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
995 // for when user edits their own profile
996 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
997 // for when editing other user's profile
998 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
999 // new user creation
1000 // Save roles selections
1001 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
1002 // for when user edits their own profile
1003 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
1004 // for when editing other user's profile
1005 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
1006 // new user creation
1007 }
1008 // Image Sizes Panel
1009 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
1010 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
1011 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
1012 }
1013 // View Admin as Role
1014 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1015 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1016 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1017 // Priority 8 so it is next to username section
1018 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1019 add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 );
1020 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1021 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1022 }
1023 // Password Protection
1024 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1025 $password_protection = new ASENHA\Classes\Password_Protection();
1026 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1027 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1028 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1029 // load early
1030 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1031 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1032 if ( function_exists( 'wp_site_icon' ) ) {
1033 // WP v4.3+
1034 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1035 }
1036 }
1037 // Maintenance Mode
1038 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1039 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1040 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1041 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1042 }
1043 // Redirect 404 to Homepage
1044 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1045 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1046 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1047 }
1048 // Display System Summary
1049 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1050 // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php';
1051 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1052 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1053 }
1054 // Search Engines Visibility Status
1055 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1056 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1057 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1058 }
1059 }
1060
1061 }
1062
1063 Admin_Site_Enhancements::get_instance();