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