PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 6.3.2
Admin and Site Enhancements (ASE) v6.3.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / 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
633 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 * Return empty comments array for comment templates
59 *
60 * @since 6.3.1
61 */
62 public function maybe_return_empty_comments( $comments, $post_id ) {
63 $options = get_option( ASENHA_SLUG_U );
64 $disable_comments_for = $options['disable_comments_for'];
65 $post = get_post( $post_id );
66 $current_post_type = $post->post_type;
67
68 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
69 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
70 return array();
71 } else {
72 return $comments;
73 }
74 }
75 }
76
77 /**
78 * Close commenting on the frontend
79 *
80 * @since 2.7.0
81 */
82 public function close_comments_pings_on_frontend( $comments_pings_open, $post_id ) {
83 // If commenting or pinging is not open, let's keep it that way
84 if ( ! $comments_pings_open ) {
85 return $comments_pings_open;
86 }
87
88 // Commenting or pinging is open for the post ID, let's decide if we should close it
89 $options = get_option( ASENHA_SLUG_U );
90 $disable_comments_for = $options['disable_comments_for'];
91 $post = get_post( $post_id );
92 $current_post_type = $post->post_type;
93
94 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
95 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
96 return false;
97 }
98 }
99
100 return $comments_pings_open;
101 }
102
103 /**
104 * Always return zero for comments count on a post where the post type has commenting disabled
105 *
106 * @since 6.2.7
107 */
108 public function return_zero_comments_count( $comments_number, $post_id ) {
109
110 $options = get_option( ASENHA_SLUG_U );
111 $disable_comments_for = $options['disable_comments_for'];
112 $post = get_post( $post_id );
113 $current_post_type = $post->post_type;
114
115 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
116 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
117 return 0;
118 }
119 }
120
121 }
122
123 /**
124 * Disable commenting via XML-RPC
125 *
126 * @link https://plugins.trac.wordpress.org/browser/disable-comments/tags/2.4.5/disable-comments.php
127 * @since 6.3.1
128 */
129 public function disable_xmlrpc_comments( $methods ) {
130 unset( $methods['wp.newComment'] );
131 return $methods;
132 }
133
134 /**
135 * Disables comments endpoint in REST API
136 *
137 * @link https://plugins.trac.wordpress.org/browser/disable-comments/tags/2.4.5/disable-comments.php
138 * @since 6.3.1
139 */
140 public function disable_rest_api_comments_endpoints( $endpoints ) {
141 if ( isset( $endpoints['comments'] ) ) {
142 unset( $endpoints['comments'] );
143 }
144
145 if ( isset( $endpoints['/wp/v2/comments'] ) ) {
146 unset( $endpoints['/wp/v2/comments'] );
147 }
148
149 if ( isset( $endpoints['/wp/v2/comments/(?P<id>[\d]+)'] ) ) {
150 unset( $endpoints['/wp/v2/comments/(?P<id>[\d]+)'] );
151 }
152
153 return $endpoints;
154 }
155
156 /**
157 * Return blank comment before inserting to DB
158 *
159 * @link https://plugins.trac.wordpress.org/browser/disable-comments/tags/2.4.5/disable-comments.php
160 * @since 6.3.1
161 */
162 public function return_blank_comment( $prepared_comment, $request ) {
163 return;
164 }
165
166 /**
167 * Show blank template on singular views when comment is disabled
168 *
169 * @since 4.9.2
170 */
171 public function show_blank_comment_template() {
172
173 $options = get_option( ASENHA_SLUG_U );
174 $disable_comments_for = $options['disable_comments_for'];
175 $current_post_type = get_post_type();
176
177 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
178 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
179
180 if ( is_singular() ) {
181 add_filter( 'comments_template', [ $this, 'load_blank_comment_template' ], 20 );
182 }
183
184 }
185 }
186
187 }
188
189 /**
190 * Load the actual blank comment template
191 *
192 * @since 4.9.2
193 */
194 public function load_blank_comment_template() {
195 return ASENHA_PATH . 'includes/blank-comment-template.php';
196 }
197
198 /**
199 * Disable Gutenberg in wp-admin for some or all post types
200 *
201 * @since 2.8.0
202 */
203 public function disable_gutenberg_for_post_types_admin() {
204
205 // Get current page's post type from WP core globals and query parameters
206
207 global $pagenow, $typenow;
208
209 $post_type = null;
210
211 if ( 'edit.php' === $pagenow ) { // on the list table screen, $typenow returns correct post type
212
213 $post_type = $typenow;
214
215 } elseif ( 'post.php' === $pagenow ) { // on the edit screen, $typenow is empty, so we detect it
216
217 $post_type = isset( $_GET['post'] ) ? get_post_type( $_GET['post'] ) : 'post';
218
219 } elseif ( 'post-new.php' === $pagenow ) { // on the add new screen, best to get post type from GET parameter
220
221 $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : 'post';
222
223 } else {}
224
225 // Check if Gutenberg feature is enabled for the site
226
227 // Before/after WP v5.0.0 via feature plugin
228 $gutenberg = function_exists( 'gutenberg_register_scripts_and_styles' );
229
230 // Since WP v5.0.0, gutenberg is in core
231 $block_editor = has_action( 'enqueue_block_assets' );
232
233 // Gutenberg feature is not enabled for the site
234 if ( ! $gutenberg && ( false === $block_editor ) ) {
235 return; // do nothing
236 }
237
238 // Assemble single-dimensional array of post types for which Gutenberg should be disabled
239 $options = get_option( ASENHA_SLUG_U );
240 $disable_gutenberg_for = $options['disable_gutenberg_for'];
241 $post_types_for_disable_gutenberg = array();
242
243 foreach( $disable_gutenberg_for as $post_type_slug => $is_gutenberg_disabled ) {
244 if ( $is_gutenberg_disabled ) {
245 $post_types_for_disable_gutenberg[] = $post_type_slug;
246 }
247 }
248
249 // Selectively disable Gutenberg
250 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
251
252 // For WP v5.0.0 upwards
253 add_filter( 'use_block_editor_for_post_type', '__return_false', 100 );
254
255 // If Gutenberg feature plugin is activated
256 if ( $gutenberg ) {
257 add_filter( 'gutenberg_can_edit_post_type', '__return_false', 100 );
258 $this->remove_all_gutenberg_hook();
259 }
260
261 }
262
263 }
264
265 /**
266 * Remove Gutenberg hooks added via feature plugin.
267 *
268 * @link https://plugins.trac.wordpress.org/browser/classic-editor/tags/1.6.2/classic-editor.php#L138
269 * @since 2.8.0
270 */
271 public function remove_all_gutenberg_hooks() {
272
273 remove_action( 'admin_menu', 'gutenberg_menu' );
274 remove_action( 'admin_init', 'gutenberg_redirect_demo' );
275
276 // Gutenberg 5.3+
277 remove_action( 'wp_enqueue_scripts', 'gutenberg_register_scripts_and_styles' );
278 remove_action( 'admin_enqueue_scripts', 'gutenberg_register_scripts_and_styles' );
279 remove_action( 'admin_notices', 'gutenberg_wordpress_version_notice' );
280 remove_action( 'rest_api_init', 'gutenberg_register_rest_widget_updater_routes' );
281 remove_action( 'admin_print_styles', 'gutenberg_block_editor_admin_print_styles' );
282 remove_action( 'admin_print_scripts', 'gutenberg_block_editor_admin_print_scripts' );
283 remove_action( 'admin_print_footer_scripts', 'gutenberg_block_editor_admin_print_footer_scripts' );
284 remove_action( 'admin_footer', 'gutenberg_block_editor_admin_footer' );
285 remove_action( 'admin_enqueue_scripts', 'gutenberg_widgets_init' );
286 remove_action( 'admin_notices', 'gutenberg_build_files_notice' );
287
288 remove_filter( 'load_script_translation_file', 'gutenberg_override_translation_file' );
289 remove_filter( 'block_editor_settings', 'gutenberg_extend_block_editor_styles' );
290 remove_filter( 'default_content', 'gutenberg_default_demo_content' );
291 remove_filter( 'default_title', 'gutenberg_default_demo_title' );
292 remove_filter( 'block_editor_settings', 'gutenberg_legacy_widget_settings' );
293 remove_filter( 'rest_request_after_callbacks', 'gutenberg_filter_oembed_result' );
294
295 // Previously used, compat for older Gutenberg versions.
296 remove_filter( 'wp_refresh_nonces', 'gutenberg_add_rest_nonce_to_heartbeat_response_headers' );
297 remove_filter( 'get_edit_post_link', 'gutenberg_revisions_link_to_editor' );
298 remove_filter( 'wp_prepare_revision_for_js', 'gutenberg_revisions_restore' );
299
300 remove_action( 'rest_api_init', 'gutenberg_register_rest_routes' );
301 remove_action( 'rest_api_init', 'gutenberg_add_taxonomy_visibility_field' );
302 remove_filter( 'registered_post_type', 'gutenberg_register_post_prepare_functions' );
303
304 remove_action( 'do_meta_boxes', 'gutenberg_meta_box_save' );
305 remove_action( 'submitpost_box', 'gutenberg_intercept_meta_box_render' );
306 remove_action( 'submitpage_box', 'gutenberg_intercept_meta_box_render' );
307 remove_action( 'edit_page_form', 'gutenberg_intercept_meta_box_render' );
308 remove_action( 'edit_form_advanced', 'gutenberg_intercept_meta_box_render' );
309 remove_filter( 'redirect_post_location', 'gutenberg_meta_box_save_redirect' );
310 remove_filter( 'filter_gutenberg_meta_boxes', 'gutenberg_filter_meta_boxes' );
311
312 remove_filter( 'body_class', 'gutenberg_add_responsive_body_class' );
313 remove_filter( 'admin_url', 'gutenberg_modify_add_new_button_url' ); // old
314 remove_action( 'admin_enqueue_scripts', 'gutenberg_check_if_classic_needs_warning_about_blocks' );
315 remove_filter( 'register_post_type_args', 'gutenberg_filter_post_type_labels' );
316 }
317
318 /**
319 * Disable Gutenberg styles and scripts on the front end for all or some post types
320 *
321 * @since 2.8.0
322 */
323 public function disable_gutenberg_for_post_types_frontend() {
324
325 $post = get_queried_object();
326
327 if ( ! is_null( $post ) ) {
328 if ( property_exists( $post, 'post_type' ) ) {
329
330 $post_type = $post->post_type;
331
332 // Assemble single-dimensional array of post types for which Gutenberg should be disabled
333 $options = get_option( ASENHA_SLUG_U );
334 $disable_gutenberg_for = $options['disable_gutenberg_for'];
335 $post_types_for_disable_gutenberg = array();
336
337 foreach( $disable_gutenberg_for as $post_type_slug => $is_gutenberg_disabled ) {
338 if ( $is_gutenberg_disabled ) {
339 $post_types_for_disable_gutenberg[] = $post_type_slug;
340 }
341 }
342
343 // Selectively disable for the selected post types
344 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
345
346 global $wp_styles;
347
348 // As needed, exclude some block styles from dequeuing
349 $keep_enqueued = array(); // e.g. array( 'wp-block-navigation' );
350
351 foreach ( $wp_styles->queue as $handle ) {
352
353 // For all stye handles that starts with 'wp-block'
354 if ( false !== strpos( $handle, 'wp-block' ) ) {
355
356 if ( ! in_array( $handle, $keep_enqueued ) ) {
357 wp_dequeue_style( $handle );
358 }
359
360 }
361
362 }
363
364 // Additional dequeuing
365 wp_dequeue_style( 'core-block-supports' );
366 wp_dequeue_style( 'global-styles' ); // theme.json
367 wp_dequeue_style( 'classic-theme-styles' ); // classic theme
368
369 }
370
371 }
372 }
373
374 }
375
376 /**
377 * Disable REST API for non-authenticated users. This is for WP v4.7 or later.
378 *
379 * @since 2.9.0
380 */
381 public function disable_rest_api() {
382
383 if ( ! is_user_logged_in() ) {
384
385 return new WP_Error(
386 'rest_api_authentication_required',
387 'The REST API has been restricted to authenticated users.',
388 array(
389 'status' => rest_authorization_required_code()
390 )
391 );
392
393 }
394
395 }
396
397 /**
398 * Ensure /feed/ page outputs a 403 Forbidden header and message
399 *
400 * @since 5.5.2
401 */
402 public function redirect_feed_to_403() {
403 if ( is_feed() ) {
404 status_header( 403 ); // Send an HTTP 403 Forbidden status header
405 die( '403 Forbidden' ); // End execution and display a 403 Forbidden message
406 }
407 }
408
409 /**
410 * Disable updates and related functionalities
411 *
412 * @since 4.0.0
413 */
414 public function disable_update_notices_version_checks() {
415
416 // Remove nags
417 remove_action( 'admin_notices', 'update_nag', 3 );
418 remove_action( 'admin_notices', 'maintenance_nag' );
419
420 // Disable WP version check
421 remove_action( 'wp_version_check', 'wp_version_check' );
422 remove_action( 'admin_init', 'wp_version_check' );
423 wp_clear_scheduled_hook( 'wp_version_check' );
424
425 add_filter( 'pre_option_update_core', '__return_null' );
426
427 // Disable theme version checks
428 remove_action( 'wp_update_themes', 'wp_update_themes' );
429 remove_action( 'admin_init', '_maybe_update_themes' );
430 wp_clear_scheduled_hook( 'wp_update_themes' );
431
432 remove_action( 'load-themes.php', 'wp_update_themes' );
433 remove_action( 'load-update.php', 'wp_update_themes' );
434 remove_action( 'load-update-core.php', 'wp_update_themes' );
435
436 // Disable plugin version checks
437 remove_action( 'wp_update_plugins', 'wp_update_plugins' );
438 remove_action( 'admin_init', '_maybe_update_plugins' );
439 wp_clear_scheduled_hook( 'wp_update_plugins' );
440
441 remove_action( 'load-plugins.php', 'wp_update_plugins' );
442 remove_action( 'load-update.php', 'wp_update_plugins' );
443 remove_action( 'load-update-core.php', 'wp_update_plugins' );
444
445 // Disable auto updates
446 wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
447
448 remove_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
449 remove_action( 'admin_init', 'wp_maybe_auto_update' );
450 remove_action( 'admin_init', 'wp_auto_update_core' );
451
452 // Disable Site Health checks
453 add_filter( 'site_status_tests', [ $this, 'disable_update_checks_in_site_health' ] );
454
455 }
456
457 /**
458 * Override version check info stored in transients named update_core, update_plugins, update_themes.
459 *
460 * @since 4.0.0
461 */
462 public function override_version_check_info() {
463
464 include( ABSPATH . WPINC . '/version.php' ); // get $wp_version from here
465
466 $current = (object)array(); // create empty object
467 $current->updates = array();
468 $current->response = array();
469 $current->version_checked = $wp_version;
470 $current->last_checked = time();
471
472 return $current;
473
474 }
475
476 /**
477 * Disable Background Updates and Auto-Updates tests in Site Health tests
478 *
479 * @since 4.0.0
480 */
481 public function disable_update_checks_in_site_health( $tests ) {
482
483 unset( $tests['async']['background_updates'] );
484 unset( $tests['direct']['plugin_theme_auto_updates'] );
485
486 return $tests;
487
488 }
489
490 /**
491 * Remove Dashboard >> Updates menu item
492 *
493 * @since 4.0.0
494 */
495 public function remove_updates_menu() {
496 global $submenu;
497 remove_submenu_page( 'index.php', 'update-core.php' );
498 }
499
500 /**
501 * Remove version number from URLs of static resources (CSS, JS)
502 *
503 * @since 5.8.0
504 */
505 public function remove_resource_version_number( $src ) {
506 if ( ! is_user_logged_in() ) {
507 if ( strpos( $src, '?ver=' ) ) {
508 $src = remove_query_arg( 'ver', $src );
509 }
510 }
511 return $src;
512 }
513
514 /**
515 * Disable loading of frontend public assets of dashicons
516 *
517 * @since 4.5.0
518 */
519 public function disable_dashicons_public_assets() {
520 global $pagenow;
521 if ( ! is_user_logged_in() ) {
522
523 // This will get /path/file.php?param=val portion of the full URL
524 $current_request_uri = sanitize_text_field( $_SERVER['REQUEST_URI'] );
525
526 if ( empty( $current_request_uri ) ) {
527 // On the homepage
528 wp_dequeue_style( 'dashicons' );
529 wp_deregister_style( 'dashicons' );
530 } else {
531 // Exclude the login page, where dashicon assets are requred to properly style the page
532 if ( false !== strpos( $current_request_uri, 'wp-login.php' ) || 'wp-login.php' === $pagenow ) {
533 // On wp-login.php, so, do nothing
534 }
535 // Exclude password protection form
536 elseif ( false !== strpos( $current_request_uri, 'protected-page=view' ) ) {
537 // On protected-page=view, so, do nothing
538 }
539 else {
540 // NOT on wp-login.php, e.g. www.example.com/an-article/, so, dequeue dashicons
541 wp_dequeue_style( 'dashicons' );
542 wp_deregister_style( 'dashicons' );
543 }
544 }
545 }
546 }
547
548 /**
549 * Disable emoji support
550 *
551 * @since 4.5.0
552 */
553 public function disable_emoji_support() {
554
555 remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
556 remove_action( 'embed_head', 'print_emoji_detection_script' );
557 remove_action( 'wp_print_styles', 'print_emoji_styles' );
558 remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
559 remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
560 remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
561 add_action( 'admin_init', [ $this, 'disable_admin_emojis' ] );
562 add_filter( 'emoji_svg_url', '__return_false' );
563 add_filter( 'tiny_mce_plugins', [ $this, 'disable_emoji_for_tinymce' ] );
564 add_filter( 'wp_resource_hints', [ $this, 'disable_emoji_remove_dns_prefetch' ], 10, 2 );
565
566 }
567
568 /**
569 * Disable jQuery Migrate
570 *
571 * @since 5.8.0
572 * @link https://plugins.trac.wordpress.org/browser/remove-jquery-migrate/trunk/remove-jquery-migrate.php
573 * @param WP_Scripts $scripts WP_Scripts object.
574 */
575 public function disable_jquery_migrate( $scripts ) {
576 if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
577 $script = $scripts->registered['jquery'];
578
579 if ( ! empty( $script->deps ) ) { // Check whether the script has any dependencies
580 $script->deps = array_diff( $script->deps, array( 'jquery-migrate' ) );
581 }
582 }
583 }
584
585 /**
586 * Remove the tinymce emoji plugin
587 *
588 * @since 4.5.0
589 */
590 public function disable_emoji_for_tinymce( $plugins ) {
591
592 if ( is_array( $plugins ) ) {
593 return array_diff( $plugins, array( 'wpemoji' ) );
594 }
595
596 return array();
597
598 }
599
600 /**
601 * Remove emoji CDN hostname from DNS prefetching hints.
602 *
603 * @since 4.5.0
604 */
605 public function disable_emoji_remove_dns_prefetch( $urls, $relation_type ) {
606
607 if ( 'dns-prefetch' == $relation_type ) {
608
609 // Strip out any URLs referencing the WordPress.org emoji location
610 $emoji_svg_url_base = 'https://s.w.org/images/core/emoji/';
611 foreach ( $urls as $key => $url ) {
612 if ( is_string( $url ) && false !== strpos( $url, $emoji_svg_url_base ) ) {
613 unset( $urls[$key] );
614 }
615 }
616
617 }
618
619 return $urls;
620
621 }
622
623 /**
624 * Disable emojis in wp-admin
625 *
626 * @since 4.7.2
627 */
628 public function disable_admin_emojis() {
629 remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
630 remove_action( 'admin_print_styles', 'print_emoji_styles' );
631 }
632
633 }