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