Seo-оптимизация WordPress

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

Так как WordPress разрабатывался для широкого круга задач, далеко не все функции "из коробки" нужны и полезны. Давайте рассмотрим какие из них стоит отключить и как это сделать.

Для ненужных функций я использую методы отключения в таком приоритете:

  1. Если возможно, то через интерфейс админки
  2. если нет, то с помощью кода в файле темы functions.php
  3. Есть такие ситуации, когда так отключить что-то нельзя, либо я не могу найти решение как это сделать. Тогда можно поставить плагин, решающий проблему.
  4. На самый крайний случай оставляю - менять код в движке, так как после обновления эти файлы могут замениться на новые.

Если открыть код, то часто в теге <head></head> можно увидеть не понятные многим теги. (Полный код для удаления сразу всего - в конце статьи).

Как удалить Pingback?

<link rel='pingback' href='http://domain.ru/xmlrpc.php' /> - это функция, позволяет узнавать кто поставил на Вас ссылку. А также оповещает блоги, если появляется ссылка на их страницу. Работает это таким образом, что оповещение появляется в виде автоматического комментария к Вашей статье. Эту функцию надо отключать по следующим причинам:

  • она нагружает сервер, из-за нее сайт может подвисать
  • в коде есть ссылка на которую не возвращается ответ, а значит она может рассматриваться поисковиком как битая
  • сайт может использоваться для DDOS-атаки (ссылка на Хабрахабр)

Отключить можно тремя способами: в настройках, плагином, кодом. Рекомендую снять галочки в админке: Настройки -> Обсуждение -> Две верхние со скриншота

Dns prefetch что это?

<link rel='dns-prefetch' href='*' /> - dns-prefetch проверяет наличие домена в сети и переводит его в вид ip адреса. Это может ускорить загрузку страницы в тех случаях, когда часть файлов загружается со сторонних ресурсов (в т.ч. CDN). Например jquery, css/js файлы Bootstrap, шрифты Google или другие библиотеки.

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

Отключается dns-prefetch строчкой remove_action( 'wp_head', 'wp_resource_hints', 2);

Как удалить мета тег generator?

<meta name="generator" content="WordPress 4.9.8" /> - сообщает о том в какой программе создан контент. Это может быть не только CMS, некоторые редакторы кода, например Microsoft FrontPage или DreamWeaver тоже могут его добавлять. Удаляем кодом remove_action('wp_head', 'wp_generator');

Удаляем wlwmanifest

<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://site.ru/wp-includes/wlwmanifest.xml" /> позволяет публиковать статьи используя Windows Live Writer. Это программа от Microsoft, из которой можно делать публикации не заходя в админку сайта. Если вы не пользуетесь ею, то удалить можно строчкой remove_action('wp_head', 'wlwmanifest_link');

Удалить rsd_link

Мета тег выглядит так <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://zapchasti-kotla.loc/xmlrpc.php?rsd" /> - нужен для публикации через блог-клиенты. Если не пользуетесь, то удалить можно удалять: remove_action('wp_head', 'rsd_link');

Убрать RSS-ленты

Нужны ли они - вопрос спорный. Я часто удаляю RSS ленты, но решать вам. Это можно сделать следующим кодом:

// Удаляем RSS ленту
function fb_disable_feed() {
  wp_redirect(get_option('siteurl'));//будет осуществляться редирект на главную страницу
}
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);
add_action('do_feed_rss2_comments', 'fb_disable_feed', 1);
add_action('do_feed_atom_comments', 'fb_disable_feed', 1);
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );

Отключаем REST API

Я не рекомендую это делать, потому что многие плагины его используют. В описании плагина может не упоминаться, что он используется. Про REST API есть много статей и если вы точно не используете этот функционал, то его можно отключить. Если которотко, то это возможность получать данные из базы данных с других доменов. Например, можно вести блог и выводить на другом сайте (например интернет-магазине) записи из этого блога. Отключить его можно следующим кодом:

// Отключаем сам 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 );

Также я удаляю фильтр-автоподстановку тегов параграфа, удаляю автоподстановку размера изображений, emoji. В некоторых случаях можно удалить rel="canonical" и rel="shortlink". Публикую полный код с комментариями, можно взять только то, что нужно для решения вашей задачи:

Полный код для вставки в functions.php

// Отключаем сам 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' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );

remove_filter( 'the_content', 'wptexturize' ); /* убираем авотдобавление параграфиов */
remove_action( 'wp_head', 'wp_resource_hints', 2 ); /* удаляем dns-prefetch */

// Удаляем автоподстановку размера картинок
function remove_thumbnail_dimensions( $html ) {
  $html = preg_replace( '/(width|height)=\"\d*\"\s/', "", $html );
  return $html;
}
add_filter( 'post_thumbnail_html', 'remove_thumbnail_dimensions', 10 );
add_filter( 'image_send_to_editor', 'remove_thumbnail_dimensions', 10 );

// убираем emoji
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

// Убираем мусор из шапки
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');

/* удаляем shortlink и canonical */
remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0 );

// Убираем RSS
function fb_disable_feed() {
  wp_redirect(get_option('siteurl'));
}
 
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);
add_action('do_feed_rss2_comments', 'fb_disable_feed', 1);
add_action('do_feed_atom_comments', 'fb_disable_feed', 1);
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );

/* Сброс фильтра для html в описании категории */
remove_filter('pre_term_description', 'wp_filter_kses');
remove_filter('pre_term_description', 'wp_kses_data');