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