PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.9.2
Admin and Site Enhancements (ASE) v4.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 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
616 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
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 // Update footer version text
70 add_filter( 'update_footer', 'asenha_footer_version_text' );
71
72 // ===== Activate features based on settings =====
73
74 // Get all WP Enhancements options, default to empty array in case it's not been created yet
75 $options = get_option( ASENHA_SLUG_U, array() );
76
77 // =================================================================
78 // CONTENT MANAGEMENT
79 // =================================================================
80
81 // Instantiate object for Content Management features
82 $content_management = new ASENHA\Classes\Content_Management;
83
84 // Enable Page and Post Duplication
85 if ( array_key_exists( 'enable_duplication', $options ) && $options['enable_duplication'] ) {
86 add_action( 'admin_action_asenha_enable_duplication', [ $content_management, 'asenha_enable_duplication' ] );
87 add_filter( 'page_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
88 add_filter( 'post_row_actions', [ $content_management, 'add_duplication_action_link' ], 10, 2 );
89 }
90
91 // Enable Media Replacement
92 if ( array_key_exists( 'enable_media_replacement', $options ) && $options['enable_media_replacement'] ) {
93 add_filter( 'media_row_actions', [ $content_management, 'modify_media_list_table_edit_link' ], 10, 2 );
94 add_filter( 'attachment_fields_to_edit', [ $content_management, 'add_media_replacement_button' ], 10, 2 );
95 add_action( 'edit_attachment', [ $content_management, 'replace_media' ] );
96 add_filter( 'post_updated_messages', [ $content_management, 'attachment_updated_custom_message' ] );
97 }
98
99 // Enable SVG Upload
100 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'] ) ) {
101
102 global $roles_svg_upload_enabled;
103
104 $enable_svg_upload = $options['enable_svg_upload'];
105 $for_roles = $options['enable_svg_upload_for'];
106
107 // User has role(s). Do further checks.
108 if ( isset( $for_roles ) && ( count( $for_roles ) > 0 ) ) {
109
110 // Assemble single-dimensional array of roles for which SVG upload would be enabled
111 $roles_svg_upload_enabled = array();
112 foreach( $for_roles as $role_slug => $svg_upload_enabled ) {
113 if ( $svg_upload_enabled ) {
114 $roles_svg_upload_enabled[] = $role_slug;
115 }
116 }
117
118 }
119
120 add_filter( 'upload_mimes', [ $content_management, 'add_svg_mime' ] );
121 add_filter( 'wp_check_filetype_and_ext', [ $content_management, 'confirm_file_type_is_svg' ], 10, 4 );
122 add_filter( 'wp_handle_upload_prefilter', [ $content_management, 'sanitize_and_maybe_allow_svg_upload' ] );
123 add_filter( 'wp_generate_attachment_metadata', [ $content_management, 'generate_svg_metadata' ], 10, 3 );
124 add_action( 'wp_ajax_svg_get_attachment_url', [ $content_management, 'get_svg_attachment_url' ] );
125 add_filter( 'wp_prepare_attachment_for_js', [ $content_management, 'get_svg_url_in_media_library' ] );
126 }
127
128 // Enable External Permalinks
129 if ( array_key_exists( 'enable_external_permalinks', $options ) && $options['enable_external_permalinks'] ) {
130 if ( array_key_exists( 'enable_external_permalinks_for', $options ) && ! empty( $options['enable_external_permalinks_for'] ) ) {
131 add_action( 'add_meta_boxes', [ $content_management, 'add_external_permalink_meta_box' ], 10, 2 );
132 add_action( 'save_post', [ $content_management, 'save_external_permalink' ] );
133
134 // Filter the permalink for use by get_permalink()
135 add_filter( 'page_link', [ $content_management, 'use_external_permalink_for_pages' ], 20, 2 );
136 add_filter( 'post_link', [ $content_management, 'use_external_permalink_for_posts' ], 20, 2 );
137 add_filter( 'post_type_link', [ $content_management, 'use_external_permalink_for_posts' ], 20, 2 );
138
139 // Enable redirection to external permalink when page/post is opened directly via it's WP permalink
140 add_action( 'wp', [ $content_management, 'redirect_to_external_permalink' ] );
141 }
142 }
143
144 // Open All External Links in New Tab
145 if ( array_key_exists( 'external_links_new_tab', $options ) && $options['external_links_new_tab'] ) {
146 add_filter( 'the_content', [ $content_management,'add_target_and_rel_atts_to_content_links'] );
147 }
148
149 // Enable Auto-Publishing of Posts with Missed Schedules
150 if ( array_key_exists( 'enable_missed_schedule_posts_auto_publish', $options ) && $options['enable_missed_schedule_posts_auto_publish'] ) {
151 add_action( 'wp_head', [ $content_management, 'publish_missed_schedule_posts' ] );
152 add_action( 'admin_head', [ $content_management, 'publish_missed_schedule_posts' ] );
153 }
154
155 // Enhance List Tables
156 if ( array_key_exists( 'enhance_list_tables', $options ) && $options['enhance_list_tables'] ) {
157
158 // Show Featured Image Column
159 if ( array_key_exists( 'show_featured_image_column', $options ) && $options['show_featured_image_column'] ) {
160 add_action( 'admin_init', [ $content_management, 'show_featured_image_column' ] );
161 }
162
163 // Show Excerpt Column
164 if ( array_key_exists( 'show_excerpt_column', $options ) && $options['show_excerpt_column'] ) {
165 add_action( 'admin_init', [ $content_management, 'show_excerpt_column' ] );
166 }
167
168 // Show ID Column
169 if ( array_key_exists( 'show_id_column', $options ) && $options['show_id_column'] ) {
170 add_action( 'admin_init', [ $content_management, 'show_id_column' ] );
171 }
172
173 // Show ID in Action Row
174 if ( array_key_exists( 'show_id_in_action_row', $options ) && $options['show_id_in_action_row'] ) {
175 add_action( 'admin_init', [ $content_management, 'show_id_in_action_row' ] );
176 }
177
178 // Show Custom Taxonomy Filters
179 if ( array_key_exists( 'show_custom_taxonomy_filters', $options ) && $options['show_custom_taxonomy_filters'] ) {
180 add_action( 'restrict_manage_posts', [ $content_management, 'show_custom_taxonomy_filters' ] );
181 }
182
183 // Hide Comments Column
184 if ( array_key_exists( 'hide_comments_column', $options ) && $options['hide_comments_column'] ) {
185 add_action( 'admin_init', [ $content_management, 'hide_comments_column' ] );
186 }
187
188 // Hide Post Tags Column
189 if ( array_key_exists( 'hide_post_tags_column', $options ) && $options['hide_post_tags_column'] ) {
190 add_action( 'admin_init', [ $content_management, 'hide_post_tags_column' ] );
191 }
192
193 }
194
195 // =================================================================
196 // ADMIN INTERFACE
197 // =================================================================
198
199 // Instantiate object for Admin Interface features
200 $admin_interface = new ASENHA\Classes\Admin_Interface;
201
202 // Hide Admin Notices
203 if ( array_key_exists( 'hide_admin_notices', $options ) && $options['hide_admin_notices'] ) {
204 add_action( 'admin_notices', [ $admin_interface, 'admin_notices_wrapper' ], 9 );
205 // add_action( 'all_admin_notices', [ $admin_interface, 'admin_notices_wrapper' ] );
206 add_action( 'admin_bar_menu', [ $admin_interface, 'admin_notices_menu' ] );
207 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'admin_notices_menu_inline_css' ] ); // wp-admin
208 }
209
210 // Hide Admin Bar
211 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'] ) ) {
212 add_filter( 'show_admin_bar', [ $admin_interface, 'hide_admin_bar_for_roles' ] );
213 }
214
215 // Disable Dashboard Widgets
216 if ( array_key_exists( 'disable_dashboard_widgets', $options ) && $options['disable_dashboard_widgets'] ) {
217 add_action( 'wp_dashboard_setup', [ $admin_interface, 'disable_dashboard_widgets' ], 99 );
218 }
219
220 // Hide or Modify Elements
221 if ( array_key_exists( 'hide_modify_elements', $options ) && $options['hide_modify_elements'] ) {
222 add_filter( 'admin_bar_menu', [ $admin_interface, 'modify_admin_bar_menu' ], 5 ); // priority 5 to execute earlier than the normal 10
223
224 if ( array_key_exists( 'hide_help_drawer', $options ) && $options['hide_help_drawer'] ) {
225 add_action( 'admin_head', [ $admin_interface, 'hide_help_drawer' ] );
226 }
227
228 }
229
230 // Customize Admin Menu
231
232 if ( array_key_exists( 'customize_admin_menu', $options ) && $options['customize_admin_menu'] ) {
233 // add_action( 'wp_ajax_save_custom_menu_order', [ $admin_interface, 'save_custom_menu_order' ] );
234 // add_action( 'wp_ajax_save_hidden_menu_items', [ $admin_interface, 'save_hidden_menu_items' ] );
235 if ( array_key_exists( 'custom_menu_order', $options ) ) {
236 add_filter( 'custom_menu_order', '__return_true' );
237 add_filter( 'menu_order', [ $admin_interface, 'render_custom_menu_order' ] );
238 }
239 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
240 add_action( 'admin_menu', [ $admin_interface, 'apply_custom_menu_item_titles' ], 1000 );
241 }
242 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
243 add_action( 'admin_menu', [ $admin_interface, 'hide_menu_items' ], 1001 );
244 add_action( 'admin_menu', [ $admin_interface, 'add_hidden_menu_toggle' ], 1002 );
245 add_action( 'admin_enqueue_scripts', [ $admin_interface, 'enqueue_toggle_hidden_menu_script' ] );
246 }
247 }
248
249 // =================================================================
250 // LOG IN | LOG OUT
251 // =================================================================
252
253 // Instantiate object for Log In Log Out features
254 $login_logout = new ASENHA\Classes\Login_Logout;
255
256 // Change Login URL
257 if ( array_key_exists( 'change_login_url', $options ) && $options['change_login_url'] ) {
258 if ( array_key_exists( 'custom_login_slug', $options ) && ! empty( $options['custom_login_slug'] ) ) {
259 add_action( 'init', [ $login_logout, 'redirect_on_custom_login_url' ] );
260 add_action( 'login_head', [ $login_logout, 'redirect_on_default_login_urls' ] );
261 add_action( 'wp_login_failed', [ $login_logout, 'redirect_to_custom_login_url_on_login_fail' ] );
262 add_action( 'wp_logout', [ $login_logout, 'redirect_to_custom_login_url_on_logout_success' ] );
263 }
264 }
265
266 // Enable Login Logout Menu
267
268 if ( array_key_exists( 'enable_login_logout_menu', $options ) && $options['enable_login_logout_menu'] ) {
269 add_action( 'admin_head-nav-menus.php', [ $login_logout, 'add_login_logout_metabox' ] );
270 add_filter( 'wp_setup_nav_menu_item', [ $login_logout, 'set_login_logout_menu_item_dynamic_url' ] );
271 add_filter( 'wp_nav_menu_objects', [ $login_logout, 'maybe_remove_login_or_logout_menu_item' ] );
272 }
273
274 // Enable Last Login Column
275
276 if ( array_key_exists( 'enable_last_login_column', $options ) && $options['enable_last_login_column'] ) {
277 add_action( 'wp_login', [ $login_logout, 'log_login_datetime' ] );
278 add_filter( 'manage_users_columns', [ $login_logout, 'add_last_login_column' ] );
279 add_filter( 'manage_users_custom_column', [ $login_logout, 'show_last_login_info' ], 10, 3 );
280 add_action( 'admin_print_styles-users.php', [ $login_logout, 'add_column_style' ] );
281 }
282
283 // Redirect After Login
284
285 if ( array_key_exists( 'redirect_after_login', $options ) && $options['redirect_after_login'] ) {
286 if ( array_key_exists( 'redirect_after_login_to_slug', $options ) && ! empty( $options['redirect_after_login_to_slug'] ) ) {
287 if ( array_key_exists( 'redirect_after_login_for', $options ) && ! empty( $options['redirect_after_login_for'] ) ) {
288 add_filter( 'wp_login', [ $login_logout, 'redirect_for_roles_after_login' ], 5, 2 );
289 }
290 }
291 }
292
293 // Redirect After Logout
294
295 if ( array_key_exists( 'redirect_after_logout', $options ) && $options['redirect_after_logout'] ) {
296 if ( array_key_exists( 'redirect_after_logout_to_slug', $options ) && ! empty( $options['redirect_after_logout_to_slug'] ) ) {
297 if ( array_key_exists( 'redirect_after_logout_for', $options ) && ! empty( $options['redirect_after_logout_for'] ) ) {
298 add_action( 'wp_logout', [ $login_logout, 'redirect_after_logout' ], 5, 1 ); // load earlier than Change Login URL add_action
299 }
300 }
301 }
302
303 // =================================================================
304 // CUSTOM CODE
305 // =================================================================
306
307 // Instantiate object for Custom Code features
308 $custom_code = new ASENHA\Classes\Custom_Code;
309
310 // Enable Custom Admin / Frontend CSS
311
312 if ( array_key_exists( 'enable_custom_admin_css', $options ) && $options['enable_custom_admin_css'] ) {
313 add_filter( 'admin_enqueue_scripts', [ $custom_code, 'custom_admin_css' ] );
314 }
315
316 if ( array_key_exists( 'enable_custom_frontend_css', $options ) && $options['enable_custom_frontend_css'] ) {
317 add_filter( 'wp_enqueue_scripts', [ $custom_code, 'custom_frontend_css' ] );
318 }
319
320 // Custom Body Class
321 if ( array_key_exists( 'enable_custom_body_class', $options ) && $options['enable_custom_body_class'] ) {
322 if ( array_key_exists( 'enable_custom_body_class_for', $options ) && ! empty( $options['enable_custom_body_class_for'] ) ) {
323 add_action( 'add_meta_boxes', [ $custom_code, 'add_custom_body_class_meta_box' ], 10, 2 );
324 add_action( 'save_post', [ $custom_code, 'save_custom_body_class' ], 99 );
325 add_filter( 'body_class', [ $custom_code, 'append_custom_body_class'], 99 );
326 }
327 }
328
329 // Manage ads.txt and app-ads.txt
330
331 if ( array_key_exists( 'manage_ads_appads_txt', $options ) && $options['manage_ads_appads_txt'] ) {
332 add_action( 'init', [ $custom_code, 'show_ads_appads_txt_content' ] );
333 }
334
335 // Manage robots.txt
336
337 if ( array_key_exists( 'manage_robots_txt', $options ) && $options['manage_robots_txt'] ) {
338 add_filter( 'robots_txt', [ $custom_code, 'maybe_show_custom_robots_txt_content' ], 10, 2 );
339 }
340
341 // Insert <head>, <body> and <footer> code
342
343 if ( array_key_exists( 'insert_head_body_footer_code', $options ) && $options['insert_head_body_footer_code'] ) {
344
345 if ( isset( $options['head_code_priority'] ) ) {
346 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], $options['head_code_priority'] );
347 } else {
348 add_action( 'wp_head', [ $custom_code, 'insert_head_code' ], 10 );
349 }
350
351 if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
352
353 if ( isset( $options['body_code_priority'] ) ) {
354 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], $options['body_code_priority'] );
355 } else {
356 add_action( 'wp_body_open', [ $custom_code, 'insert_body_code' ], 10 );
357 }
358 }
359
360 if ( isset( $options['footer_code_priority'] ) ) {
361 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], $options['footer_code_priority'] );
362 } else {
363 add_action( 'wp_footer', [ $custom_code, 'insert_footer_code' ], 10 );
364 }
365
366 }
367
368 // =================================================================
369 // DISABLE COMPONENTS
370 // =================================================================
371
372 // Instantiate object for Disable Components features
373 $disable_components = new ASENHA\Classes\Disable_Components;
374
375 // Disable Gutenberg
376 if ( array_key_exists( 'disable_gutenberg', $options ) && $options['disable_gutenberg'] ) {
377 if ( array_key_exists( 'disable_gutenberg_for', $options ) && ! empty( $options['disable_gutenberg_for'] ) ) {
378 add_action( 'admin_init', [ $disable_components, 'disable_gutenberg_for_post_types_admin' ] );
379 if ( array_key_exists( 'disable_gutenberg_frontend_styles', $options ) && $options['disable_gutenberg_frontend_styles'] ) {
380 add_action( 'wp_enqueue_scripts', [ $disable_components, 'disable_gutenberg_for_post_types_frontend' ], 100 );
381 }
382 }
383 }
384
385 // Disable Comments
386 if ( array_key_exists( 'disable_comments', $options ) && $options['disable_comments'] ) {
387 if ( array_key_exists( 'disable_comments_for', $options ) && ! empty( $options['disable_comments_for'] ) ) {
388 add_action( 'do_meta_boxes', [ $disable_components, 'disable_comments_for_post_types_edit' ] ); // also work with 'init', 'admin_init', 'wp_loaded' hooks
389 add_action( 'template_redirect', [ $disable_components, 'show_blank_comment_template' ] );
390 add_filter( 'comments_array', [ $disable_components, 'hide_existing_comments_on_frontend' ], 10, 2 ); // hide comments
391 add_filter( 'comments_open', [ $disable_components, 'close_commenting_on_frontend' ] ); // close commenting
392 }
393 }
394
395 // Disable REST API
396 if ( array_key_exists( 'disable_rest_api', $options ) && $options['disable_rest_api'] ) {
397 if ( version_compare( get_bloginfo('version'), '4.7', '>=' ) ) {
398 add_filter( 'rest_authentication_errors', [ $disable_components, 'disable_rest_api' ] );
399 } else {
400 // REST API 1.x
401 add_filter( 'json_enabled', '__return_false' );
402 add_filter( 'json_jsonp_enabled', '__return_false' );
403 // REST API 2.x
404 add_filter( 'rest_enabled', '__return_false' );
405 add_filter( 'rest_jsonp_enabled', '__return_false' );
406 }
407 remove_action('wp_head', 'rest_output_link_wp_head', 10 ); // Disable REST API links in HTML <head>
408 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); // Disable REST API link in HTTP headers
409 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); // Remove REST API URL from the WP RSD endpoint.
410 }
411
412 // Disable Feeds
413 if ( array_key_exists( 'disable_feeds', $options ) && $options['disable_feeds'] ) {
414 remove_action( 'wp_head', 'feed_links', 2 ); // Remove feed links in <head>
415 remove_action( 'wp_head', 'feed_links_extra', 3 ); // Remove feed links in <head>
416 remove_action( 'do_feed_rdf', 'do_feed_rdf', 10, 0 );
417 remove_action( 'do_feed_rss', 'do_feed_rss', 10, 0 );
418 remove_action( 'do_feed_rss2', 'do_feed_rss2', 10, 1 );
419 remove_action( 'do_feed_atom', 'do_feed_atom', 10, 1 );
420 }
421
422 // Disable All Updates
423 if ( array_key_exists( 'disable_all_updates', $options ) && $options['disable_all_updates'] ) {
424 add_action( 'admin_init', [ $disable_components, 'disable_update_notices_version_checks' ] );
425
426 // Disable core update
427 add_filter( 'pre_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
428 add_filter( 'pre_site_transient_update_core', [ $disable_components, 'override_version_check_info' ] );
429
430 // Disable theme updates
431 add_filter( 'pre_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
432 add_filter( 'pre_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ] );
433 add_action( 'pre_set_site_transient_update_themes', [ $disable_components, 'override_version_check_info' ], 20 );
434
435 // Disable plugin updates
436 add_filter( 'pre_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
437 add_filter( 'pre_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ] );
438 add_action( 'pre_set_site_transient_update_plugins', [ $disable_components, 'override_version_check_info' ], 20 );
439
440 // Disable auto updates
441 add_filter( 'automatic_updater_disabled', '__return_true' );
442 if ( ! defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
443 define( 'AUTOMATIC_UPDATER_DISABLED', true );
444 }
445 if ( ! defined( 'WP_AUTO_UPDATE_CORE') ) {
446 define( 'WP_AUTO_UPDATE_CORE', false );
447 }
448
449 add_filter( 'auto_update_core', '__return_false' );
450 add_filter( 'wp_auto_update_core', '__return_false' );
451 add_filter( 'allow_minor_auto_core_updates', '__return_false' );
452 add_filter( 'allow_major_auto_core_updates', '__return_false' );
453 add_filter( 'allow_dev_auto_core_updates', '__return_false' );
454
455 add_filter( 'auto_update_plugin', '__return_false' );
456 add_filter( 'auto_update_theme', '__return_false' );
457 add_filter( 'auto_update_translation', '__return_false' );
458
459 remove_action( 'init', 'wp_schedule_update_checks' );
460
461 // Disable update emails
462 add_filter( 'auto_core_update_send_email', '__return_false' );
463 add_filter( 'send_core_update_notification_email', '__return_false' );
464 add_filter( 'automatic_updates_send_debug_email', '__return_false' );
465
466 // Remove Dashboard >> Updates menu
467 add_action( 'admin_menu', [ $disable_components, 'remove_updates_menu' ] );
468
469 }
470
471 // Disable Smaller Components
472 if ( array_key_exists( 'disable_smaller_components', $options ) && $options['disable_smaller_components'] ) {
473
474 if ( array_key_exists( 'disable_head_generator_tag', $options ) && $options['disable_head_generator_tag'] ) {
475 remove_action( 'wp_head', 'wp_generator' );
476 add_filter( 'the_generator', '', 'html' );
477 add_filter( 'the_generator', '', 'xhtml' );
478 }
479
480 if ( array_key_exists( 'disable_head_wlwmanifest_tag', $options ) && $options['disable_head_wlwmanifest_tag'] ) {
481 remove_action( 'wp_head', 'wlwmanifest_link' );
482 }
483
484 if ( array_key_exists( 'disable_head_rsd_tag', $options ) && $options['disable_head_rsd_tag'] ) {
485 remove_action( 'wp_head', 'rsd_link' );
486 }
487
488 if ( array_key_exists( 'disable_head_shortlink_tag', $options ) && $options['disable_head_shortlink_tag'] ) {
489 remove_action( 'wp_head', 'wp_shortlink_wp_head' );
490 remove_action ( 'template_redirect', 'wp_shortlink_header', 100, 0 );
491 }
492
493 if ( array_key_exists( 'disable_frontend_dashicons', $options ) && $options['disable_frontend_dashicons'] ) {
494 add_action( 'init', [ $disable_components, 'disable_dashicons_public_assets' ] );
495 }
496
497 if ( array_key_exists( 'disable_emoji_support', $options ) && $options['disable_emoji_support'] ) {
498 add_action( 'init', [ $disable_components, 'disable_emoji_support' ] );
499 }
500
501 }
502
503 // =================================================================
504 // SECURITY
505 // =================================================================
506
507 // Instantiate object for Security features
508 $security = new ASENHA\Classes\Security;
509
510 // Limit Login Attempts
511 if ( array_key_exists( 'limit_login_attempts', $options ) && $options['limit_login_attempts'] ) {
512 add_filter( 'authenticate', [ $security, 'maybe_allow_login' ], 999, 3 ); // Very low priority so it is processed last
513 add_action( 'login_enqueue_scripts', [ $security, 'maybe_hide_login_form' ] );
514 add_action( 'wp_login_failed', [ $security, 'log_failed_login' ], 5 ); // Higher priority than one in Change Login URL
515 add_action( 'wp_login_errors', [ $security, 'login_error_handler' ], 999, 2 );
516 add_filter( 'login_message', [ $security, 'add_failed_login_message' ] );
517 add_action( 'wp_login', [ $security, 'clear_failed_login_log' ] );
518 }
519
520 // Obfuscate Author Slugs
521 if ( array_key_exists( 'obfuscate_author_slugs', $options ) && $options['obfuscate_author_slugs'] ) {
522 add_action( 'pre_get_posts', [ $security, 'alter_author_query' ], 10 );
523 add_filter( 'author_link', [ $security, 'alter_author_link' ], 10, 3 );
524 add_filter( 'rest_prepare_user', [ $security, 'alter_json_users' ], 10, 3 );
525 }
526
527 // Disable XML-RPC
528 if ( array_key_exists( 'disable_xmlrpc', $options ) && $options['disable_xmlrpc'] ) {
529 add_filter( 'xmlrpc_enabled', '__return_false' );
530 add_filter( 'wp_xmlrpc_server_class', [ $security, 'maybe_disable_xmlrpc' ] );
531 }
532
533 // =================================================================
534 // OPTIMIZATIONS
535 // =================================================================
536
537 // Instantiate object for Optimizations features
538 $optimizations = new ASENHA\Classes\Optimizations;
539
540 // Image Upload Control
541 if ( array_key_exists( 'image_upload_control', $options ) && $options['image_upload_control'] ) {
542 add_filter( 'wp_handle_upload', [ $optimizations, 'image_upload_handler' ] );
543 }
544
545 // Revisions Control
546 if ( array_key_exists( 'enable_revisions_control', $options ) && $options['enable_revisions_control'] ) {
547 add_filter( 'wp_revisions_to_keep', [ $optimizations, 'limit_revisions_to_max_number' ], 10, 2 );
548 }
549
550 // Heartbeat Control
551 if ( array_key_exists( 'enable_heartbeat_control', $options ) && $options['enable_heartbeat_control'] ) {
552 add_filter( 'heartbeat_settings', [ $optimizations, 'maybe_modify_heartbeat_frequency' ], 99, 2 );
553 add_action( 'admin_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
554 add_action( 'wp_enqueue_scripts', [ $optimizations, 'maybe_disable_heartbeat' ], 99 );
555 }
556
557 // =================================================================
558 // UTILITIES
559 // =================================================================
560
561 // Instantiate object for Utilities features
562 $utilities = new ASENHA\Classes\Utilities;
563
564 // SMTP Email Delivery
565 if ( array_key_exists( 'smtp_email_delivery', $options ) && $options['smtp_email_delivery'] ) {
566 add_action( 'phpmailer_init', [ $utilities, 'deliver_email_via_smtp' ] );
567 }
568
569 // Multiple User Roles
570 if ( array_key_exists( 'multiple_user_roles', $options ) && $options['multiple_user_roles'] ) {
571 // Show roles checkboxes
572 add_action( 'show_user_profile', [ $utilities, 'add_multiple_roles_ui' ] ); // for when user edits their own profile
573 add_action( 'edit_user_profile', [ $utilities, 'add_multiple_roles_ui' ] ); // for when editing other user's profile
574 add_action( 'user_new_form', [ $utilities, 'add_multiple_roles_ui' ] ); // new user creation
575 // Save roles selections
576 add_action( 'personal_options_update', [ $utilities, 'save_roles_assignment' ] ); // for when user edits their own profile
577 add_action( 'edit_user_profile_update', [ $utilities, 'save_roles_assignment' ] ); // for when editing other user's profile
578 add_action( 'user_register', [ $utilities, 'save_roles_assignment' ] ); // new user creation
579 }
580
581 // View Admin as Role
582 if ( array_key_exists( 'view_admin_as_role', $options ) && $options['view_admin_as_role'] ) {
583 add_action( 'admin_bar_menu', [ $utilities, 'view_admin_as_admin_bar_menu' ], 8 ); // Priority 8 so it is next to username section
584 add_action( 'init', [ $utilities, 'role_switcher_to_view_admin_as' ] );
585 add_action( 'wp_die_handler', [ $utilities, 'custom_error_page_on_switch_failure' ] );
586 }
587
588 // Password Protection
589 if ( array_key_exists( 'enable_password_protection', $options ) && $options['enable_password_protection'] ) {
590 add_action( 'plugins_loaded', [ $utilities, 'show_password_protection_admin_bar_icon' ] );
591 add_action( 'init', [ $utilities, 'maybe_disable_page_caching' ], 1 );
592 add_action( 'template_redirect', [ $utilities, 'maybe_show_login_form' ], 0 ); // load early
593 add_action( 'init', [ $utilities, 'maybe_process_login' ], 1 );
594 add_action( 'asenha_password_protection_error_messages', [ $utilities, 'add_login_error_messages' ] );
595 if ( function_exists( 'wp_site_icon' ) ) { // WP v4.3+
596 add_action( 'asenha_password_protection_login_head', 'wp_site_icon' );
597 }
598 }
599
600 // Maintenance Mode
601 if ( array_key_exists( 'maintenance_mode', $options ) && $options['maintenance_mode'] ) {
602 add_action( 'send_headers', [ $utilities, 'maintenance_mode_redirect' ] );
603 add_action( 'plugins_loaded', [ $utilities, 'show_maintenance_mode_admin_bar_icon' ] );
604 }
605
606 // Redirect 404 to Homepage
607
608 if ( array_key_exists( 'redirect_404_to_homepage', $options ) && $options['redirect_404_to_homepage'] ) {
609 add_filter( 'wp', [ $utilities, 'redirect_404_to_homepage' ] );
610 }
611
612 }
613
614 }
615
616 Admin_Site_Enhancements::get_instance();