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