PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.4.2
Admin and Site Enhancements (ASE) v7.4.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 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
1010 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( 'wp_login', [$last_login_column, 'log_login_datetime'] );
518 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
519 add_filter(
520 'manage_users_custom_column',
521 [$last_login_column, 'show_last_login_info'],
522 10,
523 3
524 );
525 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
526 }
527 // Redirect After Login
528 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
529 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
530 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
531 add_filter(
532 'wp_login',
533 [$redirect_after_login, 'redirect_after_login'],
534 5,
535 2
536 );
537 }
538 }
539 // Redirect After Logout
540 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
541 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
542 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
543 add_action(
544 'wp_logout',
545 [$redirect_after_logout, 'redirect_after_logout'],
546 5,
547 1
548 );
549 // load earlier than Change Login URL add_action
550 }
551 }
552 // Enable Custom Admin / Frontend CSS
553 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'] ) {
554 $custom_css = new ASENHA\Classes\Custom_Css();
555 }
556 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
557 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
558 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
559 }
560 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
561 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
562 }
563 // Insert <head>, <body> and <footer> code
564 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
565 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
566 if ( isset( $options['head_code_priority'] ) ) {
567 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
568 } else {
569 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
570 }
571 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
572 if ( isset( $options['body_code_priority'] ) ) {
573 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
574 } else {
575 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
576 }
577 }
578 if ( isset( $options['footer_code_priority'] ) ) {
579 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
580 } else {
581 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
582 }
583 }
584 // Custom Body Class
585 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
586 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
587 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
588 add_action(
589 'add_meta_boxes',
590 [$custom_body_class, 'add_custom_body_class_meta_box'],
591 10,
592 2
593 );
594 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
595 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
596 }
597 }
598 // Manage ads.txt and app-ads.txt
599 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
600 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
601 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
602 }
603 // Manage robots.txt
604 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
605 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
606 add_filter(
607 'robots_txt',
608 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
609 10,
610 2
611 );
612 }
613 // =================================================================
614 // DISABLE COMPONENTS
615 // =================================================================
616 // Disable Gutenberg
617 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
618 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
619 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
620 if ( !class_exists( 'Classic_Editor' ) ) {
621 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
622 }
623 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
624 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
625 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 );
626 }
627 }
628 }
629 // Disable Comments
630 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
631 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
632 $disable_comments = new ASENHA\Classes\Disable_Comments();
633 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
634 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
635 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
636 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
637 add_filter(
638 'comments_array',
639 [$disable_comments, 'maybe_return_empty_comments'],
640 20,
641 2
642 );
643 add_filter(
644 'comments_open',
645 [$disable_comments, 'close_comments_pings_on_frontend'],
646 20,
647 2
648 );
649 add_filter(
650 'pings_open',
651 [$disable_comments, 'close_comments_pings_on_frontend'],
652 20,
653 2
654 );
655 add_filter(
656 'get_comments_number',
657 [$disable_comments, 'return_zero_comments_count'],
658 20,
659 2
660 );
661 // Disable commenting via XML-RPC
662 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
663 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
664 // Disable commenting via REST API
665 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
666 add_filter(
667 'rest_pre_insert_comment',
668 [$disable_comments, 'return_blank_comment'],
669 10,
670 2
671 );
672 }
673 }
674 // Disable REST API
675 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
676 if ( !function_exists( 'is_user_logged_in' ) ) {
677 require_once ABSPATH . 'wp-includes/pluggable.php';
678 }
679 $allow_rest_api_access = false;
680 if ( !is_user_logged_in() ) {
681 $allow_rest_api_access = false;
682 } else {
683 $allow_rest_api_access = true;
684 }
685 if ( !$allow_rest_api_access ) {
686 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
687 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
688 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
689 } else {
690 // REST API 1.x
691 add_filter( 'json_enabled', '__return_false' );
692 add_filter( 'json_jsonp_enabled', '__return_false' );
693 // REST API 2.x
694 add_filter( 'rest_enabled', '__return_false' );
695 add_filter( 'rest_jsonp_enabled', '__return_false' );
696 }
697 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
698 // Disable REST API links in HTML <head>
699 remove_action(
700 'template_redirect',
701 'rest_output_link_header',
702 11,
703 0
704 );
705 // Disable REST API link in HTTP headers
706 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
707 // Remove REST API URL from the WP RSD endpoint.
708 }
709 }
710 // Disable Feeds
711 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
712 remove_action( 'wp_head', 'feed_links', 2 );
713 // Remove feed links in <head>
714 remove_action( 'wp_head', 'feed_links_extra', 3 );
715 // Remove feed links in <head>
716 remove_action(
717 'do_feed_rdf',
718 'do_feed_rdf',
719 10,
720 0
721 );
722 remove_action(
723 'do_feed_rss',
724 'do_feed_rss',
725 10,
726 0
727 );
728 remove_action(
729 'do_feed_rss2',
730 'do_feed_rss2',
731 10,
732 1
733 );
734 remove_action(
735 'do_feed_atom',
736 'do_feed_atom',
737 10,
738 1
739 );
740 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
741 add_action(
742 'template_redirect',
743 [$disable_feeds, 'redirect_feed_to_403'],
744 10,
745 1
746 );
747 }
748 // Disable All Updates
749 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
750 $disable_updates = new ASENHA\Classes\Disable_Updates();
751 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
752 // Disable core update
753 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
754 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
755 // Disable theme updates
756 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
757 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
758 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
759 // Disable plugin updates
760 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
761 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
762 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
763 // Disable auto updates
764 add_filter( 'automatic_updater_disabled', '__return_true' );
765 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
766 define( 'AUTOMATIC_UPDATER_DISABLED', true );
767 }
768 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
769 define( 'WP_AUTO_UPDATE_CORE', false );
770 }
771 add_filter( 'auto_update_core', '__return_false' );
772 add_filter( 'wp_auto_update_core', '__return_false' );
773 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
774 add_filter( 'allow_major_auto_core_updates', '__return_false' );
775 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
776 add_filter( 'auto_update_plugin', '__return_false' );
777 add_filter( 'auto_update_theme', '__return_false' );
778 add_filter( 'auto_update_translation', '__return_false' );
779 remove_action( 'init', 'wp_schedule_update_checks' );
780 // Disable update emails
781 add_filter( 'auto_core_update_send_email', '__return_false' );
782 add_filter( 'send_core_update_notification_email', '__return_false' );
783 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
784 // Remove Dashboard >> Updates menu
785 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
786 }
787 // Disable Smaller Components
788 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
789 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
790 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
791 remove_action( 'wp_head', 'wp_generator' );
792 }
793 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
794 add_filter(
795 'the_generator',
796 [$disable_smaller_components, 'remove_feed_generator_tag'],
797 10,
798 2
799 );
800 }
801 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
802 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
803 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
804 }
805 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
806 remove_action( 'wp_head', 'wlwmanifest_link' );
807 }
808 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
809 remove_action( 'wp_head', 'rsd_link' );
810 }
811 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
812 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
813 remove_action(
814 'template_redirect',
815 'wp_shortlink_header',
816 100,
817 0
818 );
819 }
820 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
821 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
822 }
823 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
824 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
825 }
826 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
827 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
828 }
829 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
830 // Disables the block editor from managing widgets in the Gutenberg plugin.
831 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
832 // Disables the block editor from managing widgets.
833 add_filter( 'use_widgets_block_editor', '__return_false' );
834 }
835 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
836 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
837 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
838 }
839 }
840 // =================================================================
841 // SECURITY
842 // =================================================================
843 // Limit Login Attempts
844 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
845 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
846 add_filter(
847 'authenticate',
848 [$limit_login_attempts, 'maybe_allow_login'],
849 999,
850 3
851 );
852 // Very low priority so it is processed last
853 add_action(
854 'wp_login_errors',
855 [$limit_login_attempts, 'login_error_handler'],
856 999,
857 2
858 );
859 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
860 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
861 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
862 // Higher priority than one in Change Login URL
863 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
864 }
865 // Obfuscate Author Slugs
866 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
867 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
868 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
869 add_filter(
870 'author_link',
871 [$obfuscate_author_slugs, 'alter_author_link'],
872 10,
873 3
874 );
875 add_filter(
876 'rest_prepare_user',
877 [$obfuscate_author_slugs, 'alter_json_users'],
878 10,
879 3
880 );
881 }
882 // Email Address Obfuscator
883 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
884 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
885 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
886 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
887 add_filter( 'widget_text', 'shortcode_unautop' );
888 add_filter( 'widget_text', 'do_shortcode' );
889 if ( array_key_exists( 'obfuscate_email_address_in_content', $options ) && $options['obfuscate_email_address_in_content'] ) {
890 add_filter( 'the_content', [$email_address_obfuscator, 'obfuscate_emails_in_content__premium_only'] );
891 }
892 }
893 // Disable XML-RPC
894 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
895 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
896 add_filter( 'xmlrpc_enabled', '__return_false' );
897 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
898 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
899 }
900 // =================================================================
901 // OPTIMIZATIONS
902 // =================================================================
903 // Image Upload Control
904 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
905 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
906 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
907 }
908 // Revisions Control
909 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
910 $revisions_control = new ASENHA\Classes\Revisions_Control();
911 add_filter(
912 'wp_revisions_to_keep',
913 [$revisions_control, 'limit_revisions_to_max_number'],
914 10,
915 2
916 );
917 }
918 // Heartbeat Control
919 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
920 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
921 add_filter(
922 'heartbeat_settings',
923 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
924 99,
925 2
926 );
927 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
928 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
929 }
930 // =================================================================
931 // UTILITIES
932 // =================================================================
933 // SMTP Email Delivery
934 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
935 $email_delivery = new ASENHA\Classes\Email_Delivery();
936 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
937 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
938 }
939 // Multiple User Roles
940 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
941 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
942 // Show roles checkboxes
943 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
944 // for when user edits their own profile
945 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
946 // for when editing other user's profile
947 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
948 // new user creation
949 // Save roles selections
950 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
951 // for when user edits their own profile
952 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
953 // for when editing other user's profile
954 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
955 // new user creation
956 }
957 // Image Sizes Panel
958 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
959 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
960 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
961 }
962 // View Admin as Role
963 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
964 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
965 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
966 // Priority 8 so it is next to username section
967 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
968 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
969 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
970 }
971 // Password Protection
972 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
973 $password_protection = new ASENHA\Classes\Password_Protection();
974 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
975 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
976 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
977 // load early
978 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
979 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
980 if ( function_exists( 'wp_site_icon' ) ) {
981 // WP v4.3+
982 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
983 }
984 }
985 // Maintenance Mode
986 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
987 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
988 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
989 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
990 }
991 // Redirect 404 to Homepage
992 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
993 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
994 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
995 }
996 // Display System Summary
997 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
998 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
999 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1000 }
1001 // Search Engines Visibility Status
1002 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1003 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1004 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1005 }
1006 }
1007
1008 }
1009
1010 Admin_Site_Enhancements::get_instance();