PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 6.0.4
Admin and Site Enhancements (ASE) v6.0.4
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 / classes / class-disable-components.php
admin-site-enhancements / classes Last commit date
class-activation.php 2 years ago class-admin-interface.php 2 years ago class-common-methods.php 2 years ago class-content-management.php 2 years ago class-custom-code.php 2 years ago class-deactivation.php 2 years ago class-disable-components.php 2 years ago class-login-logout.php 2 years ago class-optimizations.php 2 years ago class-security.php 2 years ago class-settings-fields-render.php 2 years ago class-settings-sanitization.php 2 years ago class-settings-sections-fields.php 2 years ago class-utilities.php 2 years ago
class-disable-components.php
544 lines
1 <?php
2
3 namespace ASENHA\Classes;
4 use WP_Error;
5
6 /**
7 * Class related to the Disable Components feature
8 *
9 * @since 2.2.0
10 */
11 class Disable_Components {
12
13 /**
14 * Disable comments for post types
15 *
16 * @since 2.7.0
17 */
18 public function disable_comments_for_post_types_edit() {
19
20 $options = get_option( ASENHA_SLUG_U );
21 $disable_comments_for = $options['disable_comments_for'];
22
23 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
24 if ( $is_commenting_disabled ) {
25 remove_post_type_support( $post_type_slug, 'comments' );
26 remove_post_type_support( $post_type_slug, 'trackbacks' );
27 remove_meta_box( 'commentstatusdiv', $post_type_slug, 'normal' );
28 remove_meta_box( 'commentstatusdiv', $post_type_slug, 'side' );
29 remove_meta_box( 'commentsdiv', $post_type_slug, 'normal' );
30 remove_meta_box( 'commentsdiv', $post_type_slug, 'side' );
31 remove_meta_box( 'trackbacksdiv', $post_type_slug, 'normal' );
32 remove_meta_box( 'trackbacksdiv', $post_type_slug, 'side' );
33 // edit-comments.js
34 wp_dequeue_script( 'admin-comments' );
35 }
36 }
37
38 }
39
40 /**
41 * Hide existing comments from the frontend post
42 *
43 * @since 2.7.0
44 */
45 public function hide_existing_comments_on_frontend( $comments, $post_id ) {
46 $options = get_option( ASENHA_SLUG_U );
47 $disable_comments_for = $options['disable_comments_for'];
48 $current_post_type = get_post_type();
49
50 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
51 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
52 return array(); // return an empty array instead of the existing comments array
53 } else {
54 return $comments;
55 }
56 }
57 }
58
59 /**
60 * Close commenting on the frontend
61 *
62 * @since 2.7.0
63 */
64 public function close_commenting_on_frontend() {
65 $options = get_option( ASENHA_SLUG_U );
66 $disable_comments_for = $options['disable_comments_for'];
67 $current_post_type = get_post_type();
68
69 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
70 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
71 return false; // close commenting
72 } else {
73 return true; // keep commenting open
74 }
75 }
76 }
77
78 /**
79 * Show blank template on singular views when comment is disabled
80 *
81 * @since 4.9.2
82 */
83 public function show_blank_comment_template() {
84
85 $options = get_option( ASENHA_SLUG_U );
86 $disable_comments_for = $options['disable_comments_for'];
87 $current_post_type = get_post_type();
88
89 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
90 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
91
92 if ( is_singular() ) {
93 add_filter( 'comments_template', [ $this, 'load_blank_comment_template' ], 20 );
94 }
95
96 }
97 }
98
99 }
100
101 /**
102 * Load the actual blank comment template
103 *
104 * @since 4.9.2
105 */
106 public function load_blank_comment_template() {
107 return ASENHA_PATH . 'includes/blank-comment-template.php';
108 }
109
110 /**
111 * Disable Gutenberg in wp-admin for some or all post types
112 *
113 * @since 2.8.0
114 */
115 public function disable_gutenberg_for_post_types_admin() {
116
117 // Get current page's post type from WP core globals and query parameters
118
119 global $pagenow, $typenow;
120
121 $post_type = null;
122
123 if ( 'edit.php' === $pagenow ) { // on the list table screen, $typenow returns correct post type
124
125 $post_type = $typenow;
126
127 } elseif ( 'post.php' === $pagenow ) { // on the edit screen, $typenow is empty, so we detect it
128
129 $post_type = isset( $_GET['post'] ) ? get_post_type( $_GET['post'] ) : 'post';
130
131 } elseif ( 'post-new.php' === $pagenow ) { // on the add new screen, best to get post type from GET parameter
132
133 $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : 'post';
134
135 } else {}
136
137 // Check if Gutenberg feature is enabled for the site
138
139 // Before/after WP v5.0.0 via feature plugin
140 $gutenberg = function_exists( 'gutenberg_register_scripts_and_styles' );
141
142 // Since WP v5.0.0, gutenberg is in core
143 $block_editor = has_action( 'enqueue_block_assets' );
144
145 // Gutenberg feature is not enabled for the site
146 if ( ! $gutenberg && ( false === $block_editor ) ) {
147 return; // do nothing
148 }
149
150 // Assemble single-dimensional array of post types for which Gutenberg should be disabled
151 $options = get_option( ASENHA_SLUG_U );
152 $disable_gutenberg_for = $options['disable_gutenberg_for'];
153 $post_types_for_disable_gutenberg = array();
154
155 foreach( $disable_gutenberg_for as $post_type_slug => $is_gutenberg_disabled ) {
156 if ( $is_gutenberg_disabled ) {
157 $post_types_for_disable_gutenberg[] = $post_type_slug;
158 }
159 }
160
161 // Selectively disable Gutenberg
162 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
163
164 // For WP v5.0.0 upwards
165 add_filter( 'use_block_editor_for_post_type', '__return_false', 100 );
166
167 // If Gutenberg feature plugin is activated
168 if ( $gutenberg ) {
169 add_filter( 'gutenberg_can_edit_post_type', '__return_false', 100 );
170 $this->remove_all_gutenberg_hook();
171 }
172
173 }
174
175 }
176
177 /**
178 * Remove Gutenberg hooks added via feature plugin.
179 *
180 * @link https://plugins.trac.wordpress.org/browser/classic-editor/tags/1.6.2/classic-editor.php#L138
181 * @since 2.8.0
182 */
183 public function remove_all_gutenberg_hooks() {
184
185 remove_action( 'admin_menu', 'gutenberg_menu' );
186 remove_action( 'admin_init', 'gutenberg_redirect_demo' );
187
188 // Gutenberg 5.3+
189 remove_action( 'wp_enqueue_scripts', 'gutenberg_register_scripts_and_styles' );
190 remove_action( 'admin_enqueue_scripts', 'gutenberg_register_scripts_and_styles' );
191 remove_action( 'admin_notices', 'gutenberg_wordpress_version_notice' );
192 remove_action( 'rest_api_init', 'gutenberg_register_rest_widget_updater_routes' );
193 remove_action( 'admin_print_styles', 'gutenberg_block_editor_admin_print_styles' );
194 remove_action( 'admin_print_scripts', 'gutenberg_block_editor_admin_print_scripts' );
195 remove_action( 'admin_print_footer_scripts', 'gutenberg_block_editor_admin_print_footer_scripts' );
196 remove_action( 'admin_footer', 'gutenberg_block_editor_admin_footer' );
197 remove_action( 'admin_enqueue_scripts', 'gutenberg_widgets_init' );
198 remove_action( 'admin_notices', 'gutenberg_build_files_notice' );
199
200 remove_filter( 'load_script_translation_file', 'gutenberg_override_translation_file' );
201 remove_filter( 'block_editor_settings', 'gutenberg_extend_block_editor_styles' );
202 remove_filter( 'default_content', 'gutenberg_default_demo_content' );
203 remove_filter( 'default_title', 'gutenberg_default_demo_title' );
204 remove_filter( 'block_editor_settings', 'gutenberg_legacy_widget_settings' );
205 remove_filter( 'rest_request_after_callbacks', 'gutenberg_filter_oembed_result' );
206
207 // Previously used, compat for older Gutenberg versions.
208 remove_filter( 'wp_refresh_nonces', 'gutenberg_add_rest_nonce_to_heartbeat_response_headers' );
209 remove_filter( 'get_edit_post_link', 'gutenberg_revisions_link_to_editor' );
210 remove_filter( 'wp_prepare_revision_for_js', 'gutenberg_revisions_restore' );
211
212 remove_action( 'rest_api_init', 'gutenberg_register_rest_routes' );
213 remove_action( 'rest_api_init', 'gutenberg_add_taxonomy_visibility_field' );
214 remove_filter( 'registered_post_type', 'gutenberg_register_post_prepare_functions' );
215
216 remove_action( 'do_meta_boxes', 'gutenberg_meta_box_save' );
217 remove_action( 'submitpost_box', 'gutenberg_intercept_meta_box_render' );
218 remove_action( 'submitpage_box', 'gutenberg_intercept_meta_box_render' );
219 remove_action( 'edit_page_form', 'gutenberg_intercept_meta_box_render' );
220 remove_action( 'edit_form_advanced', 'gutenberg_intercept_meta_box_render' );
221 remove_filter( 'redirect_post_location', 'gutenberg_meta_box_save_redirect' );
222 remove_filter( 'filter_gutenberg_meta_boxes', 'gutenberg_filter_meta_boxes' );
223
224 remove_filter( 'body_class', 'gutenberg_add_responsive_body_class' );
225 remove_filter( 'admin_url', 'gutenberg_modify_add_new_button_url' ); // old
226 remove_action( 'admin_enqueue_scripts', 'gutenberg_check_if_classic_needs_warning_about_blocks' );
227 remove_filter( 'register_post_type_args', 'gutenberg_filter_post_type_labels' );
228 }
229
230 /**
231 * Disable Gutenberg styles and scripts on the front end for all or some post types
232 *
233 * @since 2.8.0
234 */
235 public function disable_gutenberg_for_post_types_frontend() {
236
237 $post = get_queried_object();
238
239 if ( ! is_null( $post ) ) {
240 if ( property_exists( $post, 'post_type' ) ) {
241
242 $post_type = $post->post_type;
243
244 // Assemble single-dimensional array of post types for which Gutenberg should be disabled
245 $options = get_option( ASENHA_SLUG_U );
246 $disable_gutenberg_for = $options['disable_gutenberg_for'];
247 $post_types_for_disable_gutenberg = array();
248
249 foreach( $disable_gutenberg_for as $post_type_slug => $is_gutenberg_disabled ) {
250 if ( $is_gutenberg_disabled ) {
251 $post_types_for_disable_gutenberg[] = $post_type_slug;
252 }
253 }
254
255 // Selectively disable for the selected post types
256 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
257
258 global $wp_styles;
259
260 // As needed, exclude some block styles from dequeuing
261 $keep_enqueued = array(); // e.g. array( 'wp-block-navigation' );
262
263 foreach ( $wp_styles->queue as $handle ) {
264
265 // For all stye handles that starts with 'wp-block'
266 if ( false !== strpos( $handle, 'wp-block' ) ) {
267
268 if ( ! in_array( $handle, $keep_enqueued ) ) {
269 wp_dequeue_style( $handle );
270 }
271
272 }
273
274 }
275
276 // Additional dequeuing
277 wp_dequeue_style( 'core-block-supports' );
278 wp_dequeue_style( 'global-styles' ); // theme.json
279 wp_dequeue_style( 'classic-theme-styles' ); // classic theme
280
281 }
282
283 }
284 }
285
286 }
287
288 /**
289 * Disable REST API for non-authenticated users. This is for WP v4.7 or later.
290 *
291 * @since 2.9.0
292 */
293 public function disable_rest_api() {
294
295 if ( ! is_user_logged_in() ) {
296
297 return new WP_Error(
298 'rest_api_authentication_required',
299 'The REST API has been restricted to authenticated users.',
300 array(
301 'status' => rest_authorization_required_code()
302 )
303 );
304
305 }
306
307 }
308
309 /**
310 * Ensure /feed/ page outputs a 403 Forbidden header and message
311 *
312 * @since 5.5.2
313 */
314 public function redirect_feed_to_403() {
315 if ( is_feed() ) {
316 status_header( 403 ); // Send an HTTP 403 Forbidden status header
317 die( '403 Forbidden' ); // End execution and display a 403 Forbidden message
318 }
319 }
320
321 /**
322 * Disable updates and related functionalities
323 *
324 * @since 4.0.0
325 */
326 public function disable_update_notices_version_checks() {
327
328 // Remove nags
329 remove_action( 'admin_notices', 'update_nag', 3 );
330 remove_action( 'admin_notices', 'maintenance_nag' );
331
332 // Disable WP version check
333 remove_action( 'wp_version_check', 'wp_version_check' );
334 remove_action( 'admin_init', 'wp_version_check' );
335 wp_clear_scheduled_hook( 'wp_version_check' );
336
337 add_filter( 'pre_option_update_core', '__return_null' );
338
339 // Disable theme version checks
340 remove_action( 'wp_update_themes', 'wp_update_themes' );
341 remove_action( 'admin_init', '_maybe_update_themes' );
342 wp_clear_scheduled_hook( 'wp_update_themes' );
343
344 remove_action( 'load-themes.php', 'wp_update_themes' );
345 remove_action( 'load-update.php', 'wp_update_themes' );
346 remove_action( 'load-update-core.php', 'wp_update_themes' );
347
348 // Disable plugin version checks
349 remove_action( 'wp_update_plugins', 'wp_update_plugins' );
350 remove_action( 'admin_init', '_maybe_update_plugins' );
351 wp_clear_scheduled_hook( 'wp_update_plugins' );
352
353 remove_action( 'load-plugins.php', 'wp_update_plugins' );
354 remove_action( 'load-update.php', 'wp_update_plugins' );
355 remove_action( 'load-update-core.php', 'wp_update_plugins' );
356
357 // Disable auto updates
358 wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
359
360 remove_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
361 remove_action( 'admin_init', 'wp_maybe_auto_update' );
362 remove_action( 'admin_init', 'wp_auto_update_core' );
363
364 // Disable Site Health checks
365 add_filter( 'site_status_tests', [ $this, 'disable_update_checks_in_site_health' ] );
366
367 }
368
369 /**
370 * Override version check info stored in transients named update_core, update_plugins, update_themes.
371 *
372 * @since 4.0.0
373 */
374 public function override_version_check_info() {
375
376 include( ABSPATH . WPINC . '/version.php' ); // get $wp_version from here
377
378 $current = (object)array(); // create empty object
379 $current->updates = array();
380 $current->response = array();
381 $current->version_checked = $wp_version;
382 $current->last_checked = time();
383
384 return $current;
385
386 }
387
388 /**
389 * Disable Background Updates and Auto-Updates tests in Site Health tests
390 *
391 * @since 4.0.0
392 */
393 public function disable_update_checks_in_site_health( $tests ) {
394
395 unset( $tests['async']['background_updates'] );
396 unset( $tests['direct']['plugin_theme_auto_updates'] );
397
398 return $tests;
399
400 }
401
402 /**
403 * Remove Dashboard >> Updates menu item
404 *
405 * @since 4.0.0
406 */
407 public function remove_updates_menu() {
408 global $submenu;
409 remove_submenu_page( 'index.php', 'update-core.php' );
410 }
411
412 /**
413 * Remove version number from URLs of static resources (CSS, JS)
414 *
415 * @since 5.8.0
416 */
417 public function remove_resource_version_number( $src ) {
418 if ( ! is_user_logged_in() ) {
419 if ( strpos( $src, '?ver=' ) ) {
420 $src = remove_query_arg( 'ver', $src );
421 }
422 }
423 return $src;
424 }
425
426 /**
427 * Disable loading of frontend public assets of dashicons
428 *
429 * @since 4.5.0
430 */
431 public function disable_dashicons_public_assets() {
432 if ( ! is_user_logged_in() ) {
433
434 // This will get /path/file.php?param=val portion of the full URL
435 $current_request_uri = sanitize_text_field( $_SERVER['REQUEST_URI'] );
436
437 if ( empty( $current_request_uri ) ) {
438 // On the homepage
439 wp_dequeue_style( 'dashicons' );
440 wp_deregister_style( 'dashicons' );
441 } else {
442 // Exclude the login page, where dashicon assets are requred to properly style the page
443 if ( false !== strpos( $current_request_uri, 'wp-login.php' ) ) {
444 // On wp-login.php, so, do nothing
445 }
446 // Exclude password protection form
447 elseif ( false !== strpos( $current_request_uri, 'protected-page=view' ) ) {
448 // On protected-page=view, so, do nothing
449 }
450 else {
451 // NOT on wp-login.php, e.g. www.example.com/an-article/, so, dequeue dashicons
452 wp_dequeue_style( 'dashicons' );
453 wp_deregister_style( 'dashicons' );
454 }
455 }
456 }
457 }
458
459 /**
460 * Disable emoji support
461 *
462 * @since 4.5.0
463 */
464 public function disable_emoji_support() {
465
466 remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
467 remove_action( 'embed_head', 'print_emoji_detection_script' );
468 remove_action( 'wp_print_styles', 'print_emoji_styles' );
469 remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
470 remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
471 remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
472 add_action( 'admin_init', [ $this, 'disable_admin_emojis' ] );
473 add_filter( 'emoji_svg_url', '__return_false' );
474 add_filter( 'tiny_mce_plugins', [ $this, 'disable_emoji_for_tinymce' ] );
475 add_filter( 'wp_resource_hints', [ $this, 'disable_emoji_remove_dns_prefetch' ], 10, 2 );
476
477 }
478
479 /**
480 * Disable jQuery Migrate
481 *
482 * @since 5.8.0
483 * @link https://plugins.trac.wordpress.org/browser/remove-jquery-migrate/trunk/remove-jquery-migrate.php
484 * @param WP_Scripts $scripts WP_Scripts object.
485 */
486 public function disable_jquery_migrate( $scripts ) {
487 if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
488 $script = $scripts->registered['jquery'];
489
490 if ( ! empty( $script->deps ) ) { // Check whether the script has any dependencies
491 $script->deps = array_diff( $script->deps, array( 'jquery-migrate' ) );
492 }
493 }
494 }
495
496 /**
497 * Remove the tinymce emoji plugin
498 *
499 * @since 4.5.0
500 */
501 public function disable_emoji_for_tinymce( $plugins ) {
502
503 if ( is_array( $plugins ) ) {
504 return array_diff( $plugins, array( 'wpemoji' ) );
505 }
506
507 return array();
508
509 }
510
511 /**
512 * Remove emoji CDN hostname from DNS prefetching hints.
513 *
514 * @since 4.5.0
515 */
516 public function disable_emoji_remove_dns_prefetch( $urls, $relation_type ) {
517
518 if ( 'dns-prefetch' == $relation_type ) {
519
520 // Strip out any URLs referencing the WordPress.org emoji location
521 $emoji_svg_url_base = 'https://s.w.org/images/core/emoji/';
522 foreach ( $urls as $key => $url ) {
523 if ( false !== strpos( $url, $emoji_svg_url_base ) ) {
524 unset( $urls[$key] );
525 }
526 }
527
528 }
529
530 return $urls;
531
532 }
533
534 /**
535 * Disable emojis in wp-admin
536 *
537 * @since 4.7.2
538 */
539 public function disable_admin_emojis() {
540 remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
541 remove_action( 'admin_print_styles', 'print_emoji_styles' );
542 }
543
544 }