disable_emojis(); } // Disable embeds. if ( ! empty( $settings['disable_embeds'] ) ) { $this->disable_embeds(); } // Disable XML-RPC. if ( ! empty( $settings['disable_xmlrpc'] ) ) { add_filter( 'xmlrpc_enabled', '__return_false' ); add_filter( 'wp_headers', array( $this, 'remove_xmlrpc_header' ) ); } // Remove WordPress version. if ( ! empty( $settings['remove_wp_version'] ) ) { remove_action( 'wp_head', 'wp_generator' ); add_filter( 'the_generator', '__return_empty_string' ); } // Remove generator meta. if ( ! empty( $settings['remove_generator_meta'] ) ) { remove_action( 'wp_head', 'wp_generator' ); add_filter( 'the_generator', '__return_empty_string' ); } // Disable feeds. if ( ! empty( $settings['disable_feeds'] ) ) { remove_action( 'wp_head', 'feed_links', 2 ); remove_action( 'wp_head', 'feed_links_extra', 3 ); } // Disable pingbacks. if ( ! empty( $settings['disable_pingbacks'] ) ) { add_filter( 'xmlrpc_methods', array( $this, 'disable_pingback_methods' ) ); add_filter( 'pings_open', '__return_false', 9999 ); } // Remove shortlinks. if ( ! empty( $settings['remove_shortlinks'] ) ) { remove_action( 'wp_head', 'wp_shortlink_wp_head' ); remove_action( 'template_redirect', 'wp_shortlink_header', 11 ); } // Remove discovery links. if ( ! empty( $settings['remove_discovery_links'] ) ) { remove_action( 'wp_head', 'rsd_link' ); remove_action( 'wp_head', 'wlwmanifest_link' ); remove_action( 'wp_head', 'rest_output_link_wp_head', 10 ); remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 ); } // Heartbeat control. $this->control_heartbeat( $settings ); // Htaccess management for Apache/LiteSpeed. if ( is_admin() ) { add_action( 'admin_init', array( $this, 'maybe_update_htaccess' ) ); } } /** * Update .htaccess if server is Apache and setting changed. */ public function maybe_update_htaccess() { $settings = wpsco_get_setting(); if ( ! empty( $settings['emergency_disable'] ) ) { $this->remove_htaccess_rules(); return; } if ( ! empty( $settings['browser_cache_htaccess'] ) || ! empty( $settings['compression_htaccess'] ) ) { $this->write_htaccess_rules( ! empty( $settings['compression_htaccess'] ) ); } else { $this->remove_htaccess_rules(); } } /** * Write rules inside # BEGIN WP_SPEED_OPTIMIZER markers. * * @param bool $enable_compression Whether to add compression rules. */ public function write_htaccess_rules( $enable_compression = true ) { $server_type = wpsco_get_server_type(); if ( ! in_array( $server_type, array( 'apache', 'litespeed', 'openlitespeed' ), true ) ) { return; } if ( ! function_exists( 'get_home_path' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if ( ! function_exists( 'insert_with_markers' ) ) { require_once ABSPATH . 'wp-admin/includes/misc.php'; } $htaccess_file = get_home_path() . '.htaccess'; if ( ! file_exists( $htaccess_file ) || ! wp_is_writable( $htaccess_file ) ) { return; } $rules = array(); $rules[] = ''; $rules[] = 'ExpiresActive On'; $rules[] = 'ExpiresByType image/jpg "access plus 1 year"'; $rules[] = 'ExpiresByType image/jpeg "access plus 1 year"'; $rules[] = 'ExpiresByType image/gif "access plus 1 year"'; $rules[] = 'ExpiresByType image/png "access plus 1 year"'; $rules[] = 'ExpiresByType image/webp "access plus 1 year"'; $rules[] = 'ExpiresByType image/avif "access plus 1 year"'; $rules[] = 'ExpiresByType image/svg+xml "access plus 1 year"'; $rules[] = 'ExpiresByType text/css "access plus 1 month"'; $rules[] = 'ExpiresByType application/javascript "access plus 1 month"'; $rules[] = 'ExpiresByType font/woff2 "access plus 1 year"'; $rules[] = ''; if ( $enable_compression ) { $rules[] = ''; $rules[] = 'AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json'; $rules[] = ''; } insert_with_markers( $htaccess_file, 'SpeedNest', $rules ); } /** * Remove rules marked with # BEGIN SpeedNest. */ public function remove_htaccess_rules() { if ( ! function_exists( 'get_home_path' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if ( ! function_exists( 'insert_with_markers' ) ) { require_once ABSPATH . 'wp-admin/includes/misc.php'; } $htaccess_file = get_home_path() . '.htaccess'; if ( ! file_exists( $htaccess_file ) || ! wp_is_writable( $htaccess_file ) ) { return; } insert_with_markers( $htaccess_file, 'SpeedNest', array() ); insert_with_markers( $htaccess_file, 'WP_SPEED_OPTIMIZER', array() ); } /** * Disable WordPress emojis. */ private function disable_emojis() { remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); remove_action( 'wp_print_styles', 'print_emoji_styles' ); remove_action( 'admin_print_styles', 'print_emoji_styles' ); remove_filter( 'the_content_feed', 'wp_staticize_emoji' ); remove_filter( 'comment_text_rss', 'wp_staticize_emoji' ); remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' ); add_filter( 'tiny_mce_plugins', function ( $plugins ) { return is_array( $plugins ) ? array_diff( $plugins, array( 'wpemoji' ) ) : $plugins; } ); add_filter( 'wp_resource_hints', function ( $urls, $relation_type ) { if ( 'dns-prefetch' === $relation_type ) { $urls = array_filter( $urls, function ( $url ) { return strpos( $url, 'emoji' ) === false; } ); } return $urls; }, 10, 2 ); } /** * Disable WordPress embeds. */ private function disable_embeds() { remove_action( 'wp_head', 'wp_oembed_add_host_js' ); remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); remove_action( 'rest_api_init', 'wp_oembed_register_route' ); add_filter( 'embed_oembed_discover', '__return_false' ); remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 ); remove_filter( 'oembed_response_data', 'get_oembed_response_data_rich', 10 ); wp_deregister_script( 'wp-embed' ); } /** * Remove X-Pingback header. * * @param array $headers HTTP headers. * @return array */ public function remove_xmlrpc_header( $headers ) { unset( $headers['X-Pingback'] ); return $headers; } /** * Disable pingback XML-RPC methods. * * @param array $methods XML-RPC methods. * @return array */ public function disable_pingback_methods( $methods ) { unset( $methods['pingback.ping'] ); unset( $methods['pingback.extensions.getPingbacks'] ); return $methods; } /** * Control Heartbeat API. * * @param array $settings Plugin settings. */ private function control_heartbeat( $settings ) { $frontend = isset( $settings['heartbeat_frontend'] ) ? $settings['heartbeat_frontend'] : 'default'; $admin = isset( $settings['heartbeat_admin'] ) ? $settings['heartbeat_admin'] : 'default'; $editor = isset( $settings['heartbeat_editor'] ) ? $settings['heartbeat_editor'] : 'default'; // Frontend. if ( 'disable' === $frontend && ! is_admin() ) { wp_deregister_script( 'heartbeat' ); } elseif ( 'default' !== $frontend && ! is_admin() ) { add_filter( 'heartbeat_settings', function ( $heartbeat_settings ) use ( $frontend ) { $heartbeat_settings['interval'] = (int) $frontend; return $heartbeat_settings; } ); } // Admin (but not editor). if ( is_admin() ) { $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null; $is_editor = $screen && ( 'post' === $screen->base || 'post-new' === $screen->base ); if ( $is_editor && 'default' !== $editor ) { if ( 'disable' === $editor ) { // Do not disable in editor — may cause issues. // Instead, set to maximum interval. add_filter( 'heartbeat_settings', function ( $heartbeat_settings ) { $heartbeat_settings['interval'] = 120; return $heartbeat_settings; } ); } else { add_filter( 'heartbeat_settings', function ( $heartbeat_settings ) use ( $editor ) { $heartbeat_settings['interval'] = (int) $editor; return $heartbeat_settings; } ); } } elseif ( ! $is_editor && 'default' !== $admin ) { if ( 'disable' === $admin ) { wp_deregister_script( 'heartbeat' ); } else { add_filter( 'heartbeat_settings', function ( $heartbeat_settings ) use ( $admin ) { $heartbeat_settings['interval'] = (int) $admin; return $heartbeat_settings; } ); } } } } }