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