PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 5.5.2
Admin and Site Enhancements (ASE) v5.5.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 / classes / class-disable-components.php
admin-site-enhancements / classes Last commit date
class-activation.php 3 years ago class-admin-interface.php 3 years ago class-common-methods.php 3 years ago class-content-management.php 3 years ago class-custom-code.php 3 years ago class-deactivation.php 3 years ago class-disable-components.php 3 years ago class-login-logout.php 3 years ago class-optimizations.php 3 years ago class-security.php 3 years ago class-settings-fields-render.php 3 years ago class-settings-sanitization.php 3 years ago class-settings-sections-fields.php 3 years ago class-utilities.php 3 years ago
class-disable-components.php
506 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 $post_type = $post->post_type;
239
240 // Assemble single-dimensional array of post types for which Gutenberg should be disabled
241 $options = get_option( ASENHA_SLUG_U );
242 $disable_gutenberg_for = $options['disable_gutenberg_for'];
243 $post_types_for_disable_gutenberg = array();
244
245 foreach( $disable_gutenberg_for as $post_type_slug => $is_gutenberg_disabled ) {
246 if ( $is_gutenberg_disabled ) {
247 $post_types_for_disable_gutenberg[] = $post_type_slug;
248 }
249 }
250
251 // Selectively disable for the selected post types
252 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
253
254 global $wp_styles;
255
256 // As needed, exclude some block styles from dequeuing
257 $keep_enqueued = array(); // e.g. array( 'wp-block-navigation' );
258
259 foreach ( $wp_styles->queue as $handle ) {
260
261 // For all stye handles that starts with 'wp-block'
262 if ( false !== strpos( $handle, 'wp-block' ) ) {
263
264 if ( ! in_array( $handle, $keep_enqueued ) ) {
265 wp_dequeue_style( $handle );
266 }
267
268 }
269
270 }
271
272 // Additional dequeuing
273 wp_dequeue_style( 'core-block-supports' );
274 wp_dequeue_style( 'global-styles' ); // theme.json
275 wp_dequeue_style( 'classic-theme-styles' ); // classic theme
276
277 }
278
279 }
280
281 /**
282 * Disable REST API for non-authenticated users. This is for WP v4.7 or later.
283 *
284 * @since 2.9.0
285 */
286 public function disable_rest_api() {
287
288 if ( ! is_user_logged_in() ) {
289
290 return new WP_Error(
291 'rest_api_authentication_required',
292 'The REST API has been restricted to authenticated users.',
293 array(
294 'status' => rest_authorization_required_code()
295 )
296 );
297
298 }
299
300 }
301
302 /**
303 * Ensure /feed/ page outputs a 403 Forbidden header and message
304 *
305 * @since 5.5.2
306 */
307 public function redirect_feed_to_403() {
308 if ( is_feed() ) {
309 status_header( 403 ); // Send an HTTP 403 Forbidden status header
310 die( '403 Forbidden' ); // End execution and display a 403 Forbidden message
311 }
312 }
313
314 /**
315 * Disable updates and related functionalities
316 *
317 * @since 4.0.0
318 */
319 public function disable_update_notices_version_checks() {
320
321 // Remove nags
322 remove_action( 'admin_notices', 'update_nag', 3 );
323 remove_action( 'admin_notices', 'maintenance_nag' );
324
325 // Disable WP version check
326 remove_action( 'wp_version_check', 'wp_version_check' );
327 remove_action( 'admin_init', 'wp_version_check' );
328 wp_clear_scheduled_hook( 'wp_version_check' );
329
330 add_filter( 'pre_option_update_core', '__return_null' );
331
332 // Disable theme version checks
333 remove_action( 'wp_update_themes', 'wp_update_themes' );
334 remove_action( 'admin_init', '_maybe_update_themes' );
335 wp_clear_scheduled_hook( 'wp_update_themes' );
336
337 remove_action( 'load-themes.php', 'wp_update_themes' );
338 remove_action( 'load-update.php', 'wp_update_themes' );
339 remove_action( 'load-update-core.php', 'wp_update_themes' );
340
341 // Disable plugin version checks
342 remove_action( 'wp_update_plugins', 'wp_update_plugins' );
343 remove_action( 'admin_init', '_maybe_update_plugins' );
344 wp_clear_scheduled_hook( 'wp_update_plugins' );
345
346 remove_action( 'load-plugins.php', 'wp_update_plugins' );
347 remove_action( 'load-update.php', 'wp_update_plugins' );
348 remove_action( 'load-update-core.php', 'wp_update_plugins' );
349
350 // Disable auto updates
351 wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
352
353 remove_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
354 remove_action( 'admin_init', 'wp_maybe_auto_update' );
355 remove_action( 'admin_init', 'wp_auto_update_core' );
356
357 // Disable Site Health checks
358 add_filter( 'site_status_tests', [ $this, 'disable_update_checks_in_site_health' ] );
359
360 }
361
362 /**
363 * Override version check info stored in transients named update_core, update_plugins, update_themes.
364 *
365 * @since 4.0.0
366 */
367 public function override_version_check_info() {
368
369 include( ABSPATH . WPINC . '/version.php' ); // get $wp_version from here
370
371 $current = (object)array(); // create empty object
372 $current->updates = array();
373 $current->response = array();
374 $current->version_checked = $wp_version;
375 $current->last_checked = time();
376
377 return $current;
378
379 }
380
381 /**
382 * Disable Background Updates and Auto-Updates tests in Site Health tests
383 *
384 * @since 4.0.0
385 */
386 public function disable_update_checks_in_site_health( $tests ) {
387
388 unset( $tests['async']['background_updates'] );
389 unset( $tests['direct']['plugin_theme_auto_updates'] );
390
391 return $tests;
392
393 }
394
395 /**
396 * Remove Dashboard >> Updates menu item
397 *
398 * @since 4.0.0
399 */
400 public function remove_updates_menu() {
401 global $submenu;
402 remove_submenu_page( 'index.php', 'update-core.php' );
403 }
404
405 /**
406 * Disable loading of frontend public assets of dashicons
407 *
408 * @since 4.5.0
409 */
410 public function disable_dashicons_public_assets() {
411 if ( ! is_user_logged_in() ) {
412
413 // This will get /path/file.php?param=val portion of the full URL
414 $current_request_uri = sanitize_text_field( $_SERVER['REQUEST_URI'] );
415
416 if ( empty( $current_request_uri ) ) {
417 // On the homepage
418 wp_dequeue_style( 'dashicons' );
419 wp_deregister_style( 'dashicons' );
420 } else {
421 // Exclude the login page, where dashicon assets are requred to properly style the page
422 if ( false !== strpos( $current_request_uri, 'wp-login.php' ) ) {
423 // On wp-login.php, so, do nothing
424 }
425 // Exclude password protection form
426 elseif ( false !== strpos( $current_request_uri, 'protected-page=view' ) ) {
427 // On protected-page=view, so, do nothing
428 }
429 else {
430 // NOT on wp-login.php, e.g. www.example.com/an-article/, so, dequeue dashicons
431 wp_dequeue_style( 'dashicons' );
432 wp_deregister_style( 'dashicons' );
433 }
434 }
435 }
436 }
437
438 /**
439 * Disable emoji support
440 *
441 * @since 4.5.0
442 */
443 public function disable_emoji_support() {
444
445 remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
446 remove_action( 'embed_head', 'print_emoji_detection_script' );
447 remove_action( 'wp_print_styles', 'print_emoji_styles' );
448 remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
449 remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
450 remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
451 add_action( 'admin_init', [ $this, 'disable_admin_emojis' ] );
452 add_filter( 'emoji_svg_url', '__return_false' );
453 add_filter( 'tiny_mce_plugins', [ $this, 'disable_emoji_for_tinymce' ] );
454 add_filter( 'wp_resource_hints', [ $this, 'disable_emoji_remove_dns_prefetch' ], 10, 2 );
455
456 }
457
458 /**
459 * Remove the tinymce emoji plugin
460 *
461 * @since 4.5.0
462 */
463 public function disable_emoji_for_tinymce( $plugins ) {
464
465 if ( is_array( $plugins ) ) {
466 return array_diff( $plugins, array( 'wpemoji' ) );
467 }
468
469 return array();
470
471 }
472
473 /**
474 * Remove emoji CDN hostname from DNS prefetching hints.
475 *
476 * @since 4.5.0
477 */
478 public function disable_emoji_remove_dns_prefetch( $urls, $relation_type ) {
479
480 if ( 'dns-prefetch' == $relation_type ) {
481
482 // Strip out any URLs referencing the WordPress.org emoji location
483 $emoji_svg_url_base = 'https://s.w.org/images/core/emoji/';
484 foreach ( $urls as $key => $url ) {
485 if ( false !== strpos( $url, $emoji_svg_url_base ) ) {
486 unset( $urls[$key] );
487 }
488 }
489
490 }
491
492 return $urls;
493
494 }
495
496 /**
497 * Disable emojis in wp-admin
498 *
499 * @since 4.7.2
500 */
501 public function disable_admin_emojis() {
502 remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
503 remove_action( 'admin_print_styles', 'print_emoji_styles' );
504 }
505
506 }