Статьи

WordPress и SEO: технический чек-лист для бизнеса, который устал от плагинов

Сайт на WordPress тормозит на мобильных, PageSpeed Insights рисует жёлто-красную шкалу Core Web Vitals, а позиции в Яндексе и Google просели после очередного обновления. В разделе «Установленные плагины» уже не двадцать, а тридцать с лишним модулей: Yoast SEO или Rank Math для мета-тегов, WP Rocket или LiteSpeed Cache для кеширования, Smush или ShortPixel для картинок, Wordfence для безопасности, WPForms для форм, Elementor для «удобного» редактора. Каждый модуль по отдельности выглядит безобидно, но в сумме они формируют «плагинный ад» — от десятков JS-скриптов на фронтенде, раздутой базы MySQL и перегруженного wp_head. Владелец бизнеса платит за это конверсией, скоростью и стоимостью каждого привлечённого лида.

Ваш сайт на WordPress тормозит, а поисковый трафик не растёт? Не закрывайте глаза на технические ошибки — закажите технический SEO-аудит WordPress-сайта в «Калинин Студио».

Раздел 1. Почему подход «поставь ещё один плагин» убивает SEO сайта на Wordpress и скорость загрузки

WordPress — это конструктор, в котором 80% проблем рождается не в ядре CMS, а в слое активных модулей. Модульность — это и сила, и ахиллесова пята платформы. Каждый активный плагин запускает собственный init-хук, регистрирует обработчики на wp_head, wp_footer, REST API и wp_enqueue_scripts. Чем больше хуков, тем длиннее цепочка исполнения на каждом запросе.

Технические последствия перегруза выглядят так:

  • TTFB (Time To First Byte) растёт из-за каскадной инициализации модулей на уровне PHP и серии запросов к таблице wp_options со значением autoload='yes'. Для бизнеса это лишние 400–900 мс до первого байта и минус 7–14% конверсии на мобильных устройствах.
  • LCP и INP проседают из-за переизбытка стороннего JavaScript: рекламные пиксели, плагины чатов, аналитика, слайдеры, конструкторы форм на Elementor. PageSpeed Insights показывает рекомендации «Reduce unused JavaScript» и «Eliminate render-blocking resources».
  • Дублируется контент, потому что Yoast или Rank Math корректно работают только при последовательной настройке. Конфликты между All in One SEO и Rank Math — реальная клиническая картина, с которой приходят на технический аудит.
  • База данных MySQL разрастается до сотен мегабайт, потому что плагины пишут свои таблицы, логи, транзиенты и мета-данные без очистки. Самые тяжёлые — wp_options.autoload, wp_postmeta, wp_termmeta и wp_actionscheduler_actions в WooCommerce.

Сравнение подходов — в таблице ниже. Она же задаёт тон всему чек-листу и показывает, почему SEO Wordpress без плагинов — это не идеализм, а инженерная гигиена.

SEO-задача Стандартный путь (плагин) Инженерный путь «Калинин Студио» Бизнес-результат
Title, Description, Meta Robots Yoast/Rank Math плюс боковая панель PHP-класс через add_theme_support('title-tag') + wpseo фильтры или собственный шаблон header.php Минус 2 JS, минус 12 SQL-запросов на страницу, +3–6 позиции в Яндексе
XML Sitemap Плагин Google XML Sitemaps или модуль в Yoast Статическая генерация через wp_sitemaps PHP 8.0+ либо кастомный скрипт Карта отдаётся за <50 мс, не зависит от плагина
Schema.org JSON-LD Модули Schema Pro или встроенный блок Yoast Чистый JSON-LD через wp_footer или wp_head, генерация на PHP из данных записей Сниппеты «звёзды», FAQ, цена — без стороннего JS
Robots.txt Настройка в админке SEO-плагина Файл robots.txt в корне + wp_robots фильтр для динамических правок Контролируемая индексация, нулевой риск случайного Disallow: /
Кеширование WP Rocket / LiteSpeed Cache Nginx FastCGI Cache + Redis Object Cache + Brotli на уровне сервера TTFB 80–200 мс вместо 700–1200 мс
Оптимизация wp_head Надежда на «чистую тему» Десятки remove_action для wp_head + отключение emoji, embeds, dns-prefetch, REST API link Минус 30–70 КБ мусорного HTML-кода в <head>
Микроразметка WooCommerce Платные модули Schema for WooCommerce Кастомный JSON-LD + правильная работа с rel=canonical на страницах фильтров Сниппеты с ценой, наличием, рейтингом в выдаче

Раздел 2. Серверный уровень и оптимизация инфраструктуры Wordpress для SEO

2149231597.jpg

Прежде чем лезть в functions.php, нужно убедиться, что фундамент инфраструктуры выдерживает нагрузку. Никакой плагин не компенсирует слабый сервер и неактуальную версию PHP.

Версия PHP. Минимум — PHP 8.1, идеально — PHP 8.3. WordPress 6.5+ официально поддерживает PHP 8.x и работает на 8.3 на 15–30% быстрее, чем на 7.4. Дополнительно включается OPcache с агрессивными параметрами:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.fast_shutdown=1

Веб-сервер. Nginx + php-fpm — стандарт для коммерческих проектов. Apache с mod_php нагружает каждый запрос памятью всего интерпретатора, поэтому под нагрузкой TTFB деградирует. Переход на Nginx даёт устойчивость под 100–300 одновременных соединений с одним ядром CPU.

Сжатие. Включение Brotli на уровне Nginx важнее, чем любое «сжатие» через плагин:

brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/javascript application/json application/xml image/svg+xml;

Brotli сжимает HTML, CSS и JS на 18–25% эффективнее Gzip.

Object Cache через Redis. Это ключевой слой ускорения: WordPress по умолчанию читает настройки из wp_options, и они тянутся из MySQL на каждом запросе. Redis заменяет это на хранение в оперативной памяти:

# В wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_CLIENT', 'phpredis');
define('WP_REDIS_PREFIX', 'mysite:');
define('WP_CACHE', true);

HTTP/2 и HTTP/3. Параллельная загрузка скриптов и картинок. Если хостер не поддерживает HTTP/3 — это повод задуматься о смене площадки.

Раздел 3. Очистка wp_head и отключение лишнего функционала через functions.php

Ядро WordPress и десятки модулей добавляют в <head> мусор, который не нужен ни поисковикам, ни пользователям, ни фронтенду: стили для emoji, скрипты для встраивания Embeds, dns-prefetch для неиспользуемых доменов, анонимный REST API link. За два–три года жизни сайта <head> разрастается до 30–70 КБ кода, который парсится на каждой загрузке.

Готовые хуки для functions.php. Перед вставкой — резервная копия файла:

// 1. Удаляем RSS-фиды, если они не нужны (для лендингов и каталогов)
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'feed_links_extra', 3);

// 2. Удаляем ссылку на RSD и manifest, оставшиеся от xmlrpc
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');

// 3. Удаляем короткую ссылку
remove_action('wp_head', 'wp_shortlink_wp_head');

// 4. Удаляем Emoji-скрипты и стили (экономия 8 КБ JS + 4 КБ CSS)
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');

// 5. Удаляем oEmbed-скрипты и discover-link
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);

// 6. Отключаем wp-json link в head, если не нужны публичные REST-запросы
remove_action('wp_head', 'rest_output_link_wp_head', 10);
remove_action('wp_head', 'wp_resource_hints', 2);
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10);

// 7. Disable WP Block Library CSS на фронтенде (если используется классический редактор)
add_action('wp_enqueue_scripts', function() {
    wp_dequeue_style('wp-block-library');
    wp_dequeue_style('wp-block-library-theme');
    wp_dequeue_style('wc-block-style');
}, 100);

// 8. Удаляем meta-поле generator из RSS-фидов
add_filter('the_generator', '__return_empty_string');

// 9. Отключаем комментарии полностью, если они не нужны (для каталогов и лендингов)
add_action('wp_loaded', function() {
    if (is_admin()) return;
    remove_action('wp_head', 'comments_rss2_head');
    wp_deregister_script('comment-reply');
});

// 10. Удаляем Global Styles и SVG-дублирование из Gutenberg, если редактор не используется
remove_action('wp_enqueue_scripts', 'wp_enqueue_global_styles');
remove_action('wp_footer', 'wp_enqueue_global_styles', 1);

Эти десять хуков убирают ~40 КБ шума из <head>. Для коммерческих сайтов со сложной вёрсткой — это минус 80–150 мс к LCP на 3G-мобильных.

Раздел 4. Устранение дублей и управление индексацией

Дубли — главный враг SEO сайта на Wordpress. Яндекс склеивает их в кластеры, Google выбирает canonical и теряет сигналы. Поисковики видят десятки версий одной страницы, и краулинговый бюджет тратится на мусор.

Источники дублей, которые создают плагины:

  • Архивы по датам: /2024/03/, /2024/03/15/;
  • Архивы по авторам: /author/admin/;
  • Архивы по тегам и категориям без уникального контента;
  • Страницы вложений: /wp-content/uploads/2024/03/file/;
  • Трекбеки и пинкбеки — отдельные URL;
  • Пагинация /page/2/, /page/3/ — без корректного rel="canonical";
  • Версии со слешем и без на конце;
  • Канонические атрибуты товаров WooCommerce без сортировки и фильтров.

Robots.txt для типового бизнес-сайта — закрываем служебные зоны и дубли:

User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/plugins/
Disallow: /wp-content/cache/
Disallow: /wp-json/
Disallow: /xmlrpc.php
Disallow: /readme.html
Disallow: /?s=
Disallow: /search/
Disallow: /author/
Disallow: /*/feed/
Disallow: /trackback/
Disallow: /embed/
Allow: /*.css
Allow: /*.js
Allow: /*.png
Allow: /*.jpg
Allow: /*.svg
Sitemap: https://kalinin.pro/sitemap.xml

Канонические URL. На архивах таксономий с пагинацией canonical должен вести на первую страницу без /page/2/, либо на текущую, если это осмысленная страница с уникальным контентом. В код добавляется так:

// Канонизация архивов таксономий (категории, теги, авторы)
add_filter('wpseo_canonical', '__return_false');

add_action('wp_head', function() {
    if (is_tax() || is_tag() || is_category() || is_author()) {
        $paged = (int) get_query_var('paged');
        if ($paged > 1) {
            $base = get_term_link(get_queried_object());
            echo '<link rel="canonical" href="' . esc_url($base) . '" />' . "\n";
            return;
        }
    }
    if (is_singular()) {
        echo '<link rel="canonical" href="' . esc_url(get_permalink()) . '" />' . "\n";
    }
}, 1);

Sitemap.xml. С версии WordPress 5.5 появился нативный wp_sitemaps. Используйте его, отключив аналоги от плагинов:

// Отключаем лишние типы записей из карты
add_filter('wp_sitemaps_post_types', function($post_types) {
    unset($post_types['attachment']);
    return $post_types;
});

// Отключаем таксономии авторов и архивов, если они не нужны
add_filter('wp_sitemaps_taxonomies', function($taxonomies) {
    return $taxonomies; // оставляем category и post_tag
});

// Делим sitemap на куски по 500 URL — снижает TTFB карты
add_filter('wp_sitemaps_max_urls', function() { return 500; });

Wp-cron. Встроенный WP-Cron запускается при каждом запросе и подвешивает админку. Замените его системным cron через crontab -e:

*/5 * * * * curl -s -o /dev/null https://kalinin.pro/wp-cron.php?doing_wp_cron

И запретите запуск встроенного:

// в wp-config.php
define('DISABLE_WP_CRON', true);

Раздел 5. Нативная микроразметка Schema.org и мета-теги на уровне кода

2151922456.jpg

Для SEO-оптимизации Wordpress критически важны структурированные данные: Article, FAQPage, Product, Organization, BreadcrumbList. Часть из них Яндекс учитывает в сниппетах, Google — в расширенных результатах. Плагины ставят JSON-LD, но добавляют 60–120 КБ JS для динамической генерации. Нативный код — легче и стабильнее.

Article + Organization для всех страниц:

add_action('wp_head', function() {
    $schema = [
        '@context' => 'https://schema.org',
        '@graph' => []
    ];

    // Organization
    $schema['@graph'][] = [
        '@type' => 'Organization',
        'name'  => get_bloginfo('name'),
        'url'   => home_url('/'),
        'logo'  => [
            '@type' => 'ImageObject',
            'url'   => get_site_icon_url(512)
        ],
        'sameAs' => array_values(array_filter([
            get_option('twitter_url'),
            get_option('facebook_url'),
            get_option('instagram_url'),
            get_option('youtube_url'),
            get_option('vk_url')
        ]))
    ];

    // Article — только на одиночных записях
    if (is_singular('post')) {
        global $post;
        $schema['@graph'][] = [
            '@type'         => 'Article',
            'headline'       => get_the_title(),
            'datePublished'  => get_the_date('c'),
            'dateModified'   => get_the_modified_date('c'),
            'author'         => [
                '@type' => 'Person',
                'name'  => get_the_author_meta('display_name', $post->post_author)
            ],
            'publisher'      => [
                '@type' => 'Organization',
                'name'  => get_bloginfo('name'),
                'logo'  => [
                    '@type' => 'ImageObject',
                    'url'   => get_site_icon_url(512)
                ]
            ],
            'mainEntityOfPage' => get_permalink(),
            'image' => get_the_post_thumbnail_url($post, 'full')
        ];
    }
    echo '<script type="application/ld+json">' . wp_json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</script>' . "\n";
});

FAQ JSON-LD — для страниц с вопросами-ответами:

add_action('wp_head', function() {
    if (is_page('voprosy')) {
        $faqs = [
            ['q' => 'Нужен ли Yoast SEO для wordpress seo?',
             'a' => 'Не обязателен. Yoast добавляет 50+ JS-скриптов и SQL-запросов. Нативный код легче и безопаснее.'],
            ['q' => 'Сколько плагинов допустимо?',
             'a' => 'Для типового бизнес-сайта — 5–8. Каждый — отдельный хук на wp_head, wp_footer, rest_api_init.'],
            ['q' => 'Как проверить Core Web Vitals?',
             'a' => 'PageSpeed Insights, CrUX в Google Search Console, Lighthouse в DevTools, WebPageTest для стресс-тестов.']
        ];
        $schema = [
            '@context' => 'https://schema.org',
            '@type'    => 'FAQPage',
            'mainEntity' => array_map(function($row) {
                return [
                    '@type' => 'Question',
                    'name'  => $row['q'],
                    'acceptedAnswer' => [
                        '@type' => 'Answer',
                        'text'  => $row['a']
                    ]
                ];
            }, $faqs)
        ];
        echo '<script type="application/ld+json">' . wp_json_encode($schema, JSON_UNESCAPED_UNICODE) . '</script>' . "\n";
    }
});

Раздел 6. Core Web Vitals, Image Optimization, Heartbeat API

LCP (Largest Contentful Paint). Главный враг — неоптимизированные фоновые изображения и текст, заблокированный шрифтами. Чек-лист:

  • Перевод WEBP/AVIF: изображения >30 КБ конвертируются в image/webp или image/avif. Serve через Nginx:
    map $http_accept $webp_suffix {
        default   "";
        "~*webp"  ".webp";
    }
            
  • Подключение font-display: swap для шрифтов Google Fonts (если они используются).
  • Исключение render-blocking JS: critical CSS инлайнится, остальное — defer или async.

CLS (Cumulative Layout Shift). Причины:

  • Картинки без фиксированной ширины и высоты (width/height обязательно);
  • Динамическая вставка блоков рекламы и виджетов;
  • Шрифты, загружаемые после первого рендера;
  • Поздняя загрузка iframe (YouTube-вставки).

CSS-фикс для типового случая:

img, video, iframe { display:block; max-width:100%; height:auto; }
iframe { aspect-ratio: 16 / 9; width:100%; border:0; }

INP (Interaction to Next Paint). С 2024 года заменил FID. Главный враг — длинные задачи в main thread. Укрощение:

// Heartbeat API: снижаем частоту и отключаем на фронтенде
add_action('init', function() {
    wp_deregister_script('heartbeat');
}, 1);

add_filter('heartbeat_settings', function($settings) {
    $settings['interval'] = 60; // секунды вместо 15 по умолчанию
    $settings['autostart'] = false;
    return $settings;
});

// Ограничиваем Heartbeat только в редакторе записей
add_action('wp_enqueue_scripts', function() {
    if (!is_admin()) {
        wp_deregister_script('heartbeat');
    }
});

Изображения. Конвертация в WebP/AVIF, lazy-loading через loading="lazy" для всего, что ниже первого экрана, обязательное fetchpriority="high" для LCP-картинки.

Remove query strings. Static resources с ?ver=... тянут 304-ответы без кеширования. Убираем через:

// Удаляем версионные query strings у статических ресурсов
add_filter('style_loader_src', function($src) {
    return remove_query_arg('ver', $src);
}, 10, 1);
add_filter('script_loader_src', function($src) {
    return remove_query_arg('ver', $src);
}, 10, 1);

Раздел 7. WooCommerce: SEO сайта Вордпресс для интернет-магазина

WooCommerce добавляет ~30–60 SQL-запросов на страницу каталога, отдельные таблицы (wp_wc_orders, wp_wc_order_stats, wp_actionscheduler_actions), а ещё — собственные дубли:

  • Фильтры ?filter_color=blue&filter_size=m без canonical дают тысячи дублей;
  • Сортировки ?orderby=price_desc индексируются как новые страницы;
  • Пагинация /shop/page/2/ генерирует дополнительный кластер;
  • Карточки вариаций товара без canonical;
  • Архивы атрибутов (/pa_razmer/, /pa_cvet/) — часто малоценные;
  • Сравнения товаров (если включены плагином YITH/WooCommerce Compare);
  • Страницы «Поделиться», Wishlist без noindex.

Канонизация фильтров и сортировок:

// WooCommerce: убираем сортировки из canonical и закрываем от индексации
add_action('init', function() {
    if (is_admin()) return;
    if (isset($_GET['orderby']) || isset($_GET['filter_']) || isset($_GET['filter_'])) {
        header('X-Robots-Tag: noindex, follow', true);
    }
});

// К каноникалу каталога добавляем только базовый URL без фильтров
add_filter('wpseo_canonical', '__return_false');

add_action('wp_head', function() {
    if (is_shop() || is_product_taxonomy()) {
        $base = (is_shop())
            ? wc_get_page_permalink('shop')
            : get_term_link(get_queried_object());
        echo '<link rel="canonical" href="' . esc_url($base) . '" />' . "\n";

        if (is_paged()) {
            echo '<link rel="prev" href="' . esc_url(pagenum_link(1)) . '" />' . "\n";
        }
    }
}, 5);

Schema.org Product для WooCommerce:

add_action('wp_footer', function() {
    if (!is_product()) return;
    global $product;
    if (!$product instanceof WC_Product) return;

    $data = [
        '@context' => 'https://schema.org',
        '@type'    => 'Product',
        'name'     => $product->get_name(),
        'image'    => wp_get_attachment_url($product->get_image_id()),
        'description' => wp_strip_all_tags($product->get_description()),
        'sku'      => $product->get_sku(),
        'brand'    => ['@type' => 'Brand', 'name' => wp_strip_all_tags(get_bloginfo('name'))],
        'offers'   => [
            '@type'         => 'Offer',
            'url'           => get_permalink(),
            'priceCurrency' => get_woocommerce_currency(),
            'price'         => (string) $product->get_price(),
            'availability'  => $product->is_in_stock()
                ? 'https://schema.org/InStock'
                : 'https://schema.org/OutOfStock',
            'seller' => ['@type' => 'Organization', 'name' => get_bloginfo('name')]
        ]
    ];
    echo '<script type="application/ld+json">' . wp_json_encode($data, JSON_UNESCAPED_UNICODE) . '</script>' . "\n";
});

Async Loading Actionscheduler. Таблица wp_actionscheduler_actions нагружает базу после каждого заказа. Запустите через WP-CLI очистку:

wp action-scheduler run --hooks=action_scheduler_run_queue --force

Ваш интернет-магазин на WooCommerce теряет заявки из-за медленных карточек товаров и фильтров-дублей? Закажите технический SEO-аудит WordPress-сайта в «Калинин Студио» — разберём архитектуру, канонику и Schema.org JSON-LD до последнего символа.

Раздел 8. Очистка базы данных и wp_options

2150038838.jpg

Таблица wp_options — главный технический долг SEO-оптимизации Wordpress. Каждый плагин пишет туда свои настройки, и они подгружаются на каждом запросе (если autoload='yes'). При 100–300 плагинах за 3–5 лет таблица разрастается до 50–200 МБ, и каждый запрос к / начинает тянуть 2–6 МБ данных.

Диагностика — найдите самые тяжёлые autoload-ключи:

SELECT option_name, LENGTH(option_value) AS size_bytes
FROM wp_options
WHERE autoload = 'yes'
ORDER BY LENGTH(option_value) DESC
LIMIT 30;

Удаление устаревших транзиентов (transients — данные с истёкшим сроком):

DELETE a, b FROM wp_options a
LEFT JOIN wp_options b
  ON b.option_name = REPLACE(a.option_name, '_transient_timeout_', '_transient_')
WHERE a.option_name LIKE '_transient_timeout_%'
  AND a.option_value < UNIX_TIMESTAMP();

Удаление orphaned-данных от удалённых плагинов:

SELECT option_name, COUNT(*) AS hits
FROM wp_options
WHERE option_name REGEXP '^(old_plugin|deleted_module|_deprecated_)'
GROUP BY option_name
ORDER BY hits DESC
LIMIT 50;

Удаление ревизий записей старше 6 месяцев (резервную копию БД сделать обязательно):

DELETE FROM wp_posts WHERE post_type = 'revision'
  AND post_modified < DATE_SUB(NOW(), INTERVAL 6 MONTH);
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);

Auto-prune drafts и auto-saved: аналогично, через DELETE FROM wp_posts WHERE post_status IN ('draft','auto-draft') AND post_modified < DATE_SUB(NOW(), INTERVAL 12 MONTH).

Все SQL-операторы выше исполняйте только после резервной копии.

Раздел 9. Сравнительная матрица — итог

Задача SEO Wordpress Что делает плагин Что делает инженер Эффект для бизнеса
Мета-теги Боковая панель с закодированными шаблонами PHP-функция на 30 строк Минус 12 SQL-запросов, минус 80 КБ JS
XML-карта Регенерация на каждый запрос wp_sitemaps PHP 8 + CDN Карта отдаётся за 50 мс
Schema.org JSON-LD Плагин + UI + сторонние библиотеки wp_json_encode(...) напрямую Сниппет без стороннего JS
Canonical Плагин SEO Фильтр rel_canonical + кастом 100% правильных canonical
Robots.txt В админке SEO Файл + фильтр wp_robots Гибкая логика для /private/, /api/
Кеширование WP Rocket / LiteSpeed Cache Redis + Object Cache + Nginx FastCGI TTFB 80–200 мс
Изображения Smush / ShortPixel Nginx-модуль image_filter + WebP -40–60% веса страницы
БД WP-Optimize SQL-запросы и чистка autoload Запросов к / на 30% меньше
Cron WP-Cron Системный cron Минус 1–3 SQL на каждый запрос
Heartbeat Плагин Heartbeat Control wp_deregister_script('heartbeat') Минус 1 JS-запрос каждые 15 сек

Раздел 10. «Красные флаги» подрядчика: как понять, что ваш СЕО-специалист на Вордпресс занимается имитацией

Реальное СЕО-продвижение Wordpress должно давать измеримый результат: рост позиций, рост трафика, рост скорости по PageSpeed. Если исполнитель отчитывается «сделали Title по формуле», это — имитация.

Признаки № 1. Стек из 30+ активных плагинов. Когда подрядчик ставит Yoast SEO или Rank Math, плюс WP Rocket или LiteSpeed Cache, плюс Wordfence, плюс WPForms, плюс Smush, плюс Redirection, плюс Elementor, плюс TablePress, плюс WPML — это не оптимизация. Это экспресс-настройка «из коробки». Суммарный вес JS на фронтенде превышает 600 КБ, TTFB 800–1500 мс.

Признак № 2. Плагин, который должен был ускорить сайт, сделал его медленнее. Если WP Rocket установлен, но PageSpeed Insights всё равно жёлтый/красный на мобильных — значит, не настроены Redis и Nginx FastCGI Cache. Плагин не компенсирует отсутствие объектного кеша.

Признак № 3. Лог изменений состоит из установки плагинов и смены шаблона. Без правок functions.php, без SQL-оптимизации wp_options, без настройки wp_cron, без чистки wp_head — это не сео продвижение вордпресс, это оформление подписки на техническую поддержку плагинов.

Признак № 4. Yoast SEO и Rank Math установлены одновременно. Конфликт плагинов — это мина замедленного действия. В 99% случаев один из модулей дублирует canonical, sitemap, meta robots, что приводит к двойным тегам и двойным SQL-запросам.

Признак № 5. Никто не трогал базу данных. Если за 2 года работы сайта таблица wp_options весит 80 МБ, а wp_postmeta — 200 МБ — ваш подрядчик делал визуальные правки, а не техническое обслуживание.

Если хотя бы 3 из 5 пунктов совпали — вашему сайту нужен независимый технический аудит, а не «допиливание плагинами». Закажите технический SEO-аудит WordPress-сайта в «Калинин Студио» — покажем, где именно теряется скорость и конверсия.

Заключение

WordPress SEO — это не установка пятнадцати плагинов и не подписка на дорогой комбайн. Это инженерная работа на пяти уровнях: сервер (Nginx, PHP 8.3, Redis, Brotli), база данных (чистый wp_options, нормализованный wp_postmeta), ядро PHP (хуки на wp_head, нативные Schema.org, чистый cron), шаблон (отказ от Elementor, минимум JS, критический CSS) и индексация (canonical, robots.txt, sitemap.xml, WooCommerce-фильтры).

Каждый из этих слоёв даёт самостоятельный прирост скорости и конверсии. В комплексе они превращают медленный коммерческий сайт в быстрый, индексируемый и видимый в Яндексе и Google инструмент продаж. Техническое SEO на WordPress — это выбор в пользу инженерии, а не плагинов.

Часто задаваемые вопросы

Действительно ли SEO для Wordpress возможно без плагинов?

Да, и это даже проще, чем кажется. WordPress имеет встроенные функции add_theme_support('title-tag'), wp_sitemaps, wp_head и фильтры document_title_parts, wpseo_canonical, rel_canonical, через которые реализуется 90% того, что делают Yoast или Rank Math. Без плагинов сайт работает быстрее, требует меньше ресурсов и не подвержен конфликтам между модулями.

Сколько плагинов допустимо для нормальной СЕО-оптимизации Wordpress?

Эмпирическое правило: 5–8 плагинов на типовой бизнес-сайт. Если больше 15 — велик риск, что ядро функционала конфликтует. Один SEO-плагин на выбор (Yoast, Rank Math, SEOPress или собственный код), один плагин форм, один плагин безопасности, один плагин кеширования или Redis-объектный кеш через хостинг. Остальное — кастомный PHP.

Как проверить, не раздута ли база wp_options?

Через SQL-запрос SELECT COUNT(*) FROM wp_options WHERE autoload='yes'; и SELECT SUM(LENGTH(option_value)) FROM wp_options WHERE autoload='yes';. Если autoload-ключей больше 600–800 либо суммарный объём больше 8–12 МБ — таблица нуждается в очистке. Это критично для SEO Вордпресс и скорости ответа под нагрузкой.

Что делать, если установлены и Yoast, и Rank Math одновременно?

Немедленно деактивировать один, удалить настройки через SQL (DELETE FROM wp_options WHERE option_name LIKE 'rank_math%'; или WHERE option_name LIKE '_yoast%';), проверить canonical и meta robots на страницах сайта. Двойные SEO-плагины — одна из самых частых причин падения позиций в Яндексе после «обновления SEO-настройки» подрядчиком.

Можно ли настроить SEO для сайта на WP одной командой в functions.php, а не серией хуков?

Можно, если у сайта простая структура: 1–2 типа записей, 1–2 таксономии, нет WooCommerce. В этом случае один PHP-файл на 80–120 строк решает задачи title, description, canonical, Open Graph, Twitter Cards и базовую Schema.org. Для магазинов и порталов лучше разнести логику по классам и фильтрам — гибче и легче сопровождать.

Почему PageSpeed Insights показывает низкие баллы, если установлен WP Rocket?

WP Rocket — клиентский плагин кеширования. Он ускоряет фронтенд, но не разгружает сервер. Без Redis Object Cache, без Nginx FastCGI Cache, без оптимизации PHP 8.x — TTFB остаётся 700–1200 мс, и это верхняя граница Core Web Vitals. Полное ускорение требует серверного слоя, а не только плагина.

autor

Александр Калинин

Большой опыт работы в сфере оптимизации и создания сайтов. Помогу с решением важных вопросов.

Комментарии

Популярные статьи

Может быть интересно

Оставьте номер телефона и мы поможем вам