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