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