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