Тюнинг WordPress

Предпочитаю отключать функции WordPress, которые не использую в проектах, что делает верстку сайта чище, скорость выше и радует сердце перфекциониста. В этой заметке я собрал куски кода, отключающие те или иные фичи WordPress.

Предпочитаю отключать функции WordPress, которые не использую в проектах. Сверх прибавки к скорости сайта или супер SEO это не даст, но сердце перфекциониста точно порадует. Возможно, кто-то поспорит о целесообразности отключения некоторых фич, но я ратую за то, чтобы процессы были контролируемыми, а не навязаны в качестве избыточного функционала.

В этой заметке я собрал куски кода, отключающие те или иные функции WordPress. Для использования, поместите нужные в functions.php вашей темы. Но прошу, не надо копипастить всё подряд, используйте осознано и только то, что вам действительно нужно.

Как убрать лишние теги из head

Для начала немного приберемся в head.

/* --------------------------------------------------------------------------
*  Убираем мусор из head
* -------------------------------------------------------------------------- */

// Удаляем код meta name="generator"
remove_action( 'wp_head', 'wp_generator' );

//убираем в мета rel=dns-prefetch href=//s.w.org
remove_action( 'wp_head', 'wp_resource_hints', 2 );

// Удаляем link rel="canonical"
remove_action( 'wp_head', 'rel_canonical' );

// Удаляем link rel="shortlink"
remove_action( 'wp_head', 'wp_shortlink_wp_head' );

// Удаляем link rel="wlwmanifest"
remove_action( 'wp_head', 'wlwmanifest_link' );

// Удаляем различные ссылки link rel
remove_action( 'wp_head', 'index_rel_link' ); 
remove_action( 'wp_head', 'start_post_rel_link', 10 );  
remove_action( 'wp_head', 'parent_post_rel_link', 10 ); 
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10 );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );

Как убрать Emoji из WordPress

Смайлики Emoji в WordPress подключаются как костыль – скриптом на несколько строк кода в head, и если Emoji не используются на сайте, то лучше их убрать.

/* --------------------------------------------------------------------------
* Убираем эмоджи - продолжаем избавляться от мусора в head
* -------------------------------------------------------------------------- */

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

Как избавиться от wp-json

С обновлением WordPress до версии 4.4 подъехал и REST API. Все бы ничего, но интерфейс для взаимодействия с ним доступен по ссылке http://yousite/wp-json/ и индексируется поисковыми системами, что не хорошо. Поэтому этот полезный, но пока еще сырой и не всегда и не всем нужный функционал можно отключить.

/* --------------------------------------------------------------------------
* Отключаем wp-json
* -------------------------------------------------------------------------- */

// Отключаем сам REST API
add_filter('rest_enabled', '__return_false');

// Отключаем фильтры REST API
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
remove_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );

// Отключаем события REST API
remove_action( 'init', 'rest_api_init' );
remove_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );
remove_action( 'parse_request', 'rest_api_loaded' );

// Отключаем Embeds связанные с REST API
remove_action( 'rest_api_init', 'wp_oembed_register_route');
remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );

remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );

// Редирект с wp-json на главную
add_action( 'template_redirect', function() {
if ( preg_match( '#^/wp-json/(.*)#', $_SERVER['REQUEST_URI'] ) ) {
wp_redirect( get_option( 'siteurl' ), 301 );
die();
}
} );

Отключение фидов и rss

Технология RSS позволяет пользователям подписаться на новости вашего сайта. По умолчанию RSS-канал доступен по ссылке http://yousite/feed/. Штука относительно популярная, но если у вас сайт-визитка, небольшой блог или корпоративный сайт, то полезность её сомнительна. Отключать или нет — решать вам.

function td_disable_feed() {
	wp_redirect(get_option('siteurl')); // Редирект на главную страницу сайта
}
add_action('do_feed', 'td_disable_feed', 1);
add_action('do_feed_rdf', 'td_disable_feed', 1);
add_action('do_feed_rss', 'td_disable_feed', 1);
add_action('do_feed_rss2', 'td_disable_feed', 1);
add_action('do_feed_atom', 'td_disable_feed', 1);
add_action('do_feed_rss2_comments', 'td_disable_feed', 1);
add_action('do_feed_atom_comments', 'td_disable_feed', 1);
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'rsd_link' );

Еще немного порядка

Удалим type=»text/javascript» в тегах <script> и  type=”text/css” в тегах <style>, чтобы код верстки соответствовал современному стандарту и валидаторы на него не ругались.

/* --------------------------------------------------------------------------
* удаляем type="text/javascript" в тегах <script> и 
* type=”text/css” в тегах <style>, для соответствия стандарту
* -------------------------------------------------------------------------- */
add_filter('style_loader_tag', 'td_remove_type_attr');
add_filter('script_loader_tag', 'td_remove_type_attr');
function td_remove_type_attr($src) {
	return preg_replace( "/type=['\"]text\/(javascript|css)['\"]/", '', $src );
}

Чистим заголовки ответа сервера

Безопасность это не повысит, как обещают некоторые, тем не менее нет смысла в ответе сервера размещать лишнюю информацию.

/* --------------------------------------------------------------------------
* Чистим заголовки ответа сервера
* -------------------------------------------------------------------------- */

// Удаляем link rel=shortlink
remove_action( 'template_redirect', 'wp_shortlink_header', 11 );

// Удаляем X-Powered-By
header_remove( 'x-powered-by' );