Если вы устанавливали WordPress с нуля, то замечали, что из коробки он предоставляет довольно избыточный функционал, например, вставляет в head
много лишних тегов: wp-json, xmlrpc, pingback, canonical, feed, emoji, generator, profile, wmlmanifest, link rel next и prev, и тому подобные. Большинству сайтов они ни к чему, и поэтому им стоит избавиться от лишнего хлама.
- Что такое WP JSON и как его отключить и удалить
- Отключаем WP JSON REST API с помощью плагина Disable REST API
- Код для отключения и удаления wp-json и oembed в WordPress
- Что такое XML-RPC и как его отключить и удалить
- Отключаем XML-RPC с помощью плагина Disable XML-RPC Pingback
- Код для отключения и удаления XML-RPC
- Что такое Emoji и как их отключить и удалить
- Плагин WordPress для отключения Emojis — Disable Emojis
- Код для отключения Emoji в WordPress
- Удаляем pingback, canonical, meta generator, wlwmanifest, EditURI, shortlink, prev, next, RSS, feed, profile из заголовков head
- Настроим редирект с /feed/ на главную
- Убираем CSS стили .recentcomments
- Удаляем лишний код из header.php
- Что не следует удалять из заголовков
- Что ещё пригодится при настройке WordPress
Что такое WP JSON и как его отключить и удалить
WP JSON — это сокращение от WordPress JSON REST API. Описание сложное, поэтому объясню проще — это функционал, с помощью которого для WordPress можно написать приложение на абсолютной любой платформе и на любом языке, и с помощью этого приложения управлять сайтом — добавлять, изменять и удалять содержимое, настраивать темы, меню, виджеты и прочее.
В общем, из всего этого описания вам должно быть ясно, что wp-json — пока что совершенно лишнее на вашем сайте, и его надо отключать. К тому же, Яндекс любит выкидывать wp-json
в индекс как подраздел сайта. Конечно, это лечится с помощью закрытия от индексирования /wp-json/
в robots.txt
, но, всё же, лучше отключить и настроить выдачу ошибки 404 Not Found
по этому адресу.
Что неприятно, если не закрыть
/wp-json/
, то он предоставляет возможность любым ботам вызнавать довольно конфиденциальную информацию о пользователях. Например, по такому адресуhttp://example.com/wp-json/wp/v2/users/
будет выдана информация о пользователях сайта с их личными данными: логин, email и прочее, что там указывается.Чтобы избежать выдачи информации по пользователям WordPress, не отключая WP REST API, можно воспользоваться следующим кодом:
// Отключаем функционал по пользователям в WP REST API add_filter( 'rest_endpoints', function( $endpoints ){ if ( isset( $endpoints['/wp/v2/users'] ) ) { unset( $endpoints['/wp/v2/users'] ); } if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) { unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ); } return $endpoints; });
Отключая функционал WordPress REST API, помните, что его используют некоторые популярные плагины, например Contact Form 7 и Yoast SEO. Поэтому, если вдруг у вас перестала работать форма обратной связи, посмотрите, а не отключен ли REST API?
Есть 2 способа избавиться от wp-json, плагин и код.
Отключаем WP JSON REST API с помощью плагина Disable REST API
Для отключения wp-json
можно воспользоваться плагином Disable REST API, так как его автор будет поддерживать код в актуальном состоянии в зависимости от возможных изменений в будущих версиях движка WordPress.
Скачать плагин Disable REST API из официального репозитория WordPress.org
Плагин, конечно, функционал JSON REST API отключит, но вот от раздела /wp-json/
на сайте не избавит. Поэтому, этот вариант немного не то, что нам надо. Идём дальше.
Код для отключения и удаления wp-json и oembed в WordPress
Код взят из разных источников, в основном отсюда, и в том числе, и из вышеуказанного плагина
/* * Отключаем wp-json * * https://sheensay.ru/?p=2044 */ // Отключаем WP-API версий 1.x add_filter( 'json_enabled', '__return_false' ); add_filter( 'json_jsonp_enabled', '__return_false' ); // Отключаем WP-API версий 2.x add_filter( 'rest_enabled', '__return_false' ); add_filter( 'rest_jsonp_enabled', '__return_false' ); // Удаляем информацию о REST API из заголовков HTTP и секции head remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); remove_action( 'wp_head', 'rest_output_link_wp_head', 10 ); remove_action( 'template_redirect', 'rest_output_link_header', 11 ); // Отключаем фильтры REST API remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' ); 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 ); // Убираем oembed ссылки в секции head remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); // Если собираетесь выводить oembed из других сайтов на своём, то закомментируйте следующую строку remove_action( 'wp_head', 'wp_oembed_add_host_js' ); // Редиректим со страницы /wp-json/ на главную add_action( 'template_redirect', function() { if ( preg_match( '#\/wp-json\/.*?#', $_SERVER['REQUEST_URI'] ) ) { wp_redirect( get_option( 'siteurl' ), 301 ); die(); } } );
Код вставляется в functions.php или mu-plugin (желательно).
Результат: вы полностью отключите механизм wp-json на сайте, в поиске будут отсутствовать мусорные страницы, а страница
http://example.com/wp-json/
будет отдавать ошибку 404 Not Found
Что такое XML-RPC и как его отключить и удалить
XML-RPC — это протокол вызова процедур, использующий XML для кодирования сообщений и HTTP как транспортный механизм. Проще говоря, это API для WordPress, с помощью которого можно удалённо управлять данными сайта.
Не напоминает WP JSON REST API? Так и есть, xmlprc — его предок, который используется WordPress в текущее время. Почему один замещают другим — возможно, ответ кроется в громоздкости формата XML по сравнению с JSON. Да и не особо это важно в свете текущей статьи. Главное — как избавиться от xmlrpc, не навредив сайту.
Просто удалить файл xmlrpc.php
из корня сайта нельзя — им пользуются некоторые популярные плагины навроде JetPack.
Чтобы решить вопрос верно, вы можете воспользоваться 2 вариантами: плагином или кодом.
Отключаем XML-RPC с помощью плагина Disable XML-RPC Pingback
Если сайт на WordPress сильно тормозит, и Вы не понимаете, почему, советую заглянуть в логи ошибок сервера и изучить их:
[error] error connect() to unix:/var/www/php-fpm/www.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 100.200.300.400, server: example.com, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/www/php-fpm/bitfeed.sock:", host: "193.1.65.238"Обратите внимание на
POST /xmlrpc.php
. Если она присутствует и часто появляется, значит, сайт атакуют, и нужно срочно закрывать XML-RPC.
Полностью XML-RPC отключать нельзя — им пользуются некоторые плагины. Но некоторые методы, позволяющие проводить атаки на сайты, предупредить можно. И в этом помогает плагин Disable XML-RPC Pingback.
Скачать плагин Disable XML-RPC Pingback из официального репозитория WordPress.org
Код плагина также состоит из пары фильтров и функций, которые я опишу в следующем пункте. И, опять же, рекомендую пользоваться этим плагином, так как его автор будет следить за обновлениями.
Код для отключения и удаления XML-RPC
Если вам интересно увидеть сам код, отключающий опасные методы XML-RPC, или просто не хочется ставить лишние плагины, можете воспользоваться кодом ниже
/* * Удаляем опасные методы работы XML-RPC Pingback * * https://sheensay.ru/?p=2044 */ add_filter( 'xmlrpc_methods', 'sheensay_block_xmlrpc_attacks' ); function sheensay_block_xmlrpc_attacks( $methods ) { unset( $methods['pingback.ping'] ); unset( $methods['pingback.extensions.getPingbacks'] ); return $methods; } add_filter( 'wp_headers', 'sheensay_remove_x_pingback_header' ); function sheensay_remove_x_pingback_header( $headers ) { unset( $headers['X-Pingback'] ); return $headers; }
Также, существует способ полностью выключить XML-RPC с помощью следующего фильтра, но не рекомендую использовать его, так как он нужен для JetPack и похожих плагинов.
// Не рекомендую использовать, т.к. несовместимо с плагином JetPack и подобными add_filter('xmlrpc_enabled', '__return_false');
Результат: отключили опасные методы работы механизма XML-RPC для WordPress
Что такое Emoji и как их отключить и удалить
С версии WordPress 4.2 в дистрибутив этой CMS был встроен функционал Emoji. Эмоджи — это набор иконок и смайликов, реализованные в Вордпрессе с помощью библиотеки Twemoji от Twitter, и сами по себе неплохи. Если у вас развлекательный сайт или блог, в котором они будут уместны, стоит задуматься, удалять ли их с сайта. Но большинству остальных сайтов, что не используют данный функционал, стоит устранить его, так как смайлики Emoji в WordPress подгружаются с внешних серверов WordPress.org
, да и лишний код в head
ни к чему.
Есть 2 способа отключить Emoji, отдельным плагином и просто кодом, причём оба имеют право на жизнь.
Плагин WordPress для отключения Emojis — Disable Emojis
Можно обойтись простым плагином Disable Emojis. Не надо его бояться, он не содержит лишних настроек, лишь пару фильтров, код которых, по сути, мы и дублируем к себе в следующем пункте.
В чём преимущество плагинов — их авторы, как правило, следят за обновлениями WordPress и вносят необходимые коррективы в функционал своих плагинов, выпуская обновления, в отличие от нас с вами :) Поэтому, я бы рекомендовал воспользоваться текущим вариантом.
Скачать плагин Disable Emojis из официального репозитория WordPress.org
Учтите, что плагин не вносит изменения в базу данных, которая с версии WordPress 4.2 имеет формат кодировки utf8mb4
, что подразумевает под собой возможность сохранять сами знаки emoji в страницах и записях независимо от наличия или отсутствия Disable Emojis на сайте. При этом, смайлики emoji будут отображаться только в самых современных браузерах.
Код для отключения Emoji в WordPress
Ниже представлен набор фильтров и хуков (экшнов), который сможет отключить Emoji и избавит от ненужного хлама в head
. Код полностью скопирован из вышеуказанного плагина, и я настоятельно рекомендую пользоваться именно плагином, ибо его автор будет следить за обновлениями, в отличие от меня :)
/* * Отключаем emoji * * https://sheensay.ru/?p=2044 */ add_action( 'init', 'sheensay_disable_emojis' ); function sheensay_disable_emojis() { remove_action( 'wp_head', 'print_emoji_detection_script', 7 ); remove_action( 'wp_print_styles', 'print_emoji_styles' ); remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); 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', 'sheensay_disable_emojis_tinymce' ); add_filter( 'wp_resource_hints', 'sheensay_disable_emojis_remove_dns_prefetch', 10, 2 ); } function sheensay_disable_emojis_tinymce( $plugins ) { if ( is_array( $plugins ) ) { return array_diff( $plugins, array( 'wpemoji' ) ); } else { return array(); } } function sheensay_disable_emojis_remove_dns_prefetch( $urls, $relation_type ) { if ( 'dns-prefetch' == $relation_type ) { /** This filter is documented in wp-includes/formatting.php */ $emoji_svg_url = apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/2.2.1/svg/' ); $urls = array_diff( $urls, array( $emoji_svg_url ) ); } return $urls; }
Код вставляется в functions.php или mu-plugin (желательно).
Результат: удалён вывод javascript-кода поддержки emoji в секции head. Но здесь то же самое, что и с плагином — emoji сохранять в постах можно, но отображаться они теперь будут не во всех браузерах, а только тех, что их поддерживают (как правило, в самых современных).
Удаляем pingback, canonical, meta generator, wlwmanifest, EditURI, shortlink, prev, next, RSS, feed, profile из заголовков head
/* * Удаляем остальные ненужные meta из head * * https://sheensay.ru/?p=2044 */ // Удаляем код meta name="generator" remove_action( 'wp_head', 'wp_generator' ); // Удаляем link rel="canonical" // Этот тег лучше выводить с помощью плагина Yoast SEO или All In One SEO Pack remove_action( 'wp_head', 'rel_canonical' ); // Удаляем link rel="shortlink" - короткую ссылку на текущую страницу remove_action( 'wp_head', 'wp_shortlink_wp_head' ); // Удаляем link rel="EditURI" type="application/rsd+xml" title="RSD" // Используется для сервиса Really Simple Discovery remove_action( 'wp_head', 'rsd_link' ); // Удаляем link rel="wlwmanifest" type="application/wlwmanifest+xml" // Используется Windows Live Writer 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 ); // Удаляем вывод /feed/ remove_action( 'wp_head', 'feed_links', 2 ); // Удаляем вывод /feed/ для записей, категорий, тегов и подобного remove_action( 'wp_head', 'feed_links_extra', 3 ); // Удаляем ненужный css плагина WP-PageNavi remove_action( 'wp_head', 'pagenavi_css' );
Настроим редирект с /feed/ на главную
По поводу /feed/
. Если вы хотите дополнительно добавить редирект с http://example.com/feed/
на главную страницу, можете добавить следующий код
/* * Настраиваем редирект со страницы rss /feed/ на главную * * https://sheensay.ru/?p=2044 */ add_action( 'do_feed', 'sheensay_redirect_feed', 1 ); add_action( 'do_feed_rdf', 'sheensay_redirect_feed', 1 ); add_action( 'do_feed_rss', 'sheensay_redirect_feed', 1 ); add_action( 'do_feed_rss2', 'sheensay_redirect_feed', 1 ); function sheensay_redirect_feed() { wp_redirect( site_url('/') ); exit; }
Если вы пользуетесь Feedburner, добавляете изменения в .htaccess
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^/?(feed.*|comments.*) [NC] RewriteCond %{HTTP_USER_AGENT} !^.*(FeedBurner|FeedValidator) [NC] RewriteRule .* http://feeds.feedburner.com/sheensay [L,NC,R=302] </IfModule>
Убираем CSS стили .recentcomments
Если вы пользуетесь виджетом Последние комментарии, то WordPress для него пропишет в коде стили css с классом .recentcomment
, которые довольно сложно перебить своими. Чтобы не бодаться с этой проблемой, пользуемся следующим кодом
/* * Удаляем стили css-класса .recentcomments * * https://sheensay.ru/?p=2044 */ add_action( 'widgets_init', 'sheensay_remove_recent_comments_style' ); function sheensay_remove_recent_comments_style() { global $wp_widget_factory; remove_action( 'wp_head', array( $wp_widget_factory -> widgets['WP_Widget_Recent_Comments'], 'recent_comments_style' ) ); }
Далее, перейдём к очистке header.php
Удаляем лишний код из header.php
Если в вашей теме WordPress есть header.php
, откройте его в любой программе с подсветкой синтаксиса, например Notepad++ или Far Manager.
В секции head
найдите лишний код и удалите его.
Например, на скрине я выделил код:
<link rel="profile" href="http://gmpg.org/xfn/11"> <link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">
В 1 строке — это заголовок, указывающий на то, что на странице используется микроформат XFN. Если вы его не используете (а это, скорее всего, так) — удаляйте.
Во 2 строке — это ссылка, указывающая, по какому адресу оставлять пингбеки. Их мы не позволяем оставлять, поэтому удаляем код.
Кстати, не забудьте проверить, отключены ли у вас пингбеки. Для этого, зайдите в админку в Настройки — Обсуждение (
https://example.com/wp-admin/options-discussion.php
) и убедитесь в том, что галочкой не отмечен пункт Разрешить оповещения с других блогов (уведомления и обратные ссылки) на новые статьи
Таким же методом можно удалить и другой код, который не удалился с помощью фильтров, например
<link rel="alternate" type="application/rss+xml" title="Лента" href="/feed" /> <link rel="alternate" type="application/rss+xml" title="Лента комментариев" href="/comments/feed" /> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="/xmlrpc.php?rsd" /> <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="/wp-includes/wlwmanifest.xml" />
Не забывайте делать резервные копии изменяемых файлов, чтобы откатить всё назад, если удалили лишнего
По сути, всё, что должно остаться в head в header.php, это что-то примерно следующего содержания
<!DOCTYPE html> <html <?php language_attributes(); ?>> <head> <meta charset="<?php bloginfo( 'charset' ); ?>"> <meta name="viewport" content="width=device-width, initial-scale=1"> <?php wp_head(); ?> </head>
Что не следует удалять из заголовков
Некоторые советуют также удалять dns-prefetch:
// Удаляет link rel='dns-prefetch' href='//v0.wordpress.com' remove_action( 'wp_head', 'wp_resource_hints', 2 );
Я бы не стал этого делать, потому что dns-prefetch призван ускорить загрузку страниц со внешних источников, а точнее, ресурсов, которые на них располагаются. По адресам, указанным в dns-prefetch
, браузер будет делать предварительный резолв, что на медленном интернете может показать себя особенно хорошо.
На этом чистка закончена. Далее пройдёмся по дополнительным пунктам настройки, которые могут пригодиться.
Что ещё пригодится при настройке WordPress
Далее, список советов, что нужно использовать ещё, чтобы оптимизировать работу сайта:
- Автоматическая простановка заголовка Last-Modified
- Настройка кеширующего плагина WP Super Cache
- EWWW Image Optimizer — плагин для сжатия png, jpeg, gif изображений без потери качества
- Автоматическое проставление атрибута alt. Используем SEO Friendly Images. Плагин не обновлялся уже 2 года, однако, до сих пор исправно работает и пользуется популярностью. Я лично не считаю этот пункт крайней необходимостью, так как у каждого изображения должен быть прописан уникальный alt, а не взят тот, что в названии статьи, но, возможно, кому-то этот пункт покажется важным.
- Редирект с https на http. Лучше, когда редиректом занимается сервер, а не WordPress, тем самым мы снимаем ненужную нагрузку на систему.
Изменения добавляем в.htaccess
в корне сайта, в самое начало файла<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} ^443$ [OR] RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] </IfModule>
http://example.com
меняете на свой.
Свежие комментарии