PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.7.2
Admin and Site Enhancements (ASE) v4.7.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 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
589 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' ], 10, 2 );
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 Auto-Publishing of Posts with Missed Schedules
142 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
143 add_action( 'wp_head', [ $content_management, 'publish_missed_schedule_posts' ] );
144 add_action( 'admin_head', [ $content_management, 'publish_missed_schedule_posts' ] );
145 }
146
147 // Enhance List Tables
148 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
149
150 // Show Featured Image Column
151 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
152 add_action( 'admin_init', [ $content_management, 'show_featured_image_column' ] );
153 }
154
155 // Show Excerpt Column
156 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
157 add_action( 'admin_init', [ $content_management, 'show_excerpt_column' ] );
158 }
159
160 // Show ID Column
161 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
162 add_action( 'admin_init', [ $content_management, 'show_id_column' ] );
163 }
164
165 // Hide Comments Column
166 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
167 add_action( 'admin_init', [ $content_management, 'hide_comments_column' ] );
168 }
169
170 // Hide Post Tags Column
171 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
172 add_action( 'admin_init', [ $content_management, 'hide_post_tags_column' ] );
173 }
174
175 // Show Custom Taxonomy Filters
176 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
177 add_action( 'restrict_manage_posts', [ $content_management, 'show_custom_taxonomy_filters' ] );
178 }
179
180 }
181
182 // =================================================================
183 // ADMIN INTERFACE
184 // =================================================================
185
186 // Instantiate object for Admin Interface features
187 $admin_interface = new ASENHA\Classes\Admin_Interface;
188
189 // Hide Admin Notices
190 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
191 add_action( 'all_admin_notices', [ $admin_interface, 'admin_notices_wrapper' ] );
192 add_action( 'admin_bar_menu', [ $admin_interface, 'admin_notices_menu' ] );
193 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'admin_notices_menu_inline_css' ] ); // wp-admin
194 }
195
196 // Hide Admin Bar
197 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'] ) ) {
198 add_filter( 'show_admin_bar', [ $admin_interface, 'hide_admin_bar_for_roles' ] );
199 }
200
201 // Disable Dashboard Widgets
202 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
203 add_action( 'wp_dashboard_setup', [ $admin_interface, 'disable_dashboard_widgets' ], 99 );
204 }
205
206 // Hide or Modify Elements
207 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
208 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
209
210 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
211 add_action( 'admin_head', [ $admin_interface, 'hide_help_drawer' ] );
212 }
213
214 }
215
216 // Customize Admin Menu
217
218 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
219 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
220 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
221 if ( array_key_exists( 'custom_menu_order', $options ) ) {
222 add_filter( 'custom_menu_order', '__return_true' );
223 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
224 }
225 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
226 add_action( 'admin_menu', [ $admin_interface, 'apply_custom_menu_item_titles' ], 1000 );
227 }
228 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
229 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 1001 );
230 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ], 1002 );
231 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
232 }
233 }
234
235 // =================================================================
236 // LOG IN | LOG OUT
237 // =================================================================
238
239 // Instantiate object for Log In Log Out features
240 $login_logout = new ASENHA\Classes\Login_Logout;
241
242 // Change Login URL
243 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
244 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
245 add_action( 'init', [ $login_logout, 'redirect_on_custom_login_url' ] );
246 add_action( 'login_head', [ $login_logout, 'redirect_on_default_login_urls' ] );
247 add_action( 'wp_login_failed', [ $login_logout, 'redirect_to_custom_login_url_on_login_fail' ] );
248 add_action( 'wp_logout', [ $login_logout, 'redirect_to_custom_login_url_on_logout_success' ] );
249 }
250 }
251
252 // Enable Login Logout Menu
253
254 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
255 add_action( 'admin_head-nav-menus.php', [ $login_logout, 'add_login_logout_metabox' ] );
256 add_filter( 'wp_setup_nav_menu_item', [ $login_logout, 'set_login_logout_menu_item_dynamic_url' ] );
257 add_filter( 'wp_nav_menu_objects', [ $login_logout, 'maybe_remove_login_or_logout_menu_item' ] );
258 }
259
260 // Enable Last Login Column
261
262 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
263 add_action( 'wp_login', [ $login_logout, 'log_login_datetime' ] );
264 add_filter( 'manage_users_columns', [ $login_logout, 'add_last_login_column' ] );
265 add_filter( 'manage_users_custom_column', [ $login_logout, 'show_last_login_info' ], 10, 3 );
266 add_action( 'admin_print_styles-users.php', [ $login_logout, 'add_column_style' ] );
267 }
268
269 // Redirect After Login
270
271 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
272 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
273 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
274 add_filter( 'wp_login', [ $login_logout, 'redirect_for_roles_after_login' ], 5, 2 );
275 }
276 }
277 }
278
279 // Redirect After Logout
280
281 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
282 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
283 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
284 add_action( 'wp_logout', [ $login_logout, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
285 }
286 }
287 }
288
289 // =================================================================
290 // CUSTOM CODE
291 // =================================================================
292
293 // Instantiate object for Custom Code features
294 $custom_code = new ASENHA\Classes\Custom_Code;
295
296 // Enable Custom Admin / Frontend CSS
297
298 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
299 add_filter( 'admin_enqueue_scripts', [ $custom_code, 'custom_admin_css' ] );
300 }
301
302 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
303 add_filter( 'wp_enqueue_scripts', [ $custom_code, 'custom_frontend_css' ] );
304 }
305
306 // Custom Body Class
307 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
308 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && ! empty( $options['enable_custom_body_class_for'] ) ) {
309 add_action( 'add_meta_boxes', [ $custom_code, 'add_custom_body_class_meta_box' ], 10, 2 );
310 add_action( 'save_post', [ $custom_code, 'save_custom_body_class' ], 99 );
311 add_filter( 'body_class', [ $custom_code, 'append_custom_body_class'], 99 );
312 }
313 }
314
315 // Manage ads.txt and app-ads.txt
316
317 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
318 add_action( 'init', [ $custom_code, 'show_ads_appads_txt_content' ] );
319 }
320
321 // Manage robots.txt
322
323 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
324 add_filter( 'robots_txt', [ $custom_code, 'maybe_show_custom_robots_txt_content' ], 10, 2 );
325 }
326
327 // Insert <head>, <body> and <footer> code
328
329 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
330
331 if ( isset( $options['head_code_priority'] ) ) {
332 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], $options['head_code_priority'] );
333 } else {
334 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], 10 );
335 }
336
337 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
338
339 if ( isset( $options['body_code_priority'] ) ) {
340 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], $options['body_code_priority'] );
341 } else {
342 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], 10 );
343 }
344 }
345
346 if ( isset( $options['footer_code_priority'] ) ) {
347 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], $options['footer_code_priority'] );
348 } else {
349 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], 10 );
350 }
351
352 }
353
354 // =================================================================
355 // DISABLE COMPONENTS
356 // =================================================================
357
358 // Instantiate object for Disable Components features
359 $disable_components = new ASENHA\Classes\Disable_Components;
360
361 // Disable Gutenberg
362 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
363 if ( array_key_exists( 'disable_gutenberg_for', $options ) && ! empty( $options['disable_gutenberg_for'] ) ) {
364 add_action( 'admin_init', [ $disable_components, 'disable_gutenberg_for_post_types_admin' ] );
365 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
366 add_action( 'wp_enqueue_scripts', [ $disable_components, 'disable_gutenberg_for_post_types_frontend' ], 100 );
367 }
368 }
369 }
370
371 // Disable Comments
372 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
373 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
374 add_action( 'do_meta_boxes', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init', 'admin_init', 'wp_loaded' hooks
375 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
376 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
377 }
378 }
379
380 // Disable REST API
381 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
382 if ( version_compare( get_bloginfo('version'), '4.7', '>=' ) ) {
383 add_filter( 'rest_authentication_errors', [ $disable_components, 'disable_rest_api' ] );
384 } else {
385 // REST API 1.x
386 add_filter( 'json_enabled', '__return_false' );
387 add_filter( 'json_jsonp_enabled', '__return_false' );
388 // REST API 2.x
389 add_filter( 'rest_enabled', '__return_false' );
390 add_filter( 'rest_jsonp_enabled', '__return_false' );
391 }
392 remove_action('wp_head', 'rest_output_link_wp_head', 10 ); // Disable REST API links in HTML <head>
393 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); // Disable REST API link in HTTP headers
394 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); // Remove REST API URL from the WP RSD endpoint.
395 }
396
397 // Disable Feeds
398 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
399 remove_action( 'wp_head', 'feed_links', 2 ); // Remove feed links in <head>
400 remove_action( 'wp_head', 'feed_links_extra', 3 ); // Remove feed links in <head>
401 remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
402 remove_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
403 remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
404 remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
405 }
406
407 // Disable All Updates
408 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
409 add_action( 'admin_init', [ $disable_components, 'disable_update_notices_version_checks' ] );
410
411 // Disable core update
412 add_filter( 'pre_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
413 add_filter( 'pre_site_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
414
415 // Disable theme updates
416 add_filter( 'pre_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
417 add_filter( 'pre_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
418 add_action( 'pre_set_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ], 20 );
419
420 // Disable plugin updates
421 add_filter( 'pre_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
422 add_filter( 'pre_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
423 add_action( 'pre_set_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ], 20 );
424
425 // Disable auto updates
426 add_filter( 'automatic_updater_disabled', '__return_true' );
427 if ( ! defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
428 define( 'AUTOMATIC_UPDATER_DISABLED', true );
429 }
430 if ( ! defined( 'WP_AUTO_UPDATE_CORE') ) {
431 define( 'WP_AUTO_UPDATE_CORE', false );
432 }
433
434 add_filter( 'auto_update_core', '__return_false' );
435 add_filter( 'wp_auto_update_core', '__return_false' );
436 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
437 add_filter( 'allow_major_auto_core_updates', '__return_false' );
438 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
439
440 add_filter( 'auto_update_plugin', '__return_false' );
441 add_filter( 'auto_update_theme', '__return_false' );
442 add_filter( 'auto_update_translation', '__return_false' );
443
444 remove_action( 'init', 'wp_schedule_update_checks' );
445
446 // Disable update emails
447 add_filter( 'auto_core_update_send_email', '__return_false' );
448 add_filter( 'send_core_update_notification_email', '__return_false' );
449 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
450
451 // Remove Dashboard >> Updates menu
452 add_action( 'admin_menu', [ $disable_components, 'remove_updates_menu' ] );
453
454 }
455
456 // Disable Smaller Components
457 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
458
459 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
460 remove_action( 'wp_head', 'wp_generator' );
461 add_filter( 'the_generator', '', 'html' );
462 add_filter( 'the_generator', '', 'xhtml' );
463 }
464
465 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
466 remove_action( 'wp_head', 'wlwmanifest_link' );
467 }
468
469 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
470 remove_action( 'wp_head', 'rsd_link' );
471 }
472
473 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
474 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
475 remove_action ( 'template_redirect', 'wp_shortlink_header', 100, 0 );
476 }
477
478 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
479 add_action( 'init', [ $disable_components, 'disable_dashicons_public_assets' ] );
480 }
481
482 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
483 add_action( 'init', [ $disable_components, 'disable_emoji_support' ] );
484 }
485
486 }
487
488 // =================================================================
489 // SECURITY
490 // =================================================================
491
492 // Instantiate object for Security features
493 $security = new ASENHA\Classes\Security;
494
495 // Limit Login Attempts
496 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
497 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
498 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
499 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
500 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
501 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
502 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
503 }
504
505 // Obfuscate Author Slugs
506 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
507 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
508 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
509 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
510 }
511
512 // Disable XML-RPC
513 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
514 add_filter( 'xmlrpc_enabled', '__return_false' );
515 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
516 }
517
518 // =================================================================
519 // OPTIMIZATIONS
520 // =================================================================
521
522 // Instantiate object for Optimizations features
523 $optimizations = new ASENHA\Classes\Optimizations;
524
525 // Image Upload Control
526 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
527 add_filter( 'wp_handle_upload', [ $optimizations, 'image_upload_handler' ] );
528 }
529
530 // Revisions Control
531 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
532 add_filter( 'wp_revisions_to_keep', [ $optimizations, 'limit_revisions_to_max_number' ], 10, 2 );
533 }
534
535 // Heartbeat Control
536 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
537 add_filter( 'heartbeat_settings', [ $optimizations, 'maybe_modify_heartbeat_frequency' ], 99, 2 );
538 add_action( 'admin_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
539 add_action( 'wp_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
540 }
541
542 // =================================================================
543 // UTILITIES
544 // =================================================================
545
546 // Instantiate object for Utilities features
547 $utilities = new ASENHA\Classes\Utilities;
548
549 // SMTP Email Delivery
550 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
551 add_action( 'phpmailer_init', [ $utilities, 'deliver_email_via_smtp' ] );
552 }
553
554 // View Admin as Role
555 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
556 add_action( 'admin_bar_menu', [ $utilities, 'view_admin_as_admin_bar_menu' ], 8 ); // Priority 8 so it is next to username section
557 add_action( 'init', [ $utilities, 'role_switcher_to_view_admin_as' ] );
558 add_action( 'wp_die_handler', [ $utilities, 'custom_error_page_on_switch_failure' ] );
559 }
560
561 // Password Protection
562 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
563 add_action( 'plugins_loaded', [ $utilities, 'show_password_protection_admin_bar_icon' ] );
564 add_action( 'init', [ $utilities, 'maybe_disable_page_caching' ], 1 );
565 add_action( 'template_redirect', [ $utilities, 'maybe_show_login_form' ], 0 ); // load early
566 add_action( 'init', [ $utilities, 'maybe_process_login' ], 1 );
567 add_action( 'asenha_password_protection_error_messages', [ $utilities, 'add_login_error_messages' ] );
568 if ( function_exists( 'wp_site_icon' ) ) { // WP v4.3+
569 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
570 }
571 }
572
573 // Maintenance Mode
574 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
575 add_action( 'send_headers', [ $utilities, 'maintenance_mode_redirect' ] );
576 add_action( 'plugins_loaded', [ $utilities, 'show_maintenance_mode_admin_bar_icon' ] );
577 }
578
579 // Redirect 404 to Homepage
580
581 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
582 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
583 }
584
585 }
586
587 }
588
589 Admin_Site_Enhancements::get_instance();