PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.3.0
Admin and Site Enhancements (ASE) v7.3.0
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 2 years ago classes 2 years ago includes 2 years ago languages 2 years ago vendor 2 years ago CHANGELOG.md 2 years ago LICENSE.md 2 years ago README.md 2 years ago admin-site-enhancements.php 2 years ago bootstrap.php 2 years ago functions.php 2 years ago settings.php 2 years ago
bootstrap.php
981 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 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
295 add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] );
296 }
297 }
298 // Hide Admin Notices
299 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
300 $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices();
301 add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 );
302 // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] );
303 add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] );
304 add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] );
305 }
306 // Disable Dashboard Widgets
307 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
308 $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets();
309 add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], 99 );
310 add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] );
311 }
312 // Hide Admin Bar
313 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) {
314 $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar();
315 }
316 // On the frontend
317 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'] ) ) {
318 add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] );
319 }
320 // Wider Admin Menu
321 if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) {
322 $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu();
323 add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 );
324 }
325 // Admin Menu Organizer
326 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
327 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
328 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
329 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
330 if ( array_key_exists( 'custom_menu_order', $options ) ) {
331 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
332 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
333 }
334 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
335 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 9999999995 );
336 // For 'Posts' menu, if the title has been changed, try changing the labels for it everywhere
337 $custom_menu_titles = explode( ',', $options['custom_menu_titles'] );
338 foreach ( $custom_menu_titles as $custom_menu_title ) {
339 if ( false !== strpos( $custom_menu_title, 'menu-posts__' ) ) {
340 $custom_menu_title = explode( '__', $custom_menu_title );
341 $posts_custom_title = $custom_menu_title[1];
342 $posts_default_title = $wp_post_types['post']->label;
343 if ( $posts_default_title != $posts_custom_title ) {
344 add_filter( 'post_type_labels_post', [$admin_menu_organizer, 'change_post_labels'] );
345 add_action( 'init', [$admin_menu_organizer, 'change_post_object_label'] );
346 add_action( 'admin_menu', [$admin_menu_organizer, 'change_post_menu_label'], PHP_INT_MAX );
347 add_action( 'admin_bar_menu', [$admin_menu_organizer, 'change_wp_admin_bar'], 80 );
348 }
349 }
350 }
351 }
352 if ( array_key_exists( 'custom_menu_hidden', $options ) || array_key_exists( 'custom_menu_always_hidden', $options ) ) {
353 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
354 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
355 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
356 }
357 }
358 // Show Custom Taxonomy Filters
359 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
360 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
361 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
362 }
363 // Enhance List Tables
364 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
365 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
366 // Show Featured Image Column
367 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
368 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
369 }
370 // Show Excerpt Column
371 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
372 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
373 }
374 // Show ID Column
375 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
376 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
377 }
378 // Show File Size Column in Media Library
379 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
380 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
381 add_action(
382 'manage_media_custom_column',
383 [$enhance_list_tables, 'display_file_size'],
384 10,
385 2
386 );
387 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
388 }
389 // Show ID in Action Row
390 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
391 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
392 }
393 // Hide Comments Column
394 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
395 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
396 }
397 // Hide Post Tags Column
398 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
399 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
400 }
401 }
402 // Various Admin UI Enhancements
403 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
404 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
405 // Display Active Plugins First
406 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
407 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
408 }
409 }
410 // Custom Admin Footer Text
411 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
412 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
413 // Update footer text
414 if ( is_asenha() ) {
415 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
416 } else {
417 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
418 }
419 // Update footer version text
420 if ( is_asenha() ) {
421 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
422 } else {
423 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
424 }
425 } else {
426 // Update footer text
427 if ( is_asenha() ) {
428 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
429 }
430 // Update footer version text
431 if ( is_asenha() ) {
432 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
433 }
434 }
435 // =================================================================
436 // LOG IN | LOG OUT
437 // =================================================================
438 // Change Login URL
439 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
440 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
441 $change_login_url = new ASENHA\Classes\Change_Login_URL();
442 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
443 add_filter(
444 'login_url',
445 [$change_login_url, 'customize_login_url'],
446 10,
447 3
448 );
449 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
450 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
451 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
452 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
453 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
454 // No need to modify logout_url or perform redirect on logout
455 // The customized login URL is already being returned after logout
456 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
457 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
458 }
459 }
460 // Login ID Type
461 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
462 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
463 $login_id_type = new ASENHA\Classes\Login_ID_Type();
464 switch ( $options['login_id_type'] ) {
465 case 'username':
466 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
467 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
468 add_filter(
469 'gettext',
470 [$login_id_type, 'gettext_login_id_username'],
471 20,
472 3
473 );
474 break;
475 case 'email':
476 add_filter(
477 'authenticate',
478 [$login_id_type, 'authenticate_email'],
479 20,
480 2
481 );
482 add_filter(
483 'gettext',
484 [$login_id_type, 'gettext_login_id_email'],
485 20,
486 3
487 );
488 break;
489 }
490 }
491 }
492 // Use Site Identity on the Login Page
493 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
494 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
495 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
496 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
497 }
498 // Login Logout Menu
499 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
500 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
501 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
502 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
503 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
504 }
505 // Enable Last Login Column
506 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
507 $last_login_column = new ASENHA\Classes\Last_Login_Column();
508 add_action( 'wp_login', [$last_login_column, 'log_login_datetime'] );
509 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
510 add_filter(
511 'manage_users_custom_column',
512 [$last_login_column, 'show_last_login_info'],
513 10,
514 3
515 );
516 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
517 }
518 // Redirect After Login
519 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
520 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
521 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
522 add_filter(
523 'wp_login',
524 [$redirect_after_login, 'redirect_after_login'],
525 5,
526 2
527 );
528 }
529 }
530 // Redirect After Logout
531 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
532 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
533 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
534 add_action(
535 'wp_logout',
536 [$redirect_after_logout, 'redirect_after_logout'],
537 5,
538 1
539 );
540 // load earlier than Change Login URL add_action
541 }
542 }
543 // Enable Custom Admin / Frontend CSS
544 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'] ) {
545 $custom_css = new ASENHA\Classes\Custom_Css();
546 }
547 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
548 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
549 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
550 }
551 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
552 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
553 }
554 // Insert <head>, <body> and <footer> code
555 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
556 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
557 if ( isset( $options['head_code_priority'] ) ) {
558 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
559 } else {
560 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
561 }
562 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
563 if ( isset( $options['body_code_priority'] ) ) {
564 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
565 } else {
566 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
567 }
568 }
569 if ( isset( $options['footer_code_priority'] ) ) {
570 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
571 } else {
572 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
573 }
574 }
575 // Custom Body Class
576 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
577 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
578 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
579 add_action(
580 'add_meta_boxes',
581 [$custom_body_class, 'add_custom_body_class_meta_box'],
582 10,
583 2
584 );
585 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
586 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
587 }
588 }
589 // Manage ads.txt and app-ads.txt
590 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
591 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
592 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
593 }
594 // Manage robots.txt
595 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
596 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
597 add_filter(
598 'robots_txt',
599 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
600 10,
601 2
602 );
603 }
604 // =================================================================
605 // DISABLE COMPONENTS
606 // =================================================================
607 // Disable Gutenberg
608 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
609 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
610 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
611 if ( !class_exists( 'Classic_Editor' ) ) {
612 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
613 }
614 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
615 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
616 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 );
617 }
618 }
619 }
620 // Disable Comments
621 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
622 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
623 $disable_comments = new ASENHA\Classes\Disable_Comments();
624 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
625 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
626 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
627 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
628 add_filter(
629 'comments_array',
630 [$disable_comments, 'maybe_return_empty_comments'],
631 20,
632 2
633 );
634 add_filter(
635 'comments_open',
636 [$disable_comments, 'close_comments_pings_on_frontend'],
637 20,
638 2
639 );
640 add_filter(
641 'pings_open',
642 [$disable_comments, 'close_comments_pings_on_frontend'],
643 20,
644 2
645 );
646 add_filter(
647 'get_comments_number',
648 [$disable_comments, 'return_zero_comments_count'],
649 20,
650 2
651 );
652 // Disable commenting via XML-RPC
653 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
654 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
655 // Disable commenting via REST API
656 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
657 add_filter(
658 'rest_pre_insert_comment',
659 [$disable_comments, 'return_blank_comment'],
660 10,
661 2
662 );
663 }
664 }
665 // Disable REST API
666 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
667 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
668 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
669 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
670 } else {
671 // REST API 1.x
672 add_filter( 'json_enabled', '__return_false' );
673 add_filter( 'json_jsonp_enabled', '__return_false' );
674 // REST API 2.x
675 add_filter( 'rest_enabled', '__return_false' );
676 add_filter( 'rest_jsonp_enabled', '__return_false' );
677 }
678 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
679 // Disable REST API links in HTML <head>
680 remove_action(
681 'template_redirect',
682 'rest_output_link_header',
683 11,
684 0
685 );
686 // Disable REST API link in HTTP headers
687 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
688 // Remove REST API URL from the WP RSD endpoint.
689 }
690 // Disable Feeds
691 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
692 remove_action( 'wp_head', 'feed_links', 2 );
693 // Remove feed links in <head>
694 remove_action( 'wp_head', 'feed_links_extra', 3 );
695 // Remove feed links in <head>
696 remove_action(
697 'do_feed_rdf',
698 'do_feed_rdf',
699 10,
700 0
701 );
702 remove_action(
703 'do_feed_rss',
704 'do_feed_rss',
705 10,
706 0
707 );
708 remove_action(
709 'do_feed_rss2',
710 'do_feed_rss2',
711 10,
712 1
713 );
714 remove_action(
715 'do_feed_atom',
716 'do_feed_atom',
717 10,
718 1
719 );
720 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
721 add_action(
722 'template_redirect',
723 [$disable_feeds, 'redirect_feed_to_403'],
724 10,
725 1
726 );
727 }
728 // Disable All Updates
729 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
730 $disable_updates = new ASENHA\Classes\Disable_Updates();
731 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
732 // Disable core update
733 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
734 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
735 // Disable theme updates
736 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
737 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
738 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
739 // Disable plugin updates
740 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
741 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
742 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
743 // Disable auto updates
744 add_filter( 'automatic_updater_disabled', '__return_true' );
745 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
746 define( 'AUTOMATIC_UPDATER_DISABLED', true );
747 }
748 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
749 define( 'WP_AUTO_UPDATE_CORE', false );
750 }
751 add_filter( 'auto_update_core', '__return_false' );
752 add_filter( 'wp_auto_update_core', '__return_false' );
753 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
754 add_filter( 'allow_major_auto_core_updates', '__return_false' );
755 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
756 add_filter( 'auto_update_plugin', '__return_false' );
757 add_filter( 'auto_update_theme', '__return_false' );
758 add_filter( 'auto_update_translation', '__return_false' );
759 remove_action( 'init', 'wp_schedule_update_checks' );
760 // Disable update emails
761 add_filter( 'auto_core_update_send_email', '__return_false' );
762 add_filter( 'send_core_update_notification_email', '__return_false' );
763 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
764 // Remove Dashboard >> Updates menu
765 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
766 }
767 // Disable Smaller Components
768 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
769 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
770 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
771 remove_action( 'wp_head', 'wp_generator' );
772 }
773 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
774 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
775 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
776 }
777 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
778 remove_action( 'wp_head', 'wlwmanifest_link' );
779 }
780 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
781 remove_action( 'wp_head', 'rsd_link' );
782 }
783 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
784 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
785 remove_action(
786 'template_redirect',
787 'wp_shortlink_header',
788 100,
789 0
790 );
791 }
792 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
793 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
794 }
795 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
796 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
797 }
798 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
799 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
800 }
801 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
802 // Disables the block editor from managing widgets in the Gutenberg plugin.
803 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
804 // Disables the block editor from managing widgets.
805 add_filter( 'use_widgets_block_editor', '__return_false' );
806 }
807 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
808 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
809 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
810 }
811 }
812 // =================================================================
813 // SECURITY
814 // =================================================================
815 // Limit Login Attempts
816 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
817 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
818 add_filter(
819 'authenticate',
820 [$limit_login_attempts, 'maybe_allow_login'],
821 999,
822 3
823 );
824 // Very low priority so it is processed last
825 add_action(
826 'wp_login_errors',
827 [$limit_login_attempts, 'login_error_handler'],
828 999,
829 2
830 );
831 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
832 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
833 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
834 // Higher priority than one in Change Login URL
835 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
836 }
837 // Obfuscate Author Slugs
838 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
839 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
840 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
841 add_filter(
842 'author_link',
843 [$obfuscate_author_slugs, 'alter_author_link'],
844 10,
845 3
846 );
847 add_filter(
848 'rest_prepare_user',
849 [$obfuscate_author_slugs, 'alter_json_users'],
850 10,
851 3
852 );
853 }
854 // Email Address Obfuscator
855 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
856 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
857 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
858 add_filter( 'widget_text', 'shortcode_unautop' );
859 add_filter( 'widget_text', 'do_shortcode' );
860 if ( array_key_exists( 'obfuscate_email_address_in_content', $options ) && $options['obfuscate_email_address_in_content'] ) {
861 add_filter( 'the_content', [$email_address_obfuscator, 'obfuscate_emails_in_content__premium_only'] );
862 }
863 }
864 // Disable XML-RPC
865 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
866 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
867 add_filter( 'xmlrpc_enabled', '__return_false' );
868 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
869 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
870 }
871 // =================================================================
872 // OPTIMIZATIONS
873 // =================================================================
874 // Image Upload Control
875 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
876 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
877 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
878 }
879 // Revisions Control
880 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
881 $revisions_control = new ASENHA\Classes\Revisions_Control();
882 add_filter(
883 'wp_revisions_to_keep',
884 [$revisions_control, 'limit_revisions_to_max_number'],
885 10,
886 2
887 );
888 }
889 // Heartbeat Control
890 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
891 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
892 add_filter(
893 'heartbeat_settings',
894 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
895 99,
896 2
897 );
898 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
899 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
900 }
901 // =================================================================
902 // UTILITIES
903 // =================================================================
904 // SMTP Email Delivery
905 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
906 $email_delivery = new ASENHA\Classes\Email_Delivery();
907 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
908 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
909 }
910 // Multiple User Roles
911 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
912 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
913 // Show roles checkboxes
914 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
915 // for when user edits their own profile
916 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
917 // for when editing other user's profile
918 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
919 // new user creation
920 // Save roles selections
921 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
922 // for when user edits their own profile
923 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
924 // for when editing other user's profile
925 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
926 // new user creation
927 }
928 // Image Sizes Panel
929 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
930 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
931 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
932 }
933 // View Admin as Role
934 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
935 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
936 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
937 // Priority 8 so it is next to username section
938 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
939 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
940 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
941 }
942 // Password Protection
943 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
944 $password_protection = new ASENHA\Classes\Password_Protection();
945 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
946 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
947 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
948 // load early
949 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
950 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
951 if ( function_exists( 'wp_site_icon' ) ) {
952 // WP v4.3+
953 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
954 }
955 }
956 // Maintenance Mode
957 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
958 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
959 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
960 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
961 }
962 // Redirect 404 to Homepage
963 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
964 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
965 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
966 }
967 // Display System Summary
968 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
969 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
970 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
971 }
972 // Search Engines Visibility Status
973 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
974 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
975 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
976 }
977 }
978
979 }
980
981 Admin_Site_Enhancements::get_instance();