PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 9.0.2
Admin and Site Enhancements (ASE) v9.0.2
9.1.1 9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / bootstrap.php
admin-site-enhancements Last commit date
assets 2 weeks ago classes 2 weeks ago includes 2 weeks ago languages 2 weeks ago vendor 2 weeks ago CHANGELOG.md 2 weeks ago LICENSE.md 2 weeks ago README.md 2 weeks ago admin-site-enhancements.php 2 weeks ago bootstrap.php 2 weeks ago functions.php 2 weeks ago settings.php 2 weeks ago
bootstrap.php
1191 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 block editor scripts and styles
48 add_action( 'enqueue_block_editor_assets', 'asenha_block_editor_scripts' );
49 // Enqueue public scripts and styles
50 add_action( 'wp_enqueue_scripts', 'asenha_public_scripts' );
51 // Dequeue scripts that prevents settings page from working
52 add_action( 'wp_print_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
53 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_scritps', PHP_INT_MAX );
54 add_action( 'admin_enqueue_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
55 add_action( 'admin_print_scripts-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
56 add_action( 'admin_print_styles-tools_page_admin-site-enhancements', 'asenha_dequeue_scritps', PHP_INT_MAX );
57 add_action( 'admin_enqueue_scripts-settings_page_admin-menu-organizer', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
58 add_action( 'admin_enqueue_scripts-settings_page_asenha-admin-bar', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
59 add_action( 'admin_print_scripts-settings_page_admin-menu-organizer', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
60 add_action( 'admin_print_scripts-settings_page_asenha-admin-bar', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
61 add_action( 'admin_print_footer_scripts', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
62 add_action( 'admin_footer', 'asenha_dequeue_conflicting_assets_on_custom_admin_pages', PHP_INT_MAX );
63 add_filter(
64 'script_loader_tag',
65 'asenha_block_glossary_admin_script_on_amo',
66 PHP_INT_MAX,
67 3
68 );
69 // Add admin bar inline styles
70 add_action( 'admin_head', 'asenha_admin_bar_item_js_css' );
71 add_action( 'wp_head', 'asenha_admin_bar_item_js_css' );
72 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
73 // Mark that a user have supported ASE (via AJAX)
74 add_action( 'wp_ajax_have_supported', 'asenha_have_supported' );
75 // Dismiss upgrade nudge (via AJAX)
76 add_action( 'wp_ajax_dismiss_upgrade_nudge', 'asenha_dismiss_upgrade_nudge' );
77 // Dismiss promo nudge (via AJAX)
78 add_action( 'wp_ajax_dismiss_promo_nudge', 'asenha_dismiss_promo_nudge' );
79 // Dismiss support nudge (via AJAX)
80 add_action( 'wp_ajax_dismiss_support_nudge', 'asenha_dismiss_support_nudge' );
81 // Release login lock (via AJAX)
82 add_action( 'wp_ajax_asenha_release_login_lock', 'asenha_release_login_lock' );
83 if ( function_exists( 'bwasenha_fs' ) ) {
84 bwasenha_fs()->add_filter( 'plugin_icon', 'fs_custom_optin_icon__premium_only' );
85 }
86 // Get all ASE options, default to empty array in case it's not been created yet
87 $options = get_option( ASENHA_SLUG_U, array() );
88 // Add style="display:[something];" to the safe CSS attributes.
89 // Ref: https://github.com/WordPress/wordpress-develop/blob/6.4/src/wp-includes/kses.php#L2329
90 // Ref: https://wordpress.stackexchange.com/a/195433
91 add_filter( 'safe_style_css', function ( $styles ) {
92 $styles[] = 'display';
93 return $styles;
94 } );
95 // ===== Activate modules based on settings =====
96 // Ensure SVG admin menu icons render with the correct admin color scheme on first paint.
97 // Modules can register SVG data URI icons with this helper and then use a Dashicon placeholder.
98 if ( is_admin() ) {
99 add_action( 'admin_enqueue_scripts', array('ASENHA\\Classes\\Admin_Menu_Svg_Icon_Mask', 'enqueue_mask_css'), 99 );
100 }
101 // Content Duplication
102 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
103 $content_duplication = new ASENHA\Classes\Content_Duplication();
104 add_action( 'admin_action_duplicate_content', [$content_duplication, 'duplicate_content'] );
105 add_filter(
106 'page_row_actions',
107 [$content_duplication, 'add_duplication_action_link'],
108 20,
109 2
110 );
111 add_filter(
112 'post_row_actions',
113 [$content_duplication, 'add_duplication_action_link'],
114 20,
115 2
116 );
117 add_action( 'admin_bar_menu', [$content_duplication, 'add_admin_bar_duplication_link'], 100 );
118 }
119 // Content Order
120 if ( array_key_exists( 'content_order', $options ) && $options['content_order'] ) {
121 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'] ) ) {
122 $content_order = new ASENHA\Classes\Content_Order();
123 add_action( 'admin_menu', [$content_order, 'add_content_order_submenu'] );
124 add_action( 'admin_init', [$content_order, 'maybe_perform_menu_link_redirects'] );
125 add_action( 'admin_footer', [$content_order, 'add_additional_elements'] );
126 add_filter( 'admin_enqueue_scripts', [$content_order, 'add_list_tables_scripts'] );
127 add_action( 'wp_ajax_save_custom_order', [$content_order, 'save_custom_content_order'] );
128 add_filter( 'pre_get_posts', [$content_order, 'orderby_menu_order'], PHP_INT_MAX );
129 // TODO: https://developer.wordpress.org/reference/hooks/ajax_query_attachments_args/ (for grid view of media library)
130 add_filter(
131 'save_post',
132 [$content_order, 'set_menu_order_for_new_posts'],
133 10,
134 3
135 );
136 }
137 }
138 // Media Library Access Control
139 if ( array_key_exists( 'media_files_visibility_control', $options ) && $options['media_files_visibility_control'] ) {
140 $media_files_visibility_control = new ASENHA\Classes\Media_Files_Visibility_Control();
141 add_filter( 'ajax_query_attachments_args', [$media_files_visibility_control, 'filter_attachments_grid'] );
142 add_action( 'pre_get_posts', [$media_files_visibility_control, 'filter_attachments_list'] );
143 }
144 // Media Replacement
145 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
146 $media_replacement = new ASENHA\Classes\Media_Replacement();
147 $disable_media_replacement_cache_busting = ( isset( $options['disable_media_replacement_cache_busting'] ) ? $options['disable_media_replacement_cache_busting'] : false );
148 add_filter(
149 'media_row_actions',
150 [$media_replacement, 'modify_media_list_table_edit_link'],
151 10,
152 2
153 );
154 add_action( 'admin_init', [$media_replacement, 'register_attachment_fields_filter'] );
155 add_action( 'edit_attachment', [$media_replacement, 'replace_media'] );
156 add_filter( 'post_updated_messages', [$media_replacement, 'attachment_updated_custom_message'] );
157 // Mayve bust browser cache of old/replaced images by appending a time stamp URL parameter
158 if ( !$disable_media_replacement_cache_busting ) {
159 add_filter(
160 'wp_calculate_image_srcset',
161 [$media_replacement, 'append_cache_busting_param_to_image_srcset'],
162 10,
163 5
164 );
165 add_filter(
166 'wp_get_attachment_image_src',
167 [$media_replacement, 'append_cache_busting_param_to_attachment_image_src'],
168 10,
169 2
170 );
171 add_filter(
172 'wp_prepare_attachment_for_js',
173 [$media_replacement, 'append_cache_busting_param_to_attachment_for_js'],
174 10,
175 2
176 );
177 add_filter(
178 'wp_get_attachment_url',
179 [$media_replacement, 'append_cache_busting_param_to_attachment_url'],
180 20,
181 2
182 );
183 }
184 }
185 // Media Library Infinite Scrolling
186 if ( array_key_exists( 'media_library_infinite_scrolling', $options ) && $options['media_library_infinite_scrolling'] ) {
187 add_filter( 'media_library_infinite_scrolling', '__return_true' );
188 }
189 // SVG Upload
190 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'] ) ) {
191 global $roles_svg_upload_enabled;
192 $enable_svg_upload = $options['enable_svg_upload'];
193 $for_roles = $options['enable_svg_upload_for'];
194 // User has role(s). Do further checks.
195 if ( isset( $for_roles ) && count( $for_roles ) > 0 ) {
196 // Assemble single-dimensional array of roles for which SVG upload would be enabled
197 $roles_svg_upload_enabled = array();
198 foreach ( $for_roles as $role_slug => $svg_upload_enabled ) {
199 if ( $svg_upload_enabled ) {
200 $roles_svg_upload_enabled[] = $role_slug;
201 }
202 }
203 }
204 $svg_upload = new ASENHA\Classes\SVG_Upload();
205 add_filter( 'upload_mimes', [$svg_upload, 'add_svg_mime'] );
206 add_filter(
207 'wp_check_filetype_and_ext',
208 [$svg_upload, 'confirm_file_type_is_svg'],
209 10,
210 4
211 );
212 add_filter( 'wp_handle_sideload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
213 add_filter( 'wp_handle_upload_prefilter', [$svg_upload, 'sanitize_and_maybe_allow_svg_upload'] );
214 add_filter(
215 'wp_handle_upload',
216 [$svg_upload, 'sanitize_svg_on_handle_upload'],
217 10,
218 2
219 );
220 add_filter(
221 'xmlrpc_prepare_media_item',
222 [$svg_upload, 'sanitize_xmlrpc_svg_upload'],
223 10,
224 2
225 );
226 add_action(
227 'rest_insert_attachment',
228 [$svg_upload, 'sanitize_after_upload'],
229 10,
230 3
231 );
232 add_filter(
233 'wp_generate_attachment_metadata',
234 [$svg_upload, 'generate_svg_metadata'],
235 10,
236 3
237 );
238 add_filter( 'wp_calculate_image_srcset', [$svg_upload, 'disable_svg_srcset'] );
239 if ( !in_array( 'auto-sizes/auto-sizes.php', get_option( 'active_plugins', array() ) ) ) {
240 // Only add this filter when https://wordpress.org/plugins/auto-sizes/ is not active to prevent PHP deprecation notice
241 add_filter(
242 'wp_calculate_image_sizes',
243 [$svg_upload, 'remove_svg_responsive_image_attr'],
244 10,
245 3
246 );
247 }
248 add_action( 'wp_ajax_svg_get_attachment_url', [$svg_upload, 'get_svg_attachment_url'] );
249 add_filter( 'wp_prepare_attachment_for_js', [$svg_upload, 'get_svg_url_in_media_library'] );
250 }
251 // AVIF Upload
252 if ( array_key_exists( 'enable_avif_upload', $options ) && $options['enable_avif_upload'] ) {
253 $avif_upload = new ASENHA\Classes\AVIF_Upload();
254 add_filter( 'mime_types', [$avif_upload, 'add_avif_mime_type'] );
255 add_filter( 'upload_mimes', [$avif_upload, 'allow_avif_mime_type_upload'] );
256 add_filter( 'getimagesize_mimes_to_exts', [$avif_upload, 'add_avif_mime_type_to_exts'] );
257 add_filter(
258 'wp_generate_attachment_metadata',
259 [$avif_upload, 'add_avif_image_dimension'],
260 10,
261 3
262 );
263 add_filter(
264 'file_is_displayable_image',
265 [$avif_upload, 'make_avif_displayable'],
266 10,
267 2
268 );
269 add_filter(
270 'wp_check_filetype_and_ext',
271 [$avif_upload, 'handle_exif_and_fileinfo_fail'],
272 10,
273 5
274 );
275 }
276 // External Permalinks
277 if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) {
278 if ( array_key_exists( 'enable_external_permalinks_for', $options ) && !empty( $options['enable_external_permalinks_for'] ) ) {
279 $external_permalinks = new ASENHA\Classes\External_Permalinks();
280 add_action(
281 'add_meta_boxes',
282 [$external_permalinks, 'add_external_permalink_meta_box'],
283 10,
284 2
285 );
286 add_action( 'save_post', [$external_permalinks, 'save_external_permalink'] );
287 // Filter the permalink for use by get_permalink()
288 add_filter(
289 'page_link',
290 [$external_permalinks, 'use_external_permalink_for_pages'],
291 20,
292 2
293 );
294 add_filter(
295 'post_link',
296 [$external_permalinks, 'use_external_permalink_for_posts'],
297 20,
298 2
299 );
300 add_filter(
301 'post_type_link',
302 [$external_permalinks, 'use_external_permalink_for_posts'],
303 20,
304 2
305 );
306 // Enable redirection to external permalink when page/post is opened directly via it's WP permalink
307 add_action( 'wp', [$external_permalinks, 'redirect_to_external_permalink'] );
308 }
309 }
310 // Open All External Links in New Tab
311 if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) {
312 $open_external_links_in_new_tab = new ASENHA\Classes\Open_External_Links_In_New_Tab();
313 add_filter( 'the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
314 if ( in_array( 'elementor/elementor.php', get_option( 'active_plugins', array() ) ) ) {
315 add_filter( 'elementor/frontend/the_content', [$open_external_links_in_new_tab, 'add_target_and_rel_atts_to_content_links'] );
316 }
317 }
318 // Allow Custom Menu Links to Open in New Tab
319 if ( array_key_exists( 'custom_nav_menu_items_new_tab', $options ) && $options['custom_nav_menu_items_new_tab'] ) {
320 $custom_nav_menu_items_in_new_tab = new ASENHA\Classes\Custom_Nav_Menu_Items_In_New_Tab();
321 add_filter(
322 'wp_nav_menu_item_custom_fields',
323 [$custom_nav_menu_items_in_new_tab, 'add_custom_nav_menu_open_in_new_tab_field'],
324 10,
325 4
326 );
327 add_action(
328 'wp_update_nav_menu_item',
329 [$custom_nav_menu_items_in_new_tab, 'save_custom_nav_menu_open_in_new_tab_status'],
330 10,
331 3
332 );
333 add_action(
334 'nav_menu_link_attributes',
335 [$custom_nav_menu_items_in_new_tab, 'add_attributes_to_custom_nav_menu_item'],
336 10,
337 3
338 );
339 }
340 // Auto-Publishing of Posts with Missed Schedules
341 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
342 $auto_publish_posts_with_missed_schedule = new ASENHA\Classes\Auto_Publish_Posts_With_Missed_Schedule();
343 add_action( 'wp_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
344 add_action( 'admin_head', [$auto_publish_posts_with_missed_schedule, 'publish_missed_schedule_posts'] );
345 }
346 // Hide or Modify Elements / Clean Up Admin Bar
347 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
348 $cleanup_admin_bar = new ASENHA\Classes\Cleanup_Admin_Bar();
349 // Priority 5 to execute earlier than the normal 10. This is for removing default items.
350 add_filter( 'admin_bar_menu', [$cleanup_admin_bar, 'modify_admin_bar_menu'], 5 );
351 // Priority 100: after third-party Howdy removers on this hook (e.g. Divi Assistant at 10).
352 add_action( 'wp_before_admin_bar_render', [$cleanup_admin_bar, 'remove_howdy'], 100 );
353 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
354 add_action( 'admin_head', [$cleanup_admin_bar, 'hide_help_drawer'] );
355 }
356 }
357 // Hide Admin Notices
358 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
359 $hide_admin_notices = new ASENHA\Classes\Hide_Admin_Notices();
360 add_action( 'admin_footer', [$hide_admin_notices, 'admin_notices_wrapper'], 9 );
361 // add_action( 'all_admin_notices', [ $hide_admin_notices, 'admin_notices_wrapper' ] );
362 // add_action( 'admin_notices', [ $hide_admin_notices, 'show_test_admin_notice_for_all_user_roles' ] );
363 add_action( 'admin_bar_menu', [$hide_admin_notices, 'admin_notices_menu'] );
364 add_action( 'admin_print_styles', [$hide_admin_notices, 'admin_notices_menu_inline_css'] );
365 }
366 // Disable Dashboard Widgets
367 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
368 $disable_dashboard_widgets = new ASENHA\Classes\Disable_Dashboard_Widgets();
369 add_action( 'wp_dashboard_setup', [$disable_dashboard_widgets, 'disable_dashboard_widgets'], PHP_INT_MAX );
370 add_action( 'admin_init', [$disable_dashboard_widgets, 'maybe_remove_welcome_panel'] );
371 }
372 // Hide Admin Bar
373 if ( array_key_exists( 'hide_admin_bar', $options ) && $options['hide_admin_bar'] ) {
374 $hide_admin_bar = new ASENHA\Classes\Hide_Admin_Bar();
375 }
376 // On the frontend
377 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'] ) ) {
378 add_filter( 'show_admin_bar', [$hide_admin_bar, 'hide_admin_bar_for_roles_on_frontend'] );
379 }
380 // Wider Admin Menu
381 if ( array_key_exists( 'wider_admin_menu', $options ) && $options['wider_admin_menu'] ) {
382 $wider_admin_menu = new ASENHA\Classes\Wider_Admin_Menu();
383 add_action( 'admin_head', [$wider_admin_menu, 'set_custom_menu_width'], 99 );
384 }
385 // Admin Menu Organizer
386 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
387 $options_extra = get_option( ASENHA_SLUG_U . '_extra', array() );
388 $admin_menu_options = ( isset( $options_extra['admin_menu'] ) ? $options_extra['admin_menu'] : array() );
389 $admin_menu_organizer = new ASENHA\Classes\Admin_Menu_Organizer();
390 if ( array_key_exists( 'admin_menu_organizer_sticky_collapse_menu', $options ) && $options['admin_menu_organizer_sticky_collapse_menu'] ) {
391 add_action( 'admin_head', [$admin_menu_organizer, 'make_collapse_menu_item_sticky'] );
392 }
393 add_action( 'admin_menu', [$admin_menu_organizer, 'add_menu_item'] );
394 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_menu_organizer, 'save_custom_menu_order' ] );
395 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_menu_organizer, 'save_hidden_menu_items' ] );
396 if ( array_key_exists( 'custom_menu_order', $admin_menu_options ) ) {
397 add_filter( 'custom_menu_order', '__return_true', PHP_INT_MAX );
398 add_filter( 'menu_order', [$admin_menu_organizer, 'render_custom_menu_order'], PHP_INT_MAX );
399 }
400 if ( array_key_exists( 'custom_menu_titles', $admin_menu_options ) ) {
401 add_action( 'admin_menu', [$admin_menu_organizer, 'apply_custom_menu_item_titles'], 10000000001 );
402 add_action( 'init', [$admin_menu_organizer, 'apply_custom_title_for_posts_menu'] );
403 }
404 if ( array_key_exists( 'custom_menu_hidden', $admin_menu_options ) || array_key_exists( 'custom_menu_always_hidden', $admin_menu_options ) ) {
405 add_action( 'admin_menu', [$admin_menu_organizer, 'hide_menu_items'], 9999999996 );
406 add_action( 'admin_menu', [$admin_menu_organizer, 'add_hidden_menu_toggle'], 9999999997 );
407 add_action( 'admin_enqueue_scripts', [$admin_menu_organizer, 'enqueue_toggle_hidden_menu_script'] );
408 }
409 add_action( 'wp_ajax_save_admin_menu', [$admin_menu_organizer, 'save_admin_menu'] );
410 add_action( 'wp_ajax_reset_admin_menu', [$admin_menu_organizer, 'reset_admin_menu'] );
411 }
412 // Navigation Menu Duplicator
413 if ( array_key_exists( 'enable_navigation_menu_duplicator', $options ) && $options['enable_navigation_menu_duplicator'] ) {
414 $navigation_menu_duplicator = new ASENHA\Classes\Navigation_Menu_Duplicator();
415 add_action( 'admin_enqueue_scripts', [$navigation_menu_duplicator, 'enqueue_scripts'] );
416 add_action( 'admin_init', [$navigation_menu_duplicator, 'maybe_handle_duplicate_request'] );
417 }
418 // Show Custom Taxonomy Filters
419 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
420 $show_custom_taxonomy_filters = new ASENHA\Classes\Show_Custom_Taxonomy_Filters();
421 add_action( 'restrict_manage_posts', [$show_custom_taxonomy_filters, 'show_custom_taxonomy_filters'] );
422 }
423 // Enhance List Tables
424 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
425 $enhance_list_tables = new ASENHA\Classes\Enhance_List_Tables();
426 // Show Featured Image Column
427 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
428 add_action( 'admin_init', [$enhance_list_tables, 'show_featured_image_column'] );
429 }
430 // Show Excerpt Column
431 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
432 add_action( 'admin_init', [$enhance_list_tables, 'show_excerpt_column'] );
433 }
434 // Show Last Modified Column
435 if ( array_key_exists( 'show_last_modified_column', $options ) && $options['show_last_modified_column'] ) {
436 add_action( 'admin_init', [$enhance_list_tables, 'show_last_modified_column'] );
437 }
438 // Show ID Column
439 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
440 add_action( 'admin_init', [$enhance_list_tables, 'show_id_column'] );
441 }
442 // Show File Size Column in Media Library
443 if ( array_key_exists( 'show_file_size_column', $options ) && $options['show_file_size_column'] ) {
444 add_filter( 'manage_upload_columns', [$enhance_list_tables, 'add_column_file_size'] );
445 add_action(
446 'manage_media_custom_column',
447 [$enhance_list_tables, 'display_file_size'],
448 10,
449 2
450 );
451 add_action( 'admin_head', [$enhance_list_tables, 'add_media_styles'] );
452 }
453 // Show ID in Action Row
454 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
455 add_action( 'admin_init', [$enhance_list_tables, 'show_id_in_action_row'] );
456 }
457 // Hide Date Column
458 if ( array_key_exists( 'hide_date_column', $options ) && $options['hide_date_column'] ) {
459 add_action( 'admin_init', [$enhance_list_tables, 'hide_date_column'] );
460 }
461 // Hide Comments Column
462 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
463 add_action( 'admin_init', [$enhance_list_tables, 'hide_comments_column'] );
464 }
465 // Hide Post Tags Column
466 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
467 add_action( 'admin_init', [$enhance_list_tables, 'hide_post_tags_column'] );
468 }
469 }
470 // Various Admin UI Enhancements
471 if ( array_key_exists( 'various_admin_ui_enhancements', $options ) && $options['various_admin_ui_enhancements'] ) {
472 $various_admin_ui_enhancements = new ASENHA\Classes\Various_Admin_Ui_Enhancements();
473 // Display Active Plugins First
474 if ( array_key_exists( 'display_active_plugins_first', $options ) && $options['display_active_plugins_first'] ) {
475 add_action( 'admin_head-plugins.php', [$various_admin_ui_enhancements, 'show_active_plugins_first'] );
476 }
477 }
478 // Custom Admin Footer Text
479 if ( array_key_exists( 'custom_admin_footer_text', $options ) && $options['custom_admin_footer_text'] ) {
480 $custom_admin_footer_text = new ASENHA\Classes\Custom_Admin_Footer_Text();
481 // Update footer text
482 if ( is_asenha() ) {
483 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
484 } else {
485 add_filter( 'admin_footer_text', [$custom_admin_footer_text, 'custom_admin_footer_text_left'], 20 );
486 }
487 // Update footer version text
488 if ( is_asenha() ) {
489 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
490 } else {
491 add_filter( 'update_footer', [$custom_admin_footer_text, 'custom_admin_footer_text_right'], 20 );
492 }
493 } else {
494 // Update footer text
495 if ( is_asenha() ) {
496 add_filter( 'admin_footer_text', 'asenha_footer_text', 20 );
497 }
498 // Update footer version text
499 if ( is_asenha() ) {
500 add_filter( 'update_footer', 'asenha_footer_version_text', 20 );
501 }
502 }
503 // =================================================================
504 // LOG IN | LOG OUT
505 // =================================================================
506 // Change Login URL
507 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
508 if ( array_key_exists( 'custom_login_slug', $options ) && !empty( $options['custom_login_slug'] ) ) {
509 $change_login_url = new ASENHA\Classes\Change_Login_URL();
510 add_action( 'init', [$change_login_url, 'redirect_on_custom_login_url'] );
511 if ( in_array( 'gravityforms/gravityforms.php', get_option( 'active_plugins', array() ) ) ) {
512 // Load earlier than Gravity Forms process_exterior_pages()
513 add_action( 'wp', [$change_login_url, 'prevent_redirect_to_custom_login_url'], 0 );
514 }
515 add_filter(
516 'login_url',
517 [$change_login_url, 'customize_login_url'],
518 10,
519 3
520 );
521 add_filter( 'lostpassword_url', [$change_login_url, 'customize_lost_password_url'] );
522 add_filter( 'register_url', [$change_login_url, 'customize_register_url'] );
523 add_action( 'wp_loaded', [$change_login_url, 'redirect_on_default_login_urls'] );
524 add_action( 'wp_login_failed', [$change_login_url, 'redirect_to_custom_login_url_on_login_fail'] );
525 add_filter( 'login_message', [$change_login_url, 'add_failed_login_message'] );
526 // No need to modify logout_url or perform redirect on logout
527 // The customized login URL is already being returned after logout
528 // add_action( 'wp_logout', [ $change_login_url, 'redirect_to_custom_login_url_on_logout_success' ] );
529 // add_filter( 'logout_url', [ $change_login_url, 'customize_logout_url' ], 10, 2 );
530 }
531 }
532 // Login ID Type
533 if ( array_key_exists( 'login_id_type_restriction', $options ) && $options['login_id_type_restriction'] ) {
534 if ( array_key_exists( 'login_id_type', $options ) && !empty( $options['login_id_type'] ) ) {
535 $login_id_type = new ASENHA\Classes\Login_ID_Type();
536 switch ( $options['login_id_type'] ) {
537 case 'username':
538 remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
539 add_filter( 'login_form_defaults', [$login_id_type, 'change_login_form_defaults'] );
540 add_filter(
541 'gettext',
542 [$login_id_type, 'gettext_login_id_username'],
543 20,
544 3
545 );
546 break;
547 case 'email':
548 add_filter(
549 'authenticate',
550 [$login_id_type, 'authenticate_email'],
551 20,
552 3
553 );
554 add_filter(
555 'gettext',
556 [$login_id_type, 'gettext_login_id_email'],
557 20,
558 3
559 );
560 break;
561 }
562 }
563 }
564 // Use Site Identity on the Login Page
565 if ( array_key_exists( 'site_identity_on_login', $options ) && $options['site_identity_on_login'] ) {
566 $site_identity_on_login_page = new ASENHA\Classes\Site_Identity_On_Login_Page();
567 add_action( 'login_head', [$site_identity_on_login_page, 'use_site_icon_on_login'] );
568 add_filter( 'login_headerurl', [$site_identity_on_login_page, 'use_site_url_on_login'] );
569 }
570 // Login Logout Menu
571 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
572 $login_logout_menu = new ASENHA\Classes\Login_Logout_Menu();
573 add_action( 'admin_head-nav-menus.php', [$login_logout_menu, 'add_login_logout_metabox'] );
574 add_filter( 'wp_setup_nav_menu_item', [$login_logout_menu, 'set_login_logout_menu_item_dynamic_url'] );
575 add_filter( 'wp_nav_menu_objects', [$login_logout_menu, 'maybe_remove_login_or_logout_menu_item'] );
576 }
577 // Last Login Column
578 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
579 $last_login_column = new ASENHA\Classes\Last_Login_Column();
580 add_action(
581 'wp_login',
582 [$last_login_column, 'log_login_datetime'],
583 3,
584 1
585 );
586 // Earlier than Redirect After Login
587 add_filter( 'manage_users_columns', [$last_login_column, 'add_last_login_column'] );
588 add_filter(
589 'manage_users_custom_column',
590 [$last_login_column, 'show_last_login_info'],
591 10,
592 3
593 );
594 add_action( 'admin_print_styles-users.php', [$last_login_column, 'add_column_style'] );
595 }
596 // Registration Date Column
597 if ( array_key_exists( 'registration_date_column', $options ) && $options['registration_date_column'] ) {
598 $registration_date_column = new ASENHA\Classes\Registration_Date_Column();
599 add_filter( 'manage_users_columns', [$registration_date_column, 'add_registration_date_column'] );
600 add_filter(
601 'manage_users_custom_column',
602 [$registration_date_column, 'display_registration_date'],
603 10,
604 3
605 );
606 }
607 // Redirect After Login
608 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
609 if ( array_key_exists( 'redirect_after_login_for', $options ) && !empty( $options['redirect_after_login_for'] ) ) {
610 $redirect_after_login = new ASENHA\Classes\Redirect_After_Login();
611 add_filter(
612 'wp_login',
613 [$redirect_after_login, 'redirect_after_login'],
614 5,
615 2
616 );
617 add_filter(
618 'login_redirect',
619 [$redirect_after_login, 'filter_login_redirect'],
620 10,
621 3
622 );
623 }
624 }
625 // Redirect After Logout
626 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
627 if ( array_key_exists( 'redirect_after_logout_for', $options ) && !empty( $options['redirect_after_logout_for'] ) ) {
628 $redirect_after_logout = new ASENHA\Classes\Redirect_After_Logout();
629 add_action(
630 'wp_logout',
631 [$redirect_after_logout, 'redirect_after_logout'],
632 5,
633 1
634 );
635 // load earlier than Change Login URL add_action
636 // add_filter( 'logout_redirect', [ $redirect_after_logout, 'apply_custom_logout_redirect' ], PHP_INT_MAX, 3 );
637 // add_filter( 'logout_url', [ $redirect_after_logout, 'add_redirect_to_in_logout_url' ], PHP_INT_MAX, 2 );
638 }
639 }
640 // Disable User Account
641 if ( array_key_exists( 'disable_user_account', $options ) && $options['disable_user_account'] ) {
642 $disable_user_account = new ASENHA\Classes\Disable_User_Account();
643 $disable_user_account->register_hooks();
644 }
645 // Enable Custom Admin / Frontend CSS
646 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'] ) {
647 $custom_css = new ASENHA\Classes\Custom_Css();
648 }
649 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
650 // add_filter( 'admin_enqueue_scripts', [ $custom_css, 'custom_admin_css' ] );
651 add_filter( 'admin_print_footer_scripts', [$custom_css, 'custom_admin_css'] );
652 }
653 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
654 add_filter( 'wp_head', [$custom_css, 'custom_frontend_css'] );
655 }
656 // Insert <head>, <body> and <footer> code
657 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
658 $insert_code = new ASENHA\Classes\Insert_Head_Body_Footer_Code();
659 if ( isset( $options['head_code_priority'] ) ) {
660 add_action( 'wp_head', [$insert_code, 'insert_head_code'], $options['head_code_priority'] );
661 } else {
662 add_action( 'wp_head', [$insert_code, 'insert_head_code'], 10 );
663 }
664 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
665 if ( isset( $options['body_code_priority'] ) ) {
666 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], $options['body_code_priority'] );
667 } else {
668 add_action( 'wp_body_open', [$insert_code, 'insert_body_code'], 10 );
669 }
670 }
671 if ( isset( $options['footer_code_priority'] ) ) {
672 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], $options['footer_code_priority'] );
673 } else {
674 add_action( 'wp_footer', [$insert_code, 'insert_footer_code'], 10 );
675 }
676 }
677 // Custom Body Class
678 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
679 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && !empty( $options['enable_custom_body_class_for'] ) ) {
680 $custom_body_class = new ASENHA\Classes\Custom_Body_Class();
681 add_action(
682 'add_meta_boxes',
683 [$custom_body_class, 'add_custom_body_class_meta_box'],
684 10,
685 2
686 );
687 add_action( 'save_post', [$custom_body_class, 'save_custom_body_class'], 99 );
688 add_filter( 'body_class', [$custom_body_class, 'append_custom_body_class'], 99 );
689 }
690 }
691 // Manage ads.txt and app-ads.txt
692 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
693 $manage_ads_appads_txt = new ASENHA\Classes\Manage_Ads_Appads_Txt();
694 add_action( 'init', [$manage_ads_appads_txt, 'show_ads_appads_txt_content'] );
695 }
696 // Manage robots.txt
697 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
698 $manage_robots_txt = new ASENHA\Classes\Manage_Robots_Txt();
699 add_filter(
700 'robots_txt',
701 [$manage_robots_txt, 'maybe_show_custom_robots_txt_content'],
702 PHP_INT_MAX,
703 2
704 );
705 }
706 // =================================================================
707 // DISABLE COMPONENTS
708 // =================================================================
709 // Disable Gutenberg
710 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
711 $load_disable_gutenberg = false;
712 if ( array_key_exists( 'disable_gutenberg_for', $options ) && !empty( $options['disable_gutenberg_for'] ) ) {
713 $load_disable_gutenberg = true;
714 }
715 $disable_gutenberg = null;
716 if ( $load_disable_gutenberg ) {
717 $disable_gutenberg = new ASENHA\Classes\Disable_Gutenberg();
718 if ( !class_exists( 'Classic_Editor' ) ) {
719 require_once ASENHA_PATH . 'includes/empty-class-classic-editor.php';
720 }
721 add_action( 'admin_init', [$disable_gutenberg, 'disable_gutenberg_for_post_types_admin'] );
722 add_action( 'admin_print_styles', [$disable_gutenberg, 'safari_18_fix'] );
723 $load_disable_gutenberg_frontend_styles = false;
724 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
725 $load_disable_gutenberg_frontend_styles = true;
726 }
727 if ( $load_disable_gutenberg_frontend_styles ) {
728 add_action( 'wp_enqueue_scripts', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'], 999999 );
729 add_action( 'wp_footer', [$disable_gutenberg, 'disable_gutenberg_for_post_types_frontend'] );
730 }
731 }
732 }
733 // Disable Comments
734 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
735 if ( array_key_exists( 'disable_comments_for', $options ) && !empty( $options['disable_comments_for'] ) ) {
736 $disable_comments = new ASENHA\Classes\Disable_Comments();
737 add_action( 'admin_init', [$disable_comments, 'disable_comments_for_post_types_edit'] );
738 // also work with 'init', 'admin_init', 'wp_loaded', 'do_meta_boxes' hooks
739 add_action( 'template_redirect', [$disable_comments, 'show_blank_comment_template'] );
740 add_action( 'wp_loaded', [$disable_comments, 'hide_existing_comments_on_frontend'] );
741 add_filter(
742 'comments_array',
743 [$disable_comments, 'maybe_return_empty_comments'],
744 20,
745 2
746 );
747 add_filter(
748 'comments_open',
749 [$disable_comments, 'close_comments_pings_on_frontend'],
750 20,
751 2
752 );
753 add_filter(
754 'pings_open',
755 [$disable_comments, 'close_comments_pings_on_frontend'],
756 20,
757 2
758 );
759 add_filter(
760 'get_comments_number',
761 [$disable_comments, 'return_zero_comments_count'],
762 20,
763 2
764 );
765 // Disable commenting via XML-RPC
766 add_filter( 'xmlrpc_allow_anonymous_comments', '__return_false' );
767 add_filter( 'xmlrpc_methods', [$disable_comments, 'disable_xmlrpc_comments'] );
768 // Disable commenting via REST API
769 add_filter( 'rest_endpoints', [$disable_comments, 'disable_rest_api_comments_endpoints'] );
770 add_filter(
771 'rest_pre_insert_comment',
772 [$disable_comments, 'return_blank_comment'],
773 10,
774 2
775 );
776 }
777 }
778 // Disable REST API
779 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
780 if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
781 $disable_rest_api = new ASENHA\Classes\Disable_REST_API();
782 add_filter( 'rest_authentication_errors', [$disable_rest_api, 'disable_rest_api'], 200 );
783 } else {
784 // REST API 1.x
785 add_filter( 'json_enabled', '__return_false' );
786 add_filter( 'json_jsonp_enabled', '__return_false' );
787 // REST API 2.x
788 add_filter( 'rest_enabled', '__return_false' );
789 add_filter( 'rest_jsonp_enabled', '__return_false' );
790 }
791 remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
792 // Disable REST API links in HTML <head>
793 remove_action(
794 'template_redirect',
795 'rest_output_link_header',
796 11,
797 0
798 );
799 // Disable REST API link in HTTP headers
800 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
801 // Remove REST API URL from the WP RSD endpoint.
802 }
803 // Disable Feeds
804 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
805 remove_action( 'wp_head', 'feed_links', 2 );
806 // Remove feed links in <head>
807 remove_action( 'wp_head', 'feed_links_extra', 3 );
808 // Remove feed links in <head>
809 remove_action(
810 'do_feed_rdf',
811 'do_feed_rdf',
812 10,
813 0
814 );
815 remove_action(
816 'do_feed_rss',
817 'do_feed_rss',
818 10,
819 0
820 );
821 remove_action(
822 'do_feed_rss2',
823 'do_feed_rss2',
824 10,
825 1
826 );
827 remove_action(
828 'do_feed_atom',
829 'do_feed_atom',
830 10,
831 1
832 );
833 $disable_feeds = new ASENHA\Classes\Disable_Feeds();
834 add_action(
835 'template_redirect',
836 [$disable_feeds, 'redirect_feed_to_403'],
837 10,
838 1
839 );
840 }
841 // Disable Embeds
842 if ( array_key_exists( 'disable_embeds', $options ) && $options['disable_embeds'] ) {
843 $disable_embeds = new ASENHA\Classes\Disable_Embeds();
844 add_action( 'init', [$disable_embeds, 'disable_embeds_init'], 9999 );
845 $activation_embeds = new ASENHA\Classes\Activation();
846 add_action( 'init', [$activation_embeds, 'maybe_flush_disable_embeds_rewrite_rules'], 9999 );
847 }
848 // Disable All Updates
849 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
850 $disable_updates = new ASENHA\Classes\Disable_Updates();
851 add_action( 'admin_init', [$disable_updates, 'disable_update_notices_version_checks'] );
852 // Disable core update
853 add_filter( 'pre_transient_update_core', [$disable_updates, 'override_version_check_info'] );
854 add_filter( 'pre_site_transient_update_core', [$disable_updates, 'override_version_check_info'] );
855 // Disable theme updates
856 add_filter( 'pre_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
857 add_filter( 'pre_site_transient_update_themes', [$disable_updates, 'override_version_check_info'] );
858 add_action( 'pre_set_site_transient_update_themes', [$disable_updates, 'override_version_check_info'], 20 );
859 // Disable plugin updates
860 add_filter( 'pre_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
861 add_filter( 'pre_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'] );
862 add_action( 'pre_set_site_transient_update_plugins', [$disable_updates, 'override_version_check_info'], 20 );
863 // Disable auto updates
864 add_filter( 'automatic_updater_disabled', '__return_true' );
865 if ( !defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
866 define( 'AUTOMATIC_UPDATER_DISABLED', true );
867 }
868 if ( !defined( 'WP_AUTO_UPDATE_CORE' ) ) {
869 define( 'WP_AUTO_UPDATE_CORE', false );
870 }
871 add_filter( 'auto_update_core', '__return_false' );
872 add_filter( 'wp_auto_update_core', '__return_false' );
873 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
874 add_filter( 'allow_major_auto_core_updates', '__return_false' );
875 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
876 add_filter( 'auto_update_plugin', '__return_false' );
877 add_filter( 'auto_update_theme', '__return_false' );
878 add_filter( 'auto_update_translation', '__return_false' );
879 remove_action( 'init', 'wp_schedule_update_checks' );
880 // Disable update emails
881 add_filter( 'auto_core_update_send_email', '__return_false' );
882 add_filter( 'send_core_update_notification_email', '__return_false' );
883 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
884 // Remove Dashboard >> Updates menu
885 add_action( 'admin_menu', [$disable_updates, 'remove_updates_menu'] );
886 }
887 // Disable Author Archives
888 if ( array_key_exists( 'disable_author_archives', $options ) && $options['disable_author_archives'] ) {
889 $disable_author_archives = new ASENHA\Classes\Disable_Author_Archives();
890 add_action( 'template_redirect', [$disable_author_archives, 'redirect_to_404'], 1 );
891 add_filter( 'author_link', [$disable_author_archives, 'disable_frontend_author_link'], PHP_INT_MAX );
892 add_filter( 'user_row_actions', [$disable_author_archives, 'remove_user_view_action'], PHP_INT_MAX );
893 if ( class_exists( 'WP_Sitemaps' ) ) {
894 add_filter(
895 'wp_sitemaps_add_provider',
896 [$disable_author_archives, 'remove_users_from_sitemap'],
897 PHP_INT_MAX,
898 2
899 );
900 }
901 add_filter( 'author_rewrite_rules', [$disable_author_archives, 'disable_rewrite_rules_for_authors'], 10 );
902 }
903 // Disable Smaller Components
904 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
905 $disable_smaller_components = new ASENHA\Classes\Disable_Smaller_Components();
906 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
907 remove_action( 'wp_head', 'wp_generator' );
908 }
909 if ( array_key_exists( 'disable_feed_generator_tag', $options ) && $options['disable_feed_generator_tag'] ) {
910 add_filter(
911 'the_generator',
912 [$disable_smaller_components, 'remove_feed_generator_tag'],
913 10,
914 2
915 );
916 }
917 if ( array_key_exists( 'disable_resource_version_number', $options ) && $options['disable_resource_version_number'] ) {
918 add_filter( 'style_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
919 add_filter( 'script_loader_src', [$disable_smaller_components, 'remove_resource_version_number'], PHP_INT_MAX );
920 }
921 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
922 remove_action( 'wp_head', 'wlwmanifest_link' );
923 }
924 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
925 remove_action( 'wp_head', 'rsd_link' );
926 }
927 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
928 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L358
929 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
930 // https://github.com/WordPress/wordpress-develop/blob/646fd2308f87332b0db5218ee2071c0ff8db0d4c/src/wp-includes/default-filters.php#L363
931 remove_action(
932 'template_redirect',
933 'wp_shortlink_header',
934 11,
935 0
936 );
937 }
938 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
939 add_action( 'init', [$disable_smaller_components, 'disable_dashicons_public_assets'] );
940 }
941 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
942 add_action( 'init', [$disable_smaller_components, 'disable_emoji_support'] );
943 }
944 if ( array_key_exists( 'disable_jquery_migrate', $options ) && $options['disable_jquery_migrate'] ) {
945 add_action( 'wp_default_scripts', [$disable_smaller_components, 'disable_jquery_migrate'] );
946 }
947 if ( array_key_exists( 'disable_block_widgets', $options ) && $options['disable_block_widgets'] ) {
948 // Disables the block editor from managing widgets in the Gutenberg plugin.
949 add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
950 // Disables the block editor from managing widgets.
951 add_filter( 'use_widgets_block_editor', '__return_false' );
952 }
953 if ( array_key_exists( 'disable_lazy_load', $options ) && $options['disable_lazy_load'] ) {
954 add_filter( 'wp_lazy_loading_enabled', '__return_false' );
955 add_filter( 'wp_get_attachment_image_attributes', [$disable_smaller_components, 'eager_load_featured_images'] );
956 }
957 if ( array_key_exists( 'disable_application_passwords', $options ) && $options['disable_application_passwords'] ) {
958 add_filter( 'wp_is_application_passwords_available', '__return_false' );
959 }
960 if ( array_key_exists( 'disable_site_admin_email_verification_screen', $options ) && $options['disable_site_admin_email_verification_screen'] ) {
961 add_filter( 'admin_email_check_interval', '__return_false' );
962 }
963 if ( array_key_exists( 'disable_plugin_theme_editor', $options ) ) {
964 if ( $options['disable_plugin_theme_editor'] ) {
965 add_action( 'admin_init', [$disable_smaller_components, 'disable_plugin_theme_editor'], PHP_INT_MAX );
966 } else {
967 add_action( 'admin_init', [$disable_smaller_components, 'enable_plugin_theme_editor'], PHP_INT_MAX );
968 }
969 }
970 if ( array_key_exists( 'disable_user_email_notification_after_password_change', $options ) && $options['disable_user_email_notification_after_password_change'] ) {
971 add_filter( 'send_password_change_email', '__return_false' );
972 }
973 }
974 // =================================================================
975 // SECURITY
976 // =================================================================
977 // Limit Login Attempts — failed-login log cleanup cron (always registered so orphans are cleared)
978 $limit_login_attempts = new ASENHA\Classes\Limit_Login_Attempts();
979 add_action( 'plugins_loaded', [$limit_login_attempts, 'maybe_upgrade_failed_logins_log_table'], 5 );
980 add_action( 'added_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
981 add_action( 'updated_option', [$limit_login_attempts, 'trigger_clear_or_schedule_log_clean_up_by_amount'] );
982 add_action( 'plugins_loaded', [$limit_login_attempts, 'clear_or_schedule_log_clean_up_by_amount'] );
983 add_action( 'asenha_failed_login_attempts_log_cleanup_by_amount', [$limit_login_attempts, 'perform_failed_login_attempts_log_clean_up_by_amount'] );
984 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
985 add_filter(
986 'authenticate',
987 [$limit_login_attempts, 'maybe_allow_login'],
988 999,
989 3
990 );
991 // Very low priority so it is processed last
992 add_action(
993 'wp_login_errors',
994 [$limit_login_attempts, 'login_error_handler'],
995 999,
996 2
997 );
998 add_action( 'login_enqueue_scripts', [$limit_login_attempts, 'maybe_hide_login_form'] );
999 add_filter( 'login_message', [$limit_login_attempts, 'add_failed_login_message'] );
1000 add_action( 'wp_login_failed', [$limit_login_attempts, 'log_failed_login'], 5 );
1001 // Higher priority than one in Change Login URL
1002 add_action( 'wp_login', [$limit_login_attempts, 'clear_failed_login_log'] );
1003 }
1004 // Obfuscate Author Slugs
1005 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
1006 $obfuscate_author_slugs = new ASENHA\Classes\Obfuscate_Author_Slugs();
1007 add_action( 'pre_get_posts', [$obfuscate_author_slugs, 'alter_author_query'], 10 );
1008 add_filter(
1009 'author_link',
1010 [$obfuscate_author_slugs, 'alter_author_link'],
1011 10,
1012 3
1013 );
1014 add_filter(
1015 'rest_prepare_user',
1016 [$obfuscate_author_slugs, 'alter_json_users'],
1017 10,
1018 3
1019 );
1020 }
1021 // Email Address Obfuscator
1022 if ( array_key_exists( 'obfuscate_email_address', $options ) && $options['obfuscate_email_address'] ) {
1023 $email_address_obfuscator = new ASENHA\Classes\Email_Address_Obfuscator();
1024 add_shortcode( 'obfuscate', [$email_address_obfuscator, 'obfuscate_string'] );
1025 add_filter( 'safe_style_css', [$email_address_obfuscator, 'add_additional_attributes_to_safe_css'] );
1026 add_filter( 'widget_text', 'shortcode_unautop' );
1027 add_filter( 'widget_text', 'do_shortcode' );
1028 }
1029 // Disable XML-RPC
1030 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
1031 $disable_xml_rpc = new ASENHA\Classes\Disable_XML_RPC();
1032 add_filter( 'xmlrpc_enabled', '__return_false' );
1033 add_action( 'wp', [$disable_xml_rpc, 'remove_xmlrpc_link'], 11 );
1034 add_filter( 'xmlrpc_methods', [$disable_xml_rpc, 'remove_xmlrpc_methods'] );
1035 add_filter( 'wp_xmlrpc_server_class', [$disable_xml_rpc, 'maybe_disable_xmlrpc'] );
1036 // Hide xmlrpc.php in HTTP response headers
1037 add_filter( 'wp_headers', [$disable_xml_rpc, 'hide_xmlrpc_in_http_response_headers'] );
1038 add_filter( 'pings_open', '__return_false', PHP_INT_MAX );
1039 }
1040 // =================================================================
1041 // OPTIMIZATIONS
1042 // =================================================================
1043 // Image Upload Control
1044 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
1045 $image_upload_control = new ASENHA\Classes\Image_Upload_Control();
1046 // Fix image rotation. Ref: https://plugins.trac.wordpress.org/browser/fix-image-rotation/tags/2.2.2/includes/class-fix-image-rotation.php
1047 if ( extension_loaded( 'exif' ) && function_exists( 'exif_read_data' ) ) {
1048 add_filter(
1049 'wp_handle_upload_prefilter',
1050 [$image_upload_control, 'prefilter_maybe_fix_image_orientation'],
1051 10,
1052 1
1053 );
1054 add_filter(
1055 'wp_handle_upload',
1056 [$image_upload_control, 'maybe_fix_image_orientation'],
1057 1,
1058 3
1059 );
1060 }
1061 // Resize and convert happens here
1062 add_filter( 'wp_handle_upload', [$image_upload_control, 'image_upload_handler'] );
1063 if ( array_key_exists( 'disabled_image_sizes', $options ) && isset( $options['disabled_image_sizes'] ) ) {
1064 add_filter(
1065 'intermediate_image_sizes_advanced',
1066 [$image_upload_control, 'disable_intermediate_image_sizes__premium_only'],
1067 10,
1068 2
1069 );
1070 }
1071 }
1072 // Revisions Control
1073 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
1074 $revisions_control = new ASENHA\Classes\Revisions_Control();
1075 add_filter(
1076 'wp_revisions_to_keep',
1077 [$revisions_control, 'limit_revisions_to_max_number'],
1078 10,
1079 2
1080 );
1081 }
1082 // Heartbeat Control
1083 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
1084 $heartbeat_control = new ASENHA\Classes\Heartbeat_Control();
1085 add_filter(
1086 'heartbeat_settings',
1087 [$heartbeat_control, 'maybe_modify_heartbeat_frequency'],
1088 99,
1089 2
1090 );
1091 add_action( 'admin_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1092 add_action( 'wp_enqueue_scripts', [$heartbeat_control, 'maybe_disable_heartbeat'], 99 );
1093 }
1094 // SMTP Email Delivery
1095 $email_delivery = new ASENHA\Classes\Email_Delivery();
1096 ASENHA\Classes\Email_Delivery::set_runtime_instance( $email_delivery );
1097 add_action( 'admin_notices', [$email_delivery, 'maybe_show_smtp_password_admin_notice'] );
1098 add_action( 'admin_enqueue_scripts', [$email_delivery, 'enqueue_smtp_password_notice_script'] );
1099 add_action( 'wp_ajax_asenha_dismiss_smtp_password_notice', [$email_delivery, 'dismiss_smtp_password_admin_notice'] );
1100 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
1101 add_action( 'phpmailer_init', [$email_delivery, 'deliver_email_via_smtp'], 99999 );
1102 add_action( 'wp_ajax_send_test_email', [$email_delivery, 'send_test_email'] );
1103 }
1104 // Contact Form
1105 if ( array_key_exists( 'contact_form', $options ) && $options['contact_form'] ) {
1106 require_once ASENHA_PATH . 'includes/contact-form/contact-form.php';
1107 }
1108 // Multiple User Roles
1109 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
1110 $multiple_user_roles = new ASENHA\Classes\Multiple_User_Roles();
1111 // Show roles checkboxes
1112 add_action( 'show_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1113 // for when user edits their own profile
1114 add_action( 'edit_user_profile', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1115 // for when editing other user's profile
1116 add_action( 'user_new_form', [$multiple_user_roles, 'add_multiple_roles_ui'] );
1117 // new user creation
1118 // Save roles selections
1119 add_action( 'personal_options_update', [$multiple_user_roles, 'save_roles_assignment'] );
1120 // for when user edits their own profile
1121 add_action( 'edit_user_profile_update', [$multiple_user_roles, 'save_roles_assignment'] );
1122 // for when editing other user's profile
1123 add_action( 'user_register', [$multiple_user_roles, 'save_roles_assignment'] );
1124 // new user creation
1125 }
1126 // Image Sizes Panel
1127 if ( array_key_exists( 'image_sizes_panel', $options ) && $options['image_sizes_panel'] ) {
1128 $image_sizes_panel = new ASENHA\Classes\Image_Sizes_Panel();
1129 add_action( 'add_meta_boxes', array($image_sizes_panel, 'add_image_sizes_meta_box') );
1130 }
1131 // View Admin as Role
1132 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
1133 $view_admin_as_role = new ASENHA\Classes\View_Admin_As_Role();
1134 add_action( 'admin_bar_menu', [$view_admin_as_role, 'view_admin_as_admin_bar_menu'], 8 );
1135 // Priority 8 so it is next to username section
1136 add_action( 'init', [$view_admin_as_role, 'role_switcher_to_view_admin_as'] );
1137 add_action( 'profile_update', [$view_admin_as_role, 'maybe_prevent_switchback_to_administrator'], 20 );
1138 add_action(
1139 'set_user_role',
1140 [$view_admin_as_role, 'maybe_clear_view_admin_as_on_external_role_change'],
1141 20,
1142 3
1143 );
1144 // add_action( 'wp_die_handler', [ $view_admin_as_role, 'custom_error_page_on_switch_failure' ] );
1145 add_action( 'admin_footer', [$view_admin_as_role, 'add_floating_reset_button'] );
1146 add_action( 'admin_notices', [$view_admin_as_role, 'maybe_show_recovery_url_refreshed_notice'] );
1147 add_action( 'admin_enqueue_scripts', [$view_admin_as_role, 'enqueue_recovery_url_refreshed_notice_script'] );
1148 add_action( 'wp_ajax_asenha_dismiss_view_admin_as_recovery_notice', [$view_admin_as_role, 'dismiss_recovery_url_refreshed_notice'] );
1149 }
1150 // Password Protection
1151 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
1152 $password_protection = new ASENHA\Classes\Password_Protection();
1153 add_action( 'plugins_loaded', [$password_protection, 'show_password_protection_admin_bar_icon'] );
1154 add_action( 'init', [$password_protection, 'maybe_disable_page_caching'], 1 );
1155 add_action( 'template_redirect', [$password_protection, 'maybe_show_login_form'], 0 );
1156 // load early
1157 add_action( 'init', [$password_protection, 'maybe_process_login'], 1 );
1158 add_action( 'asenha_password_protection_error_messages', [$password_protection, 'add_login_error_messages'] );
1159 if ( function_exists( 'wp_site_icon' ) ) {
1160 // WP v4.3+
1161 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
1162 }
1163 }
1164 // Maintenance Mode
1165 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
1166 add_action( 'plugins_loaded', ['ASENHA\\Classes\\Maintenance_Mode', 'ensure_bypass_key_on_load'], 1 );
1167 $maintenance_mode = new ASENHA\Classes\Maintenance_Mode();
1168 add_action( 'send_headers', [$maintenance_mode, 'maintenance_mode_redirect'] );
1169 add_action( 'plugins_loaded', [$maintenance_mode, 'show_maintenance_mode_admin_bar_icon'] );
1170 }
1171 // Redirect 404 to Homepage
1172 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
1173 $redirect_fourofour = new ASENHA\Classes\Redirect_Fourofour();
1174 add_filter( 'template_redirect', [$redirect_fourofour, 'redirect_404'], PHP_INT_MAX );
1175 }
1176 // Display System Summary
1177 if ( array_key_exists( 'display_system_summary', $options ) && $options['display_system_summary'] ) {
1178 // require_once ASENHA_PATH . 'includes/premium/display-system-summary/ignore-directories.php';
1179 $display_system_summary = new ASENHA\Classes\Display_System_Summary();
1180 add_action( 'rightnow_end', [$display_system_summary, 'display_system_summary'] );
1181 }
1182 // Search Engines Visibility Status
1183 if ( array_key_exists( 'search_engine_visibility_status', $options ) && $options['search_engine_visibility_status'] ) {
1184 $search_engines_visibility = new ASENHA\Classes\Search_Engines_Visibility();
1185 add_action( 'admin_init', [$search_engines_visibility, 'maybe_display_search_engine_visibility_status'] );
1186 }
1187 }
1188
1189 }
1190
1191 Admin_Site_Enhancements::get_instance();