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