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