PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.2.1
Admin and Site Enhancements (ASE) v4.2.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 includes 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
526 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 // Disable Dashboard Widgets
214 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
215 add_action( 'wp_dashboard_setup', [ $admin_interface, 'disable_dashboard_widgets' ], 99 );
216 }
217
218 // Hide or Modify Elements
219 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
220 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
221 }
222
223 // Customize Admin Menu
224
225 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
226 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
227 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
228 if ( array_key_exists( 'custom_menu_order', $options ) ) {
229 add_filter( 'custom_menu_order', '__return_true' );
230 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
231 }
232 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
233 add_action( 'admin_menu', [ $admin_interface, 'apply_custom_menu_item_titles' ], 1000 );
234 }
235 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
236 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 1001 );
237 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ], 1002 );
238 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
239 }
240 }
241
242 // =================================================================
243 // LOG IN | LOG OUT
244 // =================================================================
245
246 // Instantiate object for Log In Log Out features
247 $login_logout = new ASENHA\Classes\Login_Logout;
248
249 // Change Login URL
250 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
251 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
252 add_action( 'init', [ $login_logout, 'redirect_on_custom_login_url' ] );
253 add_action( 'login_head', [ $login_logout, 'redirect_on_default_login_urls' ] );
254 add_action( 'wp_login_failed', [ $login_logout, 'redirect_to_custom_login_url_on_login_fail' ] );
255 add_action( 'wp_logout', [ $login_logout, 'redirect_to_custom_login_url_on_logout_success' ] );
256 }
257 }
258
259 // Enable Login Logout Menu
260
261 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
262 add_action( 'admin_head-nav-menus.php', [ $login_logout, 'add_login_logout_metabox' ] );
263 add_filter( 'wp_setup_nav_menu_item', [ $login_logout, 'set_login_logout_menu_item_dynamic_url' ] );
264 add_filter( 'wp_nav_menu_objects', [ $login_logout, 'maybe_remove_login_or_logout_menu_item' ] );
265 }
266
267 // Enable Last Login Column
268
269 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
270 add_action( 'wp_login', [ $login_logout, 'log_login_datetime' ] );
271 add_filter( 'manage_users_columns', [ $login_logout, 'add_last_login_column' ] );
272 add_filter( 'manage_users_custom_column', [ $login_logout, 'show_last_login_info' ], 10, 3 );
273 add_action( 'admin_print_styles-users.php', [ $login_logout, 'add_column_style' ] );
274 }
275
276 // Redirect After Login
277
278 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
279 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
280 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
281 add_filter( 'wp_login', [ $login_logout, 'redirect_for_roles_after_login' ], 5, 2 );
282 }
283 }
284 }
285
286 // Redirect After Logout
287
288 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
289 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
290 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
291 add_action( 'wp_logout', [ $login_logout, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
292 }
293 }
294 }
295
296 // =================================================================
297 // CUSTOM CODE
298 // =================================================================
299
300 // Instantiate object for Custom Code features
301 $custom_code = new ASENHA\Classes\Custom_Code;
302
303 // Enable Custom Admin / Frontend CSS
304
305 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
306 add_filter( 'admin_enqueue_scripts', [ $custom_code, 'custom_admin_css' ] );
307 }
308
309 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
310 add_filter( 'wp_enqueue_scripts', [ $custom_code, 'custom_frontend_css' ] );
311 }
312
313 // Manage ads.txt and app-ads.txt
314
315 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
316 add_action( 'init', [ $custom_code, 'show_ads_appads_txt_content' ] );
317 }
318
319 // Manage robots.txt
320
321 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
322 add_filter( 'robots_txt', [ $custom_code, 'maybe_show_custom_robots_txt_content' ], 10, 2 );
323 }
324
325 // Insert <head>, <body> and <footer> code
326
327 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
328
329 if ( isset( $options['head_code_priority'] ) ) {
330 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], $options['head_code_priority'] );
331 } else {
332 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], 10 );
333 }
334
335 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
336
337 if ( isset( $options['body_code_priority'] ) ) {
338 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], $options['body_code_priority'] );
339 } else {
340 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], 10 );
341 }
342 }
343
344 if ( isset( $options['footer_code_priority'] ) ) {
345 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], $options['footer_code_priority'] );
346 } else {
347 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], 10 );
348 }
349
350 }
351
352 // =================================================================
353 // DISABLE COMPONENTS
354 // =================================================================
355
356 // Instantiate object for Disable Components features
357 $disable_components = new ASENHA\Classes\Disable_Components;
358
359 // Disable Gutenberg
360 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
361 if ( array_key_exists( 'disable_gutenberg_for', $options ) && ! empty( $options['disable_gutenberg_for'] ) ) {
362 add_action( 'admin_init', [ $disable_components, 'disable_gutenberg_for_post_types_admin' ] );
363 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
364 add_action( 'wp_enqueue_scripts', [ $disable_components, 'disable_gutenberg_for_post_types_frontend' ], 100 );
365 }
366 }
367 }
368
369 // Disable Comments
370 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
371 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
372 add_action( 'do_meta_boxes', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init', 'admin_init', 'wp_loaded' hooks
373 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
374 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
375 }
376 }
377
378 // Disable REST API
379 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
380 if ( version_compare( get_bloginfo('version'), '4.7', '>=' ) ) {
381 add_filter( 'rest_authentication_errors', [ $disable_components, 'disable_rest_api' ] );
382 } else {
383 // REST API 1.x
384 add_filter( 'json_enabled', '__return_false' );
385 add_filter( 'json_jsonp_enabled', '__return_false' );
386 // REST API 2.x
387 add_filter( 'rest_enabled', '__return_false' );
388 add_filter( 'rest_jsonp_enabled', '__return_false' );
389 }
390 remove_action('wp_head', 'rest_output_link_wp_head', 10 ); // Disable REST API links in HTML <head>
391 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); // Disable REST API link in HTTP headers
392 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); // Remove REST API URL from the WP RSD endpoint.
393 }
394
395 // Disable Feeds
396 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
397 remove_action( 'wp_head', 'feed_links', 2 ); // Remove feed links in <head>
398 remove_action( 'wp_head', 'feed_links_extra', 3 ); // Remove feed links in <head>
399 remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
400 remove_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
401 remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
402 remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
403 }
404
405 // Disable All Updates
406 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
407 add_action( 'admin_init', [ $disable_components, 'disable_update_notices_version_checks' ] );
408
409 // Disable core update
410 add_filter( 'pre_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
411 add_filter( 'pre_site_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
412
413 // Disable theme updates
414 add_filter( 'pre_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
415 add_filter( 'pre_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
416 add_action( 'pre_set_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ], 20 );
417
418 // Disable plugin updates
419 add_filter( 'pre_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
420 add_filter( 'pre_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
421 add_action( 'pre_set_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ], 20 );
422
423 // Disable auto updates
424 add_filter( 'automatic_updater_disabled', '__return_true' );
425 if ( ! defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
426 define( 'AUTOMATIC_UPDATER_DISABLED', true );
427 }
428 if ( ! defined( 'WP_AUTO_UPDATE_CORE') ) {
429 define( 'WP_AUTO_UPDATE_CORE', false );
430 }
431
432 add_filter( 'auto_update_core', '__return_false' );
433 add_filter( 'wp_auto_update_core', '__return_false' );
434 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
435 add_filter( 'allow_major_auto_core_updates', '__return_false' );
436 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
437
438 add_filter( 'auto_update_plugin', '__return_false' );
439 add_filter( 'auto_update_theme', '__return_false' );
440 add_filter( 'auto_update_translation', '__return_false' );
441
442 remove_action( 'init', 'wp_schedule_update_checks' );
443
444 // Disable update emails
445 add_filter( 'auto_core_update_send_email', '__return_false' );
446 add_filter( 'send_core_update_notification_email', '__return_false' );
447 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
448
449 // Remove Dashboard >> Updates menu
450 add_action( 'admin_menu', [ $disable_components, 'remove_updates_menu' ] );
451
452 }
453
454 // =================================================================
455 // SECURITY
456 // =================================================================
457
458 // Instantiate object for Security features
459 $security = new ASENHA\Classes\Security;
460
461 // Limit Login Attempts
462 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
463 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
464 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
465 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
466 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
467 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
468 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
469 }
470
471 // Obfuscate Author Slugs
472 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
473 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
474 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
475 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
476 }
477
478 // Disable XML-RPC
479 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
480 add_filter( 'xmlrpc_enabled', '__return_false' );
481 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
482 }
483
484 // =================================================================
485 // OPTIMIZATIONS
486 // =================================================================
487
488 // Instantiate object for Optimizations features
489 $optimizations = new ASENHA\Classes\Optimizations;
490
491 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
492 add_filter( 'heartbeat_settings', [ $optimizations, 'maybe_modify_heartbeat_frequency' ], 99, 2 );
493 add_action( 'admin_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
494 add_action( 'wp_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
495 }
496
497 // =================================================================
498 // UTILITIES
499 // =================================================================
500
501 // Instantiate object for Utilities features
502 $utilities = new ASENHA\Classes\Utilities;
503
504 // Enable Password Protection
505 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
506 add_action( 'plugins_loaded', [ $utilities, 'show_admin_bar_icon' ] );
507 add_action( 'init', [ $utilities, 'maybe_disable_page_caching' ], 1 );
508 add_action( 'template_redirect', [ $utilities, 'maybe_show_login_form' ], 0 ); // load early
509 add_action( 'init', [ $utilities, 'maybe_process_login' ], 1 );
510 add_action( 'asenha_password_protection_error_messages', [ $utilities, 'add_login_error_messages' ] );
511 if ( function_exists( 'wp_site_icon' ) ) { // WP v4.3+
512 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
513 }
514 }
515
516 // Redirect 404 to Homepage
517
518 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
519 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
520 }
521
522 }
523
524 }
525
526 Admin_Site_Enhancements::get_instance();