PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.6.2
Admin and Site Enhancements (ASE) v7.6.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
1048 lines
1 <?php
2
3 // We're using the singleton design pattern
4 // https://code.tutsplus.com/articles/design-patterns-in-wordpress-the-singleton-pattern--wp-31621
5 // https://carlalexander.ca/singletons-in-wordpress/
6 // https://torquemag.io/2016/11/singletons-wordpress-good-evil/
7 /**
8 * Main class of the plugin used to add functionalities
9 *
10 * @since 1.0.0
11 */
12 class Admin_Site_Enhancements {
13 // Refers to a single instance of this class
14 private static $instance = null;
15
16 /**
17 * Creates or returns a single instance of this class
18 *
19 * @return Admin_Site_Enhancements a single instance of this class
20 * @since 1.0.0
21 */
22 public static function get_instance() {
23 if ( null == self::$instance ) {
24 self::$instance = new self();
25 }
26 return self::$instance;
27 }
28
29 /**
30 * Initialize plugin functionalities
31 */
32 private function __construct() {
33 global $wp_post_types, $pagenow, $typenow;
34 // Setup admin menu, admin page, settings, settings sections, sections fields, admin scripts, plugin action links, etc.
35 // Register admin menu and add the settings page.
36 add_action( 'admin_menu', 'asenha_register_admin_menu' );
37 // Register plugin settings
38 // Instantiate object for registration of settings section and fields
39 $settings = new ASENHA\Classes\Settings_Sections_Fields();
40 add_action( 'admin_init', [$settings, 'register_sections_fields'] );
41 // Suppress all notices on the plugin's main page. Then add notification for successful settings update.
42 add_action( 'admin_notices', 'asenha_suppress_add_notices', 5 );
43 add_action( 'all_admin_notices', 'asenha_suppress_generic_notices', 5 );
44 // Enqueue admin scripts and styles
45 add_action( 'admin_enqueue_scripts', 'asenha_admin_scripts' );
46 // Enqueue public scripts and styles
47 add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' );
48 // Dequeue scripts that prevents settings page from working
49 add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
50 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
51 add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
52 add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
53 // Add admin bar inline styles
54 add_action( 'admin_head', 'asenha_admin_bar_item_js_css' );
55 add_action( 'wp_head', 'asenha_admin_bar_item_js_css' );
56 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
57 // Mark that a user have supported ASE (via AJAX)
58 add_action( 'wp_ajax_have_supported', 'asenha_have_supported' );
59 // Dismiss upgrade nudge (via AJAX)
60 add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' );
61 // Dismiss promo nudge (via AJAX)
62 add_action( 'wp_ajax_dismiss_promo_nudge', 'asenha_dismiss_promo_nudge' );
63 // Dismiss support nudge (via AJAX)
64 add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' );
65 if ( function_exists( 'bwasenha_fs' ) ) {
66 bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' );
67 }
68 // Add style="display:[something];" to the safe CSS attributes.
69 // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329
70 // Ref: https://wordpress.stackexchange.com/a/195433
71 add_filter( 'safe_style_css', function ( $styles ) {
72 $styles[] = 'display';
73 return $styles;
74 } );
75 // ===== Activate features based on settings =====
76 // Get all WP Enhancements options, default to empty array in case it's not been created yet
77 $options = get_option( ASENHA_SLUG_U, array() );
78 // Content Duplication
79 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
80 $content_duplication = new ASENHA\Classes\Content_Duplication();
81 add_action( 'admin_action_duplicate_content', [$content_duplication, 'duplicate_content'] );
82 add_filter(
83 'page_row_actions',
84 [$content_duplication, 'add_duplication_action_link'],
85 20,
86 2
87 );
88 add_filter(
89 'post_row_actions',
90 [$content_duplication, 'add_duplication_action_link'],
91 20,
92 2
93 );
94 add_action( 'admin_bar_menu', [$content_duplication, 'add_admin_bar_duplication_link'], 100 );
95 }
96 // Content Order
97 if ( array_key_exists( 'content_order', $options ) && $options['content_order'] ) {
98 if ( array_key_exists( 'content_order_for', $options ) && !empty( $options['content_order_for'] ) || array_key_exists( 'content_order_for_other_post_types', $options ) && !empty( $options['content_order_for_other_post_types'] ) ) {
99 $content_order = new ASENHA\Classes\Content_Order();
100 add_action( 'admin_menu', [$content_order, 'add_content_order_submenu'] );
101 add_action( 'wp_ajax_save_custom_order', [$content_order, 'save_custom_content_order'] );
102 add_filter( 'pre_get_posts', [$content_order, 'orderby_menu_order'], PHP_INT_MAX );
103 // TODO: https://developer.wordpress.org/reference/hooks/ajax_query_attachments_args/ (for grid view of media library)
104 add_filter(
105 'save_post',
106 [$content_order, 'set_menu_order_for_new_posts'],
107 10,
108 3
109 );
110 }
111 }
112 // Media Replacement
113 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
114 $media_replacement = new ASENHA\Classes\Media_Replacement();
115 add_filter(
116 'media_row_actions',
117 [$media_replacement, 'modify_media_list_table_edit_link'],
118 10,
119 2
120 );
121 add_filter(
122 'attachment_fields_to_edit',
123 [$media_replacement, 'add_media_replacement_button'],
124 10,
125 2
126 );
127 add_action( 'edit_attachment', [$media_replacement, 'replace_media'] );
128 add_filter( 'post_updated_messages', [$media_replacement, 'attachment_updated_custom_message'] );
129 // Bust browser cache of old/replaced images
130 add_filter(
131 'wp_calculate_image_srcset',
132 [$media_replacement, 'append_cache_busting_param_to_image_srcset'],
133 10,
134 5
135 );
136 add_filter(
137 'wp_get_attachment_image_src',
138 [$media_replacement, 'append_cache_busting_param_to_attachment_image_src'],
139 10,
140 2
141 );
142 add_filter(
143 'wp_prepare_attachment_for_js',
144 [$media_replacement, 'append_cache_busting_param_to_attachment_for_js'],
145 10,
146 2
147 );
148 add_filter(
149 'wp_get_attachment_url',
150 [$media_replacement, 'append_cache_busting_param_to_attachment_url'],
151 20,
152 2
153 );
154 }
155 // Media Library Infinite Scrolling
156 if ( array_key_exists( 'media_library_infinite_scrolling', $options ) && $options['media_library_infinite_scrolling'] ) {
157 add_filter( 'media_library_infinite_scrolling', '__return_true' );
158 }
159 // SVG Upload
160 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'] ) ) {
161 global $roles_svg_upload_enabled;
162 $enable_svg_upload = $options['enable_svg_upload'];
163 $for_roles = $options['enable_svg_upload_for'];
164 // User has role(s). Do further checks.
165 if ( isset( $for_roles ) && count( $for_roles ) > 0 ) {
166 // Assemble single-dimensional array of roles for which SVG upload would be enabled
167 $roles_svg_upload_enabled = array();
168 foreach ( $for_roles as $role_slug => $svg_upload_enabled ) {
169 if ( $svg_upload_enabled ) {
170 $roles_svg_upload_enabled[] = $role_slug;
171 }
172 }
173 }
174 $svg_upload = new ASENHA\Classes\SVG_Upload();
175 add_filter( 'upload_mimes', [$svg_upload, 'add_svg_mime'] );
176 add_filter(
177 'wp_check_filetype_and_ext',
178 [$svg_upload, 'confirm_file_type_is_svg'],
179 10,
180 4
181 );
182 add_filter( 'wp_handle_sideload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
183 add_filter( 'wp_handle_upload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
184 add_action(
185 'rest_insert_attachment',
186 [$svg_upload, 'sanitize_after_upload'],
187 10,
188 3
189 );
190 add_filter(
191 'wp_generate_attachment_metadata',
192 [$svg_upload, 'generate_svg_metadata'],
193 10,
194 3
195 );
196 add_filter( 'wp_calculate_image_srcset', [$svg_upload, 'disable_svg_srcset'] );
197 add_filter(
198 'wp_calculate_image_sizes',
199 [$svg_upload, 'remove_svg_responsive_image_attr'],
200 10,
201 3
202 );
203 add_action( 'wp_ajax_svg_get_attachment_url', [$svg_upload, 'get_svg_attachment_url'] );
204 add_filter( 'wp_prepare_attachment_for_js', [$svg_upload, 'get_svg_url_in_media_library'] );
205 }
206 // AVIF Upload
207 if ( array_key_exists( 'enable_avif_upload', $options ) && $options['enable_avif_upload'] ) {
208 $avif_upload = new ASENHA\Classes\AVIF_Upload();
209 add_filter( 'mime_types', [$avif_upload, 'add_avif_mime_type'] );
210 add_filter( 'upload_mimes', [$avif_upload, 'allow_avif_mime_type_upload'] );
211 add_filter( 'getimagesize_mimes_to_exts', [$avif_upload, 'add_avif_mime_type_to_exts'] );
212 add_filter(
213 'wp_generate_attachment_metadata',
214 [$avif_upload, 'add_avif_image_dimension'],
215 10,
216 3
217 );
218 add_filter(
219 'file_is_displayable_image',
220 [$avif_upload, 'make_avif_displayable'],
221 10,
222 2
223 );
224 add_filter(
225 'wp_check_filetype_and_ext',
226 [$avif_upload, 'handle_exif_and_fileinfo_fail'],
227 10,
228 5
229 );
230 }
231 // External Permalinks
232 if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) {
233 if ( array_key_exists( 'enable_external_permalinks_for', $options ) && !empty( $options['enable_external_permalinks_for'] ) ) {
234 $external_permalinks = new ASENHA\Classes\External_Permalinks();
235 add_action(
236 'add_meta_boxes',
237 [$external_permalinks, 'add_external_permalink_meta_box'],
238 10,
239 2
240 );
241 add_action( 'save_post', [$external_permalinks, 'save_external_permalink'] );
242 // Filter the permalink for use by get_permalink()
243 add_filter(
244 'page_link',
245 [$external_permalinks, 'use_external_permalink_for_pages'],
246 20,
247 2
248 );
249 add_filter(
250 'post_link',
251 [$external_permalinks, 'use_external_permalink_for_posts'],
252 20,
253 2
254 );
255 add_filter(
256 'post_type_link',
257 [$external_permalinks, 'use_external_permalink_for_posts'],
258 20,
259 2
260 );
261 // Enable redirection to external permalink when page/post is opened directly via it's WP permalink
262 add_action( 'wp', [$external_permalinks, 'redirect_to_external_permalink'] );
263 }
264 }
265 // Open All External Links in New Tab
266 if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) {
267 $open_external_links_in_new_tab = new ASENHA\Classes\Open_External_Links_In_New_Tab();
268 add_filter( 'the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
269 }
270 // Allow Custom Menu Links to Open in New Tab
271 if ( array_key_exists( 'custom_nav_menu_items_new_tab', $options ) && $options['custom_nav_menu_items_new_tab'] ) {
272 $custom_nav_menu_items_in_new_tab = new ASENHA\Classes\Custom_Nav_Menu_Items_In_New_Tab();
273 add_filter(
274 'wp_nav_menu_item_custom_fields',
275 [$custom_nav_menu_items_in_new_tab, 'add_custom_nav_menu_open_in_new_tab_field'],
276 10,
277 4
278 );
279 add_action(
280 'wp_update_nav_menu_item',
281 [$custom_nav_menu_items_in_new_tab, 'save_custom_nav_menu_open_in_new_tab_status'],
282 10,
283 3
284 );
285 add_action(
286 'nav_menu_link_attributes',
287 [$custom_nav_menu_items_in_new_tab, 'add_attributes_to_custom_nav_menu_item'],
288 10,
289 3
290 );
291 }
292 // Auto-Publishing of Posts with Missed Schedules
293 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
294 $auto_publish_posts_with_missed_schedule = new ASENHA\Classes\Auto_Publish_Posts_With_Missed_Schedule();
295 add_action( 'wp_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
296 add_action( 'admin_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
297 }
298 // Hide or Modify Elements / Clean Up Admin Bar
299 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
300 $cleanup_admin_bar = new ASENHA\Classes\Cleanup_Admin_Bar();
301 // Priority 5 to execute earlier than the normal 10. This is for removing default items.
302 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'modify_admin_bar_menu'], 5 );
303 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'remove_howdy'], PHP_INT_MAX - 100 );
304 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
305 add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] );
306 }
307 }
308 // Hide Admin Notices
309 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
310 $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices();
311 add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 );
312 // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] );
313 add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] );
314 add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] );
315 }
316 // Disable Dashboard Widgets
317 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
318 $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets();
319 add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], PHP_INT_MAX );
320 add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] );
321 }
322 // Hide Admin Bar
323 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) {
324 $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar();
325 }
326 // On the frontend
327 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'] ) ) {
328 add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] );
329 }
330 // Wider Admin Menu
331 if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) {
332 $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu();
333 add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 );
334 }
335 // Admin Menu Organizer
336 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
337 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
338 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
339 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
340 if ( array_key_exists( 'custom_menu_order', $options ) ) {
341 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
342 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
343 }
344 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
345 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 9999999995 );
346 // For 'Posts' menu, if the title has been changed, try changing the labels for it everywhere
347 $custom_menu_titles = explode( ',', $options['custom_menu_titles'] );
348 foreach ( $custom_menu_titles as $custom_menu_title ) {
349 if ( false !== strpos( $custom_menu_title, 'menu-posts__' ) ) {
350 $custom_menu_title = explode( '__', $custom_menu_title );
351 $posts_custom_title = $custom_menu_title[1];
352 $posts_default_title = $wp_post_types['post']->label;
353 if ( $posts_default_title != $posts_custom_title ) {
354 add_filter( 'post_type_labels_post', [$admin_menu_organizer, 'change_post_labels'] );
355 add_action( 'init', [$admin_menu_organizer, 'change_post_object_label'] );
356 add_action( 'admin_menu', [$admin_menu_organizer, 'change_post_menu_label'], PHP_INT_MAX );
357 add_action( 'admin_bar_menu', [$admin_menu_organizer, 'change_wp_admin_bar'], 80 );
358 }
359 }
360 }
361 }
362 if ( array_key_exists( 'custom_menu_hidden', $options ) || array_key_exists( 'custom_menu_always_hidden', $options ) ) {
363 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
364 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
365 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
366 }
367 }
368 // Show Custom Taxonomy Filters
369 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
370 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
371 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
372 }
373 // Enhance List Tables
374 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
375 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
376 // Show Featured Image Column
377 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
378 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
379 }
380 // Show Excerpt Column
381 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
382 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
383 }
384 // Show Last Modified Column
385 if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) {
386 add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] );
387 }
388 // Show ID Column
389 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
390 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
391 }
392 // Show File Size Column in Media Library
393 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
394 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
395 add_action(
396 'manage_media_custom_column',
397 [$enhance_list_tables, 'display_file_size'],
398 10,
399 2
400 );
401 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
402 }
403 // Show ID in Action Row
404 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
405 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
406 }
407 // Hide Date Column
408 if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) {
409 add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] );
410 }
411 // Hide Comments Column
412 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
413 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
414 }
415 // Hide Post Tags Column
416 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
417 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
418 }
419 }
420 // Various Admin UI Enhancements
421 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
422 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
423 // Display Active Plugins First
424 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
425 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
426 }
427 }
428 // Custom Admin Footer Text
429 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
430 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
431 // Update footer text
432 if ( is_asenha() ) {
433 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
434 } else {
435 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
436 }
437 // Update footer version text
438 if ( is_asenha() ) {
439 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
440 } else {
441 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
442 }
443 } else {
444 // Update footer text
445 if ( is_asenha() ) {
446 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
447 }
448 // Update footer version text
449 if ( is_asenha() ) {
450 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
451 }
452 }
453 // =================================================================
454 // LOG IN | LOG OUT
455 // =================================================================
456 // Change Login URL
457 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
458 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
459 $change_login_url = new ASENHA\Classes\Change_Login_URL();
460 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
461 add_filter(
462 'login_url',
463 [$change_login_url, 'customize_login_url'],
464 10,
465 3
466 );
467 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
468 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
469 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
470 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
471 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
472 // No need to modify logout_url or perform redirect on logout
473 // The customized login URL is already being returned after logout
474 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
475 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
476 }
477 }
478 // Login ID Type
479 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
480 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
481 $login_id_type = new ASENHA\Classes\Login_ID_Type();
482 switch ( $options['login_id_type'] ) {
483 case 'username':
484 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
485 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
486 add_filter(
487 'gettext',
488 [$login_id_type, 'gettext_login_id_username'],
489 20,
490 3
491 );
492 break;
493 case 'email':
494 add_filter(
495 'authenticate',
496 [$login_id_type, 'authenticate_email'],
497 20,
498 2
499 );
500 add_filter(
501 'gettext',
502 [$login_id_type, 'gettext_login_id_email'],
503 20,
504 3
505 );
506 break;
507 }
508 }
509 }
510 // Use Site Identity on the Login Page
511 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
512 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
513 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
514 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
515 }
516 // Login Logout Menu
517 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
518 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
519 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
520 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
521 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
522 }
523 // Last Login Column
524 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
525 $last_login_column = new ASENHA\Classes\Last_Login_Column();
526 add_action(
527 'wp_login',
528 [$last_login_column, 'log_login_datetime'],
529 3,
530 1
531 );
532 // Earlier than Redirect After Login
533 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
534 add_filter(
535 'manage_users_custom_column',
536 [$last_login_column, 'show_last_login_info'],
537 10,
538 3
539 );
540 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
541 }
542 // Registration Date Column
543 if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) {
544 $registration_date_column = new ASENHA\Classes\Registration_Date_Column();
545 add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] );
546 add_filter(
547 'manage_users_custom_column',
548 [$registration_date_column, 'display_registration_date'],
549 10,
550 3
551 );
552 }
553 // Redirect After Login
554 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
555 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
556 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
557 add_filter(
558 'wp_login',
559 [$redirect_after_login, 'redirect_after_login'],
560 5,
561 2
562 );
563 }
564 }
565 // Redirect After Logout
566 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
567 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
568 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
569 add_action(
570 'wp_logout',
571 [$redirect_after_logout, 'redirect_after_logout'],
572 5,
573 1
574 );
575 // load earlier than Change Login URL add_action
576 // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 );
577 // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 );
578 }
579 }
580 // Enable Custom Admin / Frontend CSS
581 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'] ) {
582 $custom_css = new ASENHA\Classes\Custom_Css();
583 }
584 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
585 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
586 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
587 }
588 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
589 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
590 }
591 // Insert <head>, <body> and <footer> code
592 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
593 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
594 if ( isset( $options['head_code_priority'] ) ) {
595 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
596 } else {
597 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
598 }
599 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
600 if ( isset( $options['body_code_priority'] ) ) {
601 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
602 } else {
603 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
604 }
605 }
606 if ( isset( $options['footer_code_priority'] ) ) {
607 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
608 } else {
609 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
610 }
611 }
612 // Custom Body Class
613 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
614 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
615 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
616 add_action(
617 'add_meta_boxes',
618 [$custom_body_class, 'add_custom_body_class_meta_box'],
619 10,
620 2
621 );
622 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
623 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
624 }
625 }
626 // Manage ads.txt and app-ads.txt
627 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
628 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
629 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
630 }
631 // Manage robots.txt
632 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
633 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
634 add_filter(
635 'robots_txt',
636 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
637 PHP_INT_MAX,
638 2
639 );
640 }
641 // =================================================================
642 // DISABLE COMPONENTS
643 // =================================================================
644 // Disable Gutenberg
645 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
646 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
647 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
648 if ( !class_exists( 'Classic_Editor' ) ) {
649 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
650 }
651 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
652 add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] );
653 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
654 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 100 );
655 }
656 }
657 }
658 // Disable Comments
659 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
660 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
661 $disable_comments = new ASENHA\Classes\Disable_Comments();
662 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
663 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
664 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
665 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
666 add_filter(
667 'comments_array',
668 [$disable_comments, 'maybe_return_empty_comments'],
669 20,
670 2
671 );
672 add_filter(
673 'comments_open',
674 [$disable_comments, 'close_comments_pings_on_frontend'],
675 20,
676 2
677 );
678 add_filter(
679 'pings_open',
680 [$disable_comments, 'close_comments_pings_on_frontend'],
681 20,
682 2
683 );
684 add_filter(
685 'get_comments_number',
686 [$disable_comments, 'return_zero_comments_count'],
687 20,
688 2
689 );
690 // Disable commenting via XML-RPC
691 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
692 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
693 // Disable commenting via REST API
694 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
695 add_filter(
696 'rest_pre_insert_comment',
697 [$disable_comments, 'return_blank_comment'],
698 10,
699 2
700 );
701 }
702 }
703 // Disable REST API
704 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
705 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
706 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
707 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'] );
708 } else {
709 // REST API 1.x
710 add_filter( 'json_enabled', '__return_false' );
711 add_filter( 'json_jsonp_enabled', '__return_false' );
712 // REST API 2.x
713 add_filter( 'rest_enabled', '__return_false' );
714 add_filter( 'rest_jsonp_enabled', '__return_false' );
715 }
716 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
717 // Disable REST API links in HTML <head>
718 remove_action(
719 'template_redirect',
720 'rest_output_link_header',
721 11,
722 0
723 );
724 // Disable REST API link in HTTP headers
725 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
726 // Remove REST API URL from the WP RSD endpoint.
727 }
728 // Disable Feeds
729 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
730 remove_action( 'wp_head', 'feed_links', 2 );
731 // Remove feed links in <head>
732 remove_action( 'wp_head', 'feed_links_extra', 3 );
733 // Remove feed links in <head>
734 remove_action(
735 'do_feed_rdf',
736 'do_feed_rdf',
737 10,
738 0
739 );
740 remove_action(
741 'do_feed_rss',
742 'do_feed_rss',
743 10,
744 0
745 );
746 remove_action(
747 'do_feed_rss2',
748 'do_feed_rss2',
749 10,
750 1
751 );
752 remove_action(
753 'do_feed_atom',
754 'do_feed_atom',
755 10,
756 1
757 );
758 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
759 add_action(
760 'template_redirect',
761 [$disable_feeds, 'redirect_feed_to_403'],
762 10,
763 1
764 );
765 }
766 // Disable All Updates
767 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
768 $disable_updates = new ASENHA\Classes\Disable_Updates();
769 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
770 // Disable core update
771 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
772 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
773 // Disable theme updates
774 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
775 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
776 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
777 // Disable plugin updates
778 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
779 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
780 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
781 // Disable auto updates
782 add_filter( 'automatic_updater_disabled', '__return_true' );
783 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
784 define( 'AUTOMATIC_UPDATER_DISABLED', true );
785 }
786 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
787 define( 'WP_AUTO_UPDATE_CORE', false );
788 }
789 add_filter( 'auto_update_core', '__return_false' );
790 add_filter( 'wp_auto_update_core', '__return_false' );
791 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
792 add_filter( 'allow_major_auto_core_updates', '__return_false' );
793 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
794 add_filter( 'auto_update_plugin', '__return_false' );
795 add_filter( 'auto_update_theme', '__return_false' );
796 add_filter( 'auto_update_translation', '__return_false' );
797 remove_action( 'init', 'wp_schedule_update_checks' );
798 // Disable update emails
799 add_filter( 'auto_core_update_send_email', '__return_false' );
800 add_filter( 'send_core_update_notification_email', '__return_false' );
801 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
802 // Remove Dashboard >> Updates menu
803 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
804 }
805 // Disable Smaller Components
806 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
807 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
808 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
809 remove_action( 'wp_head', 'wp_generator' );
810 }
811 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
812 add_filter(
813 'the_generator',
814 [$disable_smaller_components, 'remove_feed_generator_tag'],
815 10,
816 2
817 );
818 }
819 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
820 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
821 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
822 }
823 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
824 remove_action( 'wp_head', 'wlwmanifest_link' );
825 }
826 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
827 remove_action( 'wp_head', 'rsd_link' );
828 }
829 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
830 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
831 remove_action(
832 'template_redirect',
833 'wp_shortlink_header',
834 100,
835 0
836 );
837 }
838 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
839 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
840 }
841 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
842 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
843 }
844 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
845 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
846 }
847 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
848 // Disables the block editor from managing widgets in the Gutenberg plugin.
849 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
850 // Disables the block editor from managing widgets.
851 add_filter( 'use_widgets_block_editor', '__return_false' );
852 }
853 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
854 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
855 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
856 }
857 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
858 if ( $options['disable_plugin_theme_editor'] ) {
859 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
860 } else {
861 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
862 }
863 }
864 }
865 // =================================================================
866 // SECURITY
867 // =================================================================
868 // Limit Login Attempts
869 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
870 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
871 add_filter(
872 'authenticate',
873 [$limit_login_attempts, 'maybe_allow_login'],
874 999,
875 3
876 );
877 // Very low priority so it is processed last
878 add_action(
879 'wp_login_errors',
880 [$limit_login_attempts, 'login_error_handler'],
881 999,
882 2
883 );
884 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
885 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
886 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
887 // Higher priority than one in Change Login URL
888 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
889 }
890 // Obfuscate Author Slugs
891 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
892 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
893 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
894 add_filter(
895 'author_link',
896 [$obfuscate_author_slugs, 'alter_author_link'],
897 10,
898 3
899 );
900 add_filter(
901 'rest_prepare_user',
902 [$obfuscate_author_slugs, 'alter_json_users'],
903 10,
904 3
905 );
906 }
907 // Email Address Obfuscator
908 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
909 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
910 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
911 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
912 add_filter( 'widget_text', 'shortcode_unautop' );
913 add_filter( 'widget_text', 'do_shortcode' );
914 }
915 // Disable XML-RPC
916 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
917 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
918 add_filter( 'xmlrpc_enabled', '__return_false' );
919 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
920 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
921 }
922 // =================================================================
923 // OPTIMIZATIONS
924 // =================================================================
925 // Image Upload Control
926 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
927 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
928 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
929 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
930 add_filter(
931 'wp_handle_upload_prefilter',
932 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
933 10,
934 1
935 );
936 add_filter(
937 'wp_handle_upload',
938 [$image_upload_control, 'maybe_fix_image_orientation'],
939 1,
940 3
941 );
942 }
943 // Resize and convert happens here
944 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
945 }
946 // Revisions Control
947 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
948 $revisions_control = new ASENHA\Classes\Revisions_Control();
949 add_filter(
950 'wp_revisions_to_keep',
951 [$revisions_control, 'limit_revisions_to_max_number'],
952 10,
953 2
954 );
955 }
956 // Heartbeat Control
957 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
958 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
959 add_filter(
960 'heartbeat_settings',
961 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
962 99,
963 2
964 );
965 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
966 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
967 }
968 // =================================================================
969 // UTILITIES
970 // =================================================================
971 // SMTP Email Delivery
972 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
973 $email_delivery = new ASENHA\Classes\Email_Delivery();
974 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
975 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
976 }
977 // Multiple User Roles
978 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
979 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
980 // Show roles checkboxes
981 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
982 // for when user edits their own profile
983 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
984 // for when editing other user's profile
985 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
986 // new user creation
987 // Save roles selections
988 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
989 // for when user edits their own profile
990 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
991 // for when editing other user's profile
992 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
993 // new user creation
994 }
995 // Image Sizes Panel
996 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
997 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
998 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
999 }
1000 // View Admin as Role
1001 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1002 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1003 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1004 // Priority 8 so it is next to username section
1005 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1006 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1007 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1008 }
1009 // Password Protection
1010 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1011 $password_protection = new ASENHA\Classes\Password_Protection();
1012 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1013 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1014 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1015 // load early
1016 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1017 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1018 if ( function_exists( 'wp_site_icon' ) ) {
1019 // WP v4.3+
1020 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1021 }
1022 }
1023 // Maintenance Mode
1024 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1025 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1026 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1027 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1028 }
1029 // Redirect 404 to Homepage
1030 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1031 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1032 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1033 }
1034 // Display System Summary
1035 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1036 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1037 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1038 }
1039 // Search Engines Visibility Status
1040 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1041 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1042 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1043 }
1044 }
1045
1046 }
1047
1048 Admin_Site_Enhancements::get_instance();