PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 3.6.1
Admin and Site Enhancements (ASE) v3.6.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 3 years ago classes 3 years ago vendor 3 years ago LICENSE.md 3 years ago README.md 3 years ago admin-site-enhancements.php 3 years ago bootstrap.php 3 years ago settings.php 3 years ago
bootstrap.php
423 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 /**
9 * Main class of the plugin used to add functionalities
10 *
11 * @since 1.0.0
12 */
13 class Admin_Site_Enhancements {
14
15 // Refers to a single instance of this class
16 private static $instance = null;
17
18 /**
19 * Creates or returns a single instance of this class
20 *
21 * @return Admin_Site_Enhancements a single instance of this class
22 * @since 1.0.0
23 */
24 public static function get_instance() {
25
26 if ( null == self::$instance ) {
27
28 self::$instance = new self;
29
30 }
31
32 return self::$instance;
33
34 }
35
36 /**
37 * Initialize plugin functionalities
38 */
39 private function __construct() {
40
41 // Setup admin menu, admin page, settings, settings sections, sections fields, admin scripts, plugin action links, etc.
42
43 // Register admin menu and add the settings page.
44 add_action( 'admin_menu', 'asenha_register_admin_menu' );
45
46 // Register plugin settings
47
48 // Instantiate object for registration of settings section and fields
49 $settings = new ASENHA\Classes\Settings_Sections_Fields;
50
51 add_action( 'admin_init', [ $settings, 'register_sections_fields' ] );
52
53 // Suppress all notices on the plugin's main page. Then add notification for successful settings update.
54 add_action( 'admin_notices', 'asenha_suppress_notices', 5 );
55 add_action( 'all_admin_notices', 'asenha_suppress_generic_notices', 5 );
56
57 // Enqueue admin scripts and styles only on the plugin's main page
58 add_action( 'admin_enqueue_scripts', 'asenha_admin_scripts' );
59
60 // Add action links in plugins page
61 add_filter( 'plugin_action_links_' . ASENHA_SLUG . '/' . ASENHA_SLUG . '.php', 'asenha_plugin_action_links' );
62
63 // Update footer text
64 add_filter( 'admin_footer_text', 'asenha_footer_text' );
65
66 // ===== Activate features based on settings =====
67
68 // Get all WP Enhancements options, default to empty array in case it's not been created yet
69 $options = get_option( ASENHA_SLUG_U, array() );
70
71 // =================================================================
72 // CONTENT MANAGEMENT
73 // =================================================================
74
75 // Instantiate object for Content Management features
76 $content_management = new ASENHA\Classes\Content_Management;
77
78 // Enable Page and Post Duplication
79 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
80 add_action( 'admin_action_asenha_enable_duplication', [ $content_management, 'asenha_enable_duplication' ] );
81 add_filter( 'page_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
82 add_filter( 'post_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
83 }
84
85 // Enable Media Replacement
86 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
87 add_filter( 'media_row_actions', [ $content_management, 'modify_media_list_table_edit_link' ], 10, 2 );
88 add_filter( 'attachment_fields_to_edit', [ $content_management, 'add_media_replacement_button' ] );
89 add_action( 'edit_attachment', [ $content_management, 'replace_media' ] );
90 add_filter( 'post_updated_messages', [ $content_management, 'attachment_updated_custom_message' ] );
91 }
92
93 // Enable SVG Upload
94 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'] ) ) {
95
96 global $roles_svg_upload_enabled;
97
98 $enable_svg_upload = $options['enable_svg_upload'];
99 $for_roles = $options['enable_svg_upload_for'];
100
101 // User has role(s). Do further checks.
102 if ( isset( $for_roles ) && ( count( $for_roles ) > 0 ) ) {
103
104 // Assemble single-dimensional array of roles for which SVG upload would be enabled
105 $roles_svg_upload_enabled = array();
106 foreach( $for_roles as $role_slug => $svg_upload_enabled ) {
107 if ( $svg_upload_enabled ) {
108 $roles_svg_upload_enabled[] = $role_slug;
109 }
110 }
111
112 }
113
114 add_filter( 'upload_mimes', [ $content_management, 'add_svg_mime' ] );
115 add_filter( 'wp_check_filetype_and_ext', [ $content_management, 'confirm_file_type_is_svg' ], 10, 4 );
116 add_filter( 'wp_handle_upload_prefilter', [ $content_management, 'sanitize_and_maybe_allow_svg_upload' ] );
117 add_filter( 'wp_generate_attachment_metadata', [ $content_management, 'generate_svg_metadata' ], 10, 3 );
118 add_action( 'wp_ajax_svg_get_attachment_url', [ $content_management, 'get_svg_attachment_url' ] );
119 add_filter( 'wp_prepare_attachment_for_js', [ $content_management, 'get_svg_url_in_media_library' ] );
120 }
121
122 // Enable Auto-Publishing of Posts with Missed Schedules
123 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
124 add_action( 'wp_head', [ $content_management, 'publish_missed_schedule_posts' ] );
125 add_action( 'admin_head', [ $content_management, 'publish_missed_schedule_posts' ] );
126 }
127
128 // Enhance List Tables
129 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
130
131 // Show Featured Image Column
132 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
133 add_action( 'admin_init', [ $content_management, 'show_featured_image_column' ] );
134 }
135
136 // Show Excerpt Column
137 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
138 add_action( 'admin_init', [ $content_management, 'show_excerpt_column' ] );
139 }
140
141 // Show ID Column
142 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
143 add_action( 'admin_init', [ $content_management, 'show_id_column' ] );
144 }
145
146 // Hide Comments Column
147 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
148 add_action( 'admin_init', [ $content_management, 'hide_comments_column' ] );
149 }
150
151 // Hide Post Tags Column
152 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
153 add_action( 'admin_init', [ $content_management, 'hide_post_tags_column' ] );
154 }
155
156 // Show Custom Taxonomy Filters
157 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
158 add_action( 'restrict_manage_posts', [ $content_management, 'show_custom_taxonomy_filters' ] );
159 }
160
161 }
162
163 // =================================================================
164 // ADMIN INTERFACE
165 // =================================================================
166
167 // Instantiate object for Admin Interface features
168 $admin_interface = new ASENHA\Classes\Admin_Interface;
169
170 // Hide Admin Notices
171 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
172 add_action( 'all_admin_notices', [ $admin_interface, 'admin_notices_wrapper' ] );
173 add_action( 'admin_bar_menu', [ $admin_interface, 'admin_notices_menu' ] );
174 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'admin_notices_menu_inline_css' ] ); // wp-admin
175 }
176
177 // Hide Admin Bar
178 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'] ) ) {
179 add_filter( 'show_admin_bar', [ $admin_interface, 'hide_admin_bar_for_roles' ] );
180 }
181
182 // View Admin as Role
183 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
184 add_action( 'admin_bar_menu', [ $admin_interface, 'view_admin_as_admin_bar_menu' ], 8 ); // Priority 8 so it is next to username section
185 add_action( 'init', [ $admin_interface, 'role_switcher_to_view_admin_as' ] );
186 add_action( 'wp_die_handler', [ $admin_interface, 'custom_error_page_on_switch_failure' ] );
187 }
188
189 // Hide or Modify Elements
190 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
191 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
192 }
193
194 // Customize Admin Menu
195
196 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
197 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
198 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
199 if ( array_key_exists( 'custom_menu_order', $options ) ) {
200 add_filter( 'custom_menu_order', '__return_true' );
201 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
202 }
203 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
204 add_action( 'admin_menu', [ $admin_interface, 'apply_custom_menu_item_titles' ], 1000 );
205 }
206 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
207 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 1001 );
208 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ], 1002 );
209 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
210 }
211 }
212
213 // =================================================================
214 // LOG IN | LOG OUT
215 // =================================================================
216
217 // Instantiate object for Log In Log Out features
218 $login_logout = new ASENHA\Classes\Login_Logout;
219
220 // Change Login URL
221 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
222 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
223 add_action( 'init', [ $login_logout, 'redirect_on_custom_login_url' ] );
224 add_action( 'login_head', [ $login_logout, 'redirect_on_default_login_urls' ] );
225 add_action( 'wp_login_failed', [ $login_logout, 'redirect_to_custom_login_url_on_login_fail' ] );
226 add_action( 'wp_logout', [ $login_logout, 'redirect_to_custom_login_url_on_logout_success' ] );
227 }
228 }
229
230 // Enable Login Logout Menu
231
232 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
233 add_action( 'admin_head-nav-menus.php', [ $login_logout, 'add_login_logout_metabox' ] );
234 add_filter( 'wp_setup_nav_menu_item', [ $login_logout, 'set_login_logout_menu_item_dynamic_url' ] );
235 add_filter( 'wp_nav_menu_objects', [ $login_logout, 'maybe_remove_login_or_logout_menu_item' ] );
236 }
237
238 // Enable Last Login Column
239
240 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
241 add_action( 'wp_login', [ $login_logout, 'log_login_datetime' ] );
242 add_filter( 'manage_users_columns', [ $login_logout, 'add_last_login_column' ] );
243 add_filter( 'manage_users_custom_column', [ $login_logout, 'show_last_login_info' ], 10, 3 );
244 add_action( 'admin_print_styles-users.php', [ $login_logout, 'add_column_style' ] );
245 }
246
247 // Redirect After Login
248
249 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
250 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
251 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
252 add_filter( 'wp_login', [ $login_logout, 'redirect_for_roles_after_login' ], 5, 2 );
253 }
254 }
255 }
256
257 // Redirect After Logout
258
259 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
260 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
261 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
262 add_action( 'wp_logout', [ $login_logout, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
263 }
264 }
265 }
266
267 // =================================================================
268 // CUSTOM CODE
269 // =================================================================
270
271 // Instantiate object for Custom Code features
272 $custom_code = new ASENHA\Classes\Custom_Code;
273
274 // Enable Custom Admin / Frontend CSS
275
276 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
277 add_filter( 'admin_enqueue_scripts', [ $custom_code, 'custom_admin_css' ] );
278 }
279
280 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
281 add_filter( 'wp_enqueue_scripts', [ $custom_code, 'custom_frontend_css' ] );
282 }
283
284 // Manage ads.txt and app-ads.txt
285
286 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
287 add_action( 'init', [ $custom_code, 'show_ads_appads_txt_content' ] );
288 }
289
290 // Manage robots.txt
291
292 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
293 add_filter( 'robots_txt', [ $custom_code, 'maybe_show_custom_robots_txt_content' ], 10, 2 );
294 }
295
296 // Insert <head>, <body> and <footer> code
297
298 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
299
300 if ( isset( $options['head_code_priority'] ) ) {
301 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], $options['head_code_priority'] );
302 } else {
303 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], 10 );
304 }
305
306 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
307
308 if ( isset( $options['body_code_priority'] ) ) {
309 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], $options['body_code_priority'] );
310 } else {
311 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], 10 );
312 }
313 }
314
315 if ( isset( $options['footer_code_priority'] ) ) {
316 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], $options['footer_code_priority'] );
317 } else {
318 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], 10 );
319 }
320
321 }
322
323 // =================================================================
324 // DISABLE COMPONENTS
325 // =================================================================
326
327 // Instantiate object for Disable Components features
328 $disable_components = new ASENHA\Classes\Disable_Components;
329
330 // Disable Gutenberg
331 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
332 if ( array_key_exists( 'disable_gutenberg_for', $options ) && ! empty( $options['disable_gutenberg_for'] ) ) {
333 add_action( 'admin_init', [ $disable_components, 'disable_gutenberg_for_post_types_admin' ] );
334 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
335 add_action( 'wp_enqueue_scripts', [ $disable_components, 'disable_gutenberg_for_post_types_frontend' ], 100 );
336 }
337 }
338 }
339
340 // Disable Comments
341 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
342 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
343 add_action( 'do_meta_boxes', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init', 'admin_init', 'wp_loaded' hooks
344 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
345 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
346 }
347 }
348
349 // Disable REST API
350 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
351 if ( version_compare( get_bloginfo('version'), '4.7', '>=' ) ) {
352 add_filter( 'rest_authentication_errors', [ $disable_components, 'disable_rest_api' ] );
353 } else {
354 // REST API 1.x
355 add_filter( 'json_enabled', '__return_false' );
356 add_filter( 'json_jsonp_enabled', '__return_false' );
357 // REST API 2.x
358 add_filter( 'rest_enabled', '__return_false' );
359 add_filter( 'rest_jsonp_enabled', '__return_false' );
360 }
361 remove_action('wp_head', 'rest_output_link_wp_head', 10 ); // Disable REST API links in HTML <head>
362 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); // Disable REST API link in HTTP headers
363 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); // Remove REST API URL from the WP RSD endpoint.
364 }
365
366 // Disable Feeds
367 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
368 remove_action( 'wp_head', 'feed_links', 2 ); // Remove feed links in <head>
369 remove_action( 'wp_head', 'feed_links_extra', 3 ); // Remove feed links in <head>
370 remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
371 remove_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
372 remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
373 remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
374 }
375
376 // =================================================================
377 // SECURITY
378 // =================================================================
379
380 // Instantiate object for Security features
381 $security = new ASENHA\Classes\Security;
382
383 // Limit Login Attempts
384 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
385 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
386 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
387 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
388 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
389 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
390 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
391 }
392
393 // Obfuscate Author Slugs
394 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
395 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
396 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
397 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
398 }
399
400 // Disable XML-RPC
401 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
402 add_filter( 'xmlrpc_enabled', '__return_false' );
403 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
404 }
405
406 // =================================================================
407 // UTILITIES
408 // =================================================================
409
410 // Instantiate object for Utilities features
411 $utilities = new ASENHA\Classes\Utilities;
412
413 // Redirect 404 to Homepage
414
415 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
416 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
417 }
418
419 }
420
421 }
422
423 Admin_Site_Enhancements::get_instance();