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