PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.9.2
Admin and Site Enhancements (ASE) v4.9.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
471 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 }
34 }
35
36 }
37
38 /**
39 * Hide existing comments from the frontend post
40 *
41 * @since 2.7.0
42 */
43 public function hide_existing_comments_on_frontend( $comments, $post_id ) {
44 $options = get_option( ASENHA_SLUG_U );
45 $disable_comments_for = $options['disable_comments_for'];
46 $current_post_type = get_post_type();
47
48 foreach ( $disable_comments_for as $post_type_slug => $is_commenting_disabled ) {
49 if ( ( $current_post_type === $post_type_slug ) && $is_commenting_disabled ) {
50 return array(); // return an empty array instead of the existing comments array
51 } else {
52 return $comments;
53 }
54 }
55 }
56
57 /**
58 * Close commenting on the frontend
59 *
60 * @since 2.7.0
61 */
62 public function close_commenting_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 = get_post_type( $_GET['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 $post_type = $post->post_type;
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 for the selected post types
250 if ( in_array( $post_type, $post_types_for_disable_gutenberg ) ) {
251
252 global $wp_styles;
253
254 // As needed, exclude some block styles from dequeuing
255 $keep_enqueued = array(); // e.g. array( 'wp-block-navigation' );
256
257 foreach ( $wp_styles->queue as $handle ) {
258
259 // For all stye handles that starts with 'wp-block'
260 if ( false !== strpos( $handle, 'wp-block' ) ) {
261
262 if ( ! in_array( $handle, $keep_enqueued ) ) {
263 wp_dequeue_style( $handle );
264 }
265
266 }
267
268 }
269
270 // Additional dequeuing
271 wp_dequeue_style( 'core-block-supports' );
272 wp_dequeue_style( 'global-styles' ); // theme.json
273 wp_dequeue_style( 'classic-theme-styles' ); // classic theme
274
275 }
276
277 }
278
279 /**
280 * Disable REST API for non-authenticated users. This is for WP v4.7 or later.
281 *
282 * @since 2.9.0
283 */
284 public function disable_rest_api() {
285
286 return new WP_Error(
287 'rest_api_authentication_required',
288 'The REST API has been restricted to authenticated users.',
289 array(
290 'status' => rest_authorization_required_code()
291 )
292 );
293
294 }
295
296 /**
297 * Disable updates and related functionalities
298 *
299 * @since 4.0.0
300 */
301 public function disable_update_notices_version_checks() {
302
303 // Remove nags
304 remove_action( 'admin_notices', 'update_nag', 3 );
305 remove_action( 'admin_notices', 'maintenance_nag' );
306
307 // Disable WP version check
308 remove_action( 'wp_version_check', 'wp_version_check' );
309 remove_action( 'admin_init', 'wp_version_check' );
310 wp_clear_scheduled_hook( 'wp_version_check' );
311
312 add_filter( 'pre_option_update_core', '__return_null' );
313
314 // Disable theme version checks
315 remove_action( 'wp_update_themes', 'wp_update_themes' );
316 remove_action( 'admin_init', '_maybe_update_themes' );
317 wp_clear_scheduled_hook( 'wp_update_themes' );
318
319 remove_action( 'load-themes.php', 'wp_update_themes' );
320 remove_action( 'load-update.php', 'wp_update_themes' );
321 remove_action( 'load-update-core.php', 'wp_update_themes' );
322
323 // Disable plugin version checks
324 remove_action( 'wp_update_plugins', 'wp_update_plugins' );
325 remove_action( 'admin_init', '_maybe_update_plugins' );
326 wp_clear_scheduled_hook( 'wp_update_plugins' );
327
328 remove_action( 'load-plugins.php', 'wp_update_plugins' );
329 remove_action( 'load-update.php', 'wp_update_plugins' );
330 remove_action( 'load-update-core.php', 'wp_update_plugins' );
331
332 // Disable auto updates
333 wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
334
335 remove_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
336 remove_action( 'admin_init', 'wp_maybe_auto_update' );
337 remove_action( 'admin_init', 'wp_auto_update_core' );
338
339 // Disable Site Health checks
340 add_filter( 'site_status_tests', [ $this, 'disable_update_checks_in_site_health' ] );
341
342 }
343
344 /**
345 * Override version check info stored in transients named update_core, update_plugins, update_themes.
346 *
347 * @since 4.0.0
348 */
349 public function override_version_check_info() {
350
351 include( ABSPATH . WPINC . '/version.php' ); // get $wp_version from here
352
353 $current = (object)array(); // create empty object
354 $current->updates = array();
355 $current->response = array();
356 $current->version_checked = $wp_version;
357 $current->last_checked = time();
358
359 return $current;
360
361 }
362
363 /**
364 * Disable Background Updates and Auto-Updates tests in Site Health tests
365 *
366 * @since 4.0.0
367 */
368 public function disable_update_checks_in_site_health( $tests ) {
369
370 unset( $tests['async']['background_updates'] );
371 unset( $tests['direct']['plugin_theme_auto_updates'] );
372
373 return $tests;
374
375 }
376
377 /**
378 * Remove Dashboard >> Updates menu item
379 *
380 * @since 4.0.0
381 */
382 public function remove_updates_menu() {
383 global $submenu;
384 remove_submenu_page( 'index.php', 'update-core.php' );
385 }
386
387 /**
388 * Disable loading of frontend public assets of dashicons
389 *
390 * @since 4.5.0
391 */
392 public function disable_dashicons_public_assets() {
393 if ( ! is_user_logged_in() ) {
394 // Exclude the login page, where dashicon assets are requred to properly style the page
395 $current_url = sanitize_text_field( $_SERVER['REQUEST_URI'] );
396 if ( false !== strpos( 'wp-login.php', $current_url ) ) {
397 wp_dequeue_style( 'dashicons' );
398 wp_deregister_style( 'dashicons' );
399 }
400 }
401 }
402
403 /**
404 * Disable emoji support
405 *
406 * @since 4.5.0
407 */
408 public function disable_emoji_support() {
409
410 remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
411 remove_action( 'embed_head', 'print_emoji_detection_script' );
412 remove_action( 'wp_print_styles', 'print_emoji_styles' );
413 remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
414 remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
415 remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
416 add_action( 'admin_init', [ $this, 'disable_admin_emojis' ] );
417 add_filter( 'emoji_svg_url', '__return_false' );
418 add_filter( 'tiny_mce_plugins', [ $this, 'disable_emoji_for_tinymce' ] );
419 add_filter( 'wp_resource_hints', [ $this, 'disable_emoji_remove_dns_prefetch' ], 10, 2 );
420
421 }
422
423 /**
424 * Remove the tinymce emoji plugin
425 *
426 * @since 4.5.0
427 */
428 public function disable_emoji_for_tinymce( $plugins ) {
429
430 if ( is_array( $plugins ) ) {
431 return array_diff( $plugins, array( 'wpemoji' ) );
432 }
433
434 return array();
435
436 }
437
438 /**
439 * Remove emoji CDN hostname from DNS prefetching hints.
440 *
441 * @since 4.5.0
442 */
443 public function disable_emoji_remove_dns_prefetch( $urls, $relation_type ) {
444
445 if ( 'dns-prefetch' == $relation_type ) {
446
447 // Strip out any URLs referencing the WordPress.org emoji location
448 $emoji_svg_url_base = 'https://s.w.org/images/core/emoji/';
449 foreach ( $urls as $key => $url ) {
450 if ( false !== strpos( $url, $emoji_svg_url_base ) ) {
451 unset( $urls[$key] );
452 }
453 }
454
455 }
456
457 return $urls;
458
459 }
460
461 /**
462 * Disable emojis in wp-admin
463 *
464 * @since 4.7.2
465 */
466 public function disable_admin_emojis() {
467 remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
468 remove_action( 'admin_print_styles', 'print_emoji_styles' );
469 }
470
471 }