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;
} );
}
}
}
}
}