PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 3.7.0
Admin and Site Enhancements (ASE) v3.7.0
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 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
428 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 Revisions Control
123 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
124 add_filter( 'wp_revisions_to_keep', [ $content_management, 'limit_revisions_to_max_number' ], 10, 2 );
125 }
126
127 // Enable Auto-Publishing of Posts with Missed Schedules
128 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
129 add_action( 'wp_head', [ $content_management, 'publish_missed_schedule_posts' ] );
130 add_action( 'admin_head', [ $content_management, 'publish_missed_schedule_posts' ] );
131 }
132
133 // Enhance List Tables
134 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
135
136 // Show Featured Image Column
137 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
138 add_action( 'admin_init', [ $content_management, 'show_featured_image_column' ] );
139 }
140
141 // Show Excerpt Column
142 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
143 add_action( 'admin_init', [ $content_management, 'show_excerpt_column' ] );
144 }
145
146 // Show ID Column
147 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
148 add_action( 'admin_init', [ $content_management, 'show_id_column' ] );
149 }
150
151 // Hide Comments Column
152 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
153 add_action( 'admin_init', [ $content_management, 'hide_comments_column' ] );
154 }
155
156 // Hide Post Tags Column
157 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
158 add_action( 'admin_init', [ $content_management, 'hide_post_tags_column' ] );
159 }
160
161 // Show Custom Taxonomy Filters
162 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
163 add_action( 'restrict_manage_posts', [ $content_management, 'show_custom_taxonomy_filters' ] );
164 }
165
166 }
167
168 // =================================================================
169 // ADMIN INTERFACE
170 // =================================================================
171
172 // Instantiate object for Admin Interface features
173 $admin_interface = new ASENHA\Classes\Admin_Interface;
174
175 // Hide Admin Notices
176 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
177 add_action( 'all_admin_notices', [ $admin_interface, 'admin_notices_wrapper' ] );
178 add_action( 'admin_bar_menu', [ $admin_interface, 'admin_notices_menu' ] );
179 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'admin_notices_menu_inline_css' ] ); // wp-admin
180 }
181
182 // Hide Admin Bar
183 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'] ) ) {
184 add_filter( 'show_admin_bar', [ $admin_interface, 'hide_admin_bar_for_roles' ] );
185 }
186
187 // View Admin as Role
188 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
189 add_action( 'admin_bar_menu', [ $admin_interface, 'view_admin_as_admin_bar_menu' ], 8 ); // Priority 8 so it is next to username section
190 add_action( 'init', [ $admin_interface, 'role_switcher_to_view_admin_as' ] );
191 add_action( 'wp_die_handler', [ $admin_interface, 'custom_error_page_on_switch_failure' ] );
192 }
193
194 // Hide or Modify Elements
195 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
196 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
197 }
198
199 // Customize Admin Menu
200
201 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
202 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
203 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
204 if ( array_key_exists( 'custom_menu_order', $options ) ) {
205 add_filter( 'custom_menu_order', '__return_true' );
206 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
207 }
208 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
209 add_action( 'admin_menu', [ $admin_interface, 'apply_custom_menu_item_titles' ], 1000 );
210 }
211 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
212 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 1001 );
213 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ], 1002 );
214 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
215 }
216 }
217
218 // =================================================================
219 // LOG IN | LOG OUT
220 // =================================================================
221
222 // Instantiate object for Log In Log Out features
223 $login_logout = new ASENHA\Classes\Login_Logout;
224
225 // Change Login URL
226 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
227 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
228 add_action( 'init', [ $login_logout, 'redirect_on_custom_login_url' ] );
229 add_action( 'login_head', [ $login_logout, 'redirect_on_default_login_urls' ] );
230 add_action( 'wp_login_failed', [ $login_logout, 'redirect_to_custom_login_url_on_login_fail' ] );
231 add_action( 'wp_logout', [ $login_logout, 'redirect_to_custom_login_url_on_logout_success' ] );
232 }
233 }
234
235 // Enable Login Logout Menu
236
237 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
238 add_action( 'admin_head-nav-menus.php', [ $login_logout, 'add_login_logout_metabox' ] );
239 add_filter( 'wp_setup_nav_menu_item', [ $login_logout, 'set_login_logout_menu_item_dynamic_url' ] );
240 add_filter( 'wp_nav_menu_objects', [ $login_logout, 'maybe_remove_login_or_logout_menu_item' ] );
241 }
242
243 // Enable Last Login Column
244
245 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
246 add_action( 'wp_login', [ $login_logout, 'log_login_datetime' ] );
247 add_filter( 'manage_users_columns', [ $login_logout, 'add_last_login_column' ] );
248 add_filter( 'manage_users_custom_column', [ $login_logout, 'show_last_login_info' ], 10, 3 );
249 add_action( 'admin_print_styles-users.php', [ $login_logout, 'add_column_style' ] );
250 }
251
252 // Redirect After Login
253
254 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
255 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
256 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
257 add_filter( 'wp_login', [ $login_logout, 'redirect_for_roles_after_login' ], 5, 2 );
258 }
259 }
260 }
261
262 // Redirect After Logout
263
264 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
265 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
266 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
267 add_action( 'wp_logout', [ $login_logout, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
268 }
269 }
270 }
271
272 // =================================================================
273 // CUSTOM CODE
274 // =================================================================
275
276 // Instantiate object for Custom Code features
277 $custom_code = new ASENHA\Classes\Custom_Code;
278
279 // Enable Custom Admin / Frontend CSS
280
281 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
282 add_filter( 'admin_enqueue_scripts', [ $custom_code, 'custom_admin_css' ] );
283 }
284
285 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
286 add_filter( 'wp_enqueue_scripts', [ $custom_code, 'custom_frontend_css' ] );
287 }
288
289 // Manage ads.txt and app-ads.txt
290
291 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
292 add_action( 'init', [ $custom_code, 'show_ads_appads_txt_content' ] );
293 }
294
295 // Manage robots.txt
296
297 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
298 add_filter( 'robots_txt', [ $custom_code, 'maybe_show_custom_robots_txt_content' ], 10, 2 );
299 }
300
301 // Insert <head>, <body> and <footer> code
302
303 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
304
305 if ( isset( $options['head_code_priority'] ) ) {
306 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], $options['head_code_priority'] );
307 } else {
308 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], 10 );
309 }
310
311 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
312
313 if ( isset( $options['body_code_priority'] ) ) {
314 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], $options['body_code_priority'] );
315 } else {
316 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], 10 );
317 }
318 }
319
320 if ( isset( $options['footer_code_priority'] ) ) {
321 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], $options['footer_code_priority'] );
322 } else {
323 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], 10 );
324 }
325
326 }
327
328 // =================================================================
329 // DISABLE COMPONENTS
330 // =================================================================
331
332 // Instantiate object for Disable Components features
333 $disable_components = new ASENHA\Classes\Disable_Components;
334
335 // Disable Gutenberg
336 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
337 if ( array_key_exists( 'disable_gutenberg_for', $options ) && ! empty( $options['disable_gutenberg_for'] ) ) {
338 add_action( 'admin_init', [ $disable_components, 'disable_gutenberg_for_post_types_admin' ] );
339 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
340 add_action( 'wp_enqueue_scripts', [ $disable_components, 'disable_gutenberg_for_post_types_frontend' ], 100 );
341 }
342 }
343 }
344
345 // Disable Comments
346 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
347 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
348 add_action( 'do_meta_boxes', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init', 'admin_init', 'wp_loaded' hooks
349 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
350 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
351 }
352 }
353
354 // Disable REST API
355 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
356 if ( version_compare( get_bloginfo('version'), '4.7', '>=' ) ) {
357 add_filter( 'rest_authentication_errors', [ $disable_components, 'disable_rest_api' ] );
358 } else {
359 // REST API 1.x
360 add_filter( 'json_enabled', '__return_false' );
361 add_filter( 'json_jsonp_enabled', '__return_false' );
362 // REST API 2.x
363 add_filter( 'rest_enabled', '__return_false' );
364 add_filter( 'rest_jsonp_enabled', '__return_false' );
365 }
366 remove_action('wp_head', 'rest_output_link_wp_head', 10 ); // Disable REST API links in HTML <head>
367 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); // Disable REST API link in HTTP headers
368 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); // Remove REST API URL from the WP RSD endpoint.
369 }
370
371 // Disable Feeds
372 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
373 remove_action( 'wp_head', 'feed_links', 2 ); // Remove feed links in <head>
374 remove_action( 'wp_head', 'feed_links_extra', 3 ); // Remove feed links in <head>
375 remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
376 remove_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
377 remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
378 remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
379 }
380
381 // =================================================================
382 // SECURITY
383 // =================================================================
384
385 // Instantiate object for Security features
386 $security = new ASENHA\Classes\Security;
387
388 // Limit Login Attempts
389 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
390 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
391 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
392 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
393 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
394 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
395 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
396 }
397
398 // Obfuscate Author Slugs
399 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
400 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
401 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
402 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
403 }
404
405 // Disable XML-RPC
406 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
407 add_filter( 'xmlrpc_enabled', '__return_false' );
408 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
409 }
410
411 // =================================================================
412 // UTILITIES
413 // =================================================================
414
415 // Instantiate object for Utilities features
416 $utilities = new ASENHA\Classes\Utilities;
417
418 // Redirect 404 to Homepage
419
420 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
421 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
422 }
423
424 }
425
426 }
427
428 Admin_Site_Enhancements::get_instance();