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