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