Top.Mail.Ru

Свежие статьи

Рубрики

Рубрика: Блог разработчика

Блог разработчика-самоучки: создаю сайты и плагины для WordPress с помощью ИИ. Делюсь кодом, ошибками и готовыми решениями на Python и PHP.

  • Sitemap.xml: как создать его без плагинов

    Sitemap.xml: как создать его без плагинов

    Одно из первых сообщений от  Яндекс.Вебмастер было: «Sitemap-файл не найден». Я не понял, о чём речь. Какой ещё sitemap? Зачем он нужен? У меня же есть сайт, есть статьи, всё работает. Почему поисковик требует какой-то файл?

    Прошло несколько недель, прежде чем я разобрался. Оказалось, что sitemap — это карта сайта. Файл, в котором перечислены все страницы, которые я хочу показать поисковикам. Без него роботы ходят по сайту наугад, переходят по ссылкам, могут что-то пропустить. С ним — у них есть чёткий список, куда идти.

    В предыдущей статье я рассказывал про robots.txt — файл, который говорит роботам, куда можно ходить, а куда нельзя. Sitemap — это дополнение к нему. Robots.txt говорит, куда не надо. Sitemap говорит, куда надо. Вместе они создают понятную систему для поисковиков.

    Сегодня расскажу, как я создал sitemap.xml без единого плагина. Только код. С примерами, которые можно сразу использовать.

    Что такое sitemap.xml и зачем он нужен

    Метафора sitemap.xml как оглавления книги: роботы-пауки идут по карте сайта, сверяясь с содержанием, для быстрой индексации страниц.

    Sitemap.xml — это XML-файл, в котором перечислены все страницы сайта, которые должны быть проиндексированы. Для каждой страницы указывается адрес, дата последнего изменения, приоритет и частота обновления.

    Если по-простому: это как оглавление книги. Когда робот приходит на сайт, он может переходить по ссылкам и находить страницы. Но если ссылок мало или они плохо связаны между собой, робот может что-то пропустить. Sitemap говорит: «Вот все страницы, которые есть. Проверь их».

    Зачем это нужно? Вот несколько причин, которые я понял на своём опыте.

    • Роботы быстрее находят новые статьи. Если вы только что опубликовали материал, sitemap сообщит об этом.

    • Роботы не пропускают страницы. Если статья плохо связана ссылками с другими страницами, sitemap всё равно её покажет.

    • Вы видите полную картину сайта. В Яндекс.Вебмастере и Google Search Console можно посмотреть, какие страницы были проиндексированы, а какие нет.

    • Это улучшает и ускоряет индексацию в целом. Поисковики доверяют сайтам, у которых есть sitemap.

    Честно говоря, когда я только создал сайт, я был уверен, что поисковики сами всё найдут. Наивный. Они, конечно, найдут — но это может занять недели или месяцы. С sitemap процесс ускоряется в разы.

    Почему я решил сделать sitemap без плагинов

    Самый простой путь — установить плагин вроде Yoast SEO или Rank Math. Они автоматически генерируют sitemap. Но я отказался от этой идеи по нескольким причинам.

    Во-первых, я хотел контролировать каждый аспект. Что попадает в sitemap, что нет. Как формируются даты. Какой приоритет у страниц.

    Во-вторых, я не хотел зависеть от плагинов. Если разработчик перестанет обновлять плагин или WordPress что-то сломает — я останусь с проблемой. А если код мой, я знаю, как его исправить.

    В-третьих, мне было интересно разобраться. Как это работает изнутри. Как формируется XML. Как WordPress отдаёт файлы.

    И знаете что? Это оказалось не так сложно. Sitemap состоит из нескольких блоков кода, которые я добавил в functions.php дочерней темы. Всё работает автоматически. Новые статьи появляются в sitemap сразу после публикации.

    Как создать sitemap.xml без плагинов

    Вот код, который я использую. Покажу его полностью, а потом разберу каждую часть.

    php
    // ========== НАЧАЛО БЛОКА: XML-карта сайта ==========
    
    function seo_add_sitemap_rewrite() {
        add_rewrite_rule( '^sitemap\.xml$', 'index.php?seo_sitemap=1', 'top' );
    }
    add_action( 'init', 'seo_add_sitemap_rewrite' );
    
    function seo_add_sitemap_query_var( $vars ) {
        $vars[] = 'seo_sitemap';
        return $vars;
    }
    add_filter( 'query_vars', 'seo_add_sitemap_query_var' );
    
    function seo_sitemap_handler() {
        if ( get_query_var( 'seo_sitemap' ) != 1 ) {
            return;
        }
    
        header( 'Content-Type: application/xml; charset=utf-8' );
        header( 'X-Robots-Tag: noindex, follow' );
    
        echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
        echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
    
        echo '<url><loc>' . esc_url( home_url( '/' ) ) . '</loc><priority>1.0</priority><changefreq>daily</changefreq><lastmod>' . date( 'Y-m-d' ) . '</lastmod></url>' . "\n";
    
        $posts = get_posts( array(
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'posts_per_page' => -1,
            'orderby'        => 'modified',
            'order'          => 'DESC',
        ) );
        foreach ( $posts as $post ) {
            $lastmod = get_post_modified_time( 'Y-m-d', false, $post->ID );
            echo '<url><loc>' . esc_url( get_permalink( $post->ID ) ) . '</loc><priority>0.8</priority><changefreq>weekly</changefreq><lastmod>' . esc_html( $lastmod ) . '</lastmod></url>' . "\n";
        }
    
        $categories = get_categories( array( 'hide_empty' => true ) );
        foreach ( $categories as $cat ) {
            $cat_posts = get_posts( array(
                'post_type'      => 'post',
                'post_status'    => 'publish',
                'posts_per_page' => 1,
                'category'       => $cat->term_id,
                'orderby'        => 'modified',
                'order'          => 'DESC',
            ) );
            $cat_lastmod = ! empty( $cat_posts )
                ? get_post_modified_time( 'Y-m-d', false, $cat_posts[0]->ID )
                : date( 'Y-m-d' );
    
            echo '<url><loc>' . esc_url( get_category_link( $cat->term_id ) ) . '</loc><priority>0.5</priority><changefreq>weekly</changefreq><lastmod>' . esc_html( $cat_lastmod ) . '</lastmod></url>' . "\n";
        }
    
        $pages = get_pages( array( 'post_status' => 'publish', 'hierarchical' => 0 ) );
        foreach ( $pages as $page ) {
            if ( get_option( 'page_on_front' ) == $page->ID ) {
                continue;
            }
            $lastmod = get_post_modified_time( 'Y-m-d', false, $page->ID );
            echo '<url><loc>' . esc_url( get_permalink( $page->ID ) ) . '</loc><priority>0.6</priority><changefreq>monthly</changefreq><lastmod>' . esc_html( $lastmod ) . '</lastmod></url>' . "\n";
        }
    
        echo '</urlset>';
        exit;
    }
    add_action( 'template_redirect', 'seo_sitemap_handler' );
    
    // ========== КОНЕЦ БЛОКА ==========

    Теперь разберём, что здесь к чему.

    Правило перезаписи

    Функция seo_add_sitemap_rewrite создаёт правило, которое говорит WordPress: «Если кто-то открывает адрес /sitemap.xml — покажи не страницу 404, а специальный обработчик».

    add_rewrite_rule добавляет это правило. Параметр top означает, что правило проверяется в первую очередь, до всех остальных.

    Функция seo_add_sitemap_query_var добавляет переменную seo_sitemap в список разрешённых. Это нужно, чтобы WordPress понял, что мы хотим обработать этот запрос.

    Генерация XML

    Функция seo_sitemap_handler — сердце sitemap. Она делает несколько вещей.

    • Проверяет, что запрос действительно к sitemap.

    • Устанавливает заголовки: тип контента XML и запрет индексации самого файла через X-Robots-Tag: noindex, follow.

    • Открывает XML-структуру: <urlset>.

    • Добавляет главную страницу с приоритетом 1.0 и частотой обновления daily.

    • Проходит по всем опубликованным постам и добавляет их с приоритетом 0.8 и частотой weekly.

    • Проходит по всем рубрикам с хотя бы одной статьёй и добавляет их с приоритетом 0.5.

    • Проходит по всем опубликованным страницам (Pages) и добавляет их с приоритетом 0.6.

    Для каждого поста, рубрики и страницы на моем сайте указывается lastmod — дата последнего изменения. Это помогает поисковикам понять, что страница обновилась, и переиндексировать её.

    Для рубрик я беру дату последнего изменения самой свежей статьи в этой рубрике. Так поисковик видит, что рубрика обновляется. Если статей в рубрике нет вообще — ставлю текущую дату.

    Страницы (Pages) добавляю все, кроме главной — она уже добавлена отдельно с приоритетом 1.0. Иначе получится дубль.

    Подключение обработчика

    add_action( 'template_redirect', 'seo_sitemap_handler' ) говорит WordPress: «Когда загружается шаблон — проверь, не запрос ли это к sitemap. Если да — запусти обработчик».

    Почему template_redirect, а не init? Потому что на этапе init WordPress ещё не знает, какой шаблон загружается. А на template_redirect — уже знает. И мы можем перехватить запрос до того, как загрузится шаблон.

    Что нужно сделать после добавления кода

    Создание sitemap.xml без плагинов: код в functions.php, сохранение постоянных ссылок и работающий XML-файл с картой сайта в браузере.

    После того как я добавил этот код в functions.php, я сделал ещё один шаг. Без него sitemap не заработает.

    Я зашёл в админку WordPress → «Настройки» → «Постоянные ссылки» и нажал «Сохранить изменения». Это обновляет правила перезаписи. Без этого шага новое правило /sitemap.xml не будет работать.

    После этого я открыл в браузере https://milyutin-codes.ru/sitemap.xml. И увидел XML-файл со списком страниц. Это был момент радости. Первый sitemap, который я создал сам.

    Ошибки, которые я совершил с sitemap

    Я не могу сказать, что всё было гладко. Вот несколько ошибок, которые я допустил.

    Первая: я забыл сохранить постоянные ссылки. Я добавил код, открыл /sitemap.xml — и увидел ошибку 404. Я не мог понять, в чём дело. Оказалось, что нужно просто зайти в «Постоянные ссылки» и нажать «Сохранить». После этого всё заработало.

    Вторая: все даты lastmod были одинаковыми. Сначала я использовал date( 'Y-m-d' ) для всех страниц. В итоге у всех страниц была одна и та же дата — сегодняшняя. Поисковик думает, что все страницы обновляются каждый день, и перестаёт верить этим датам. Я исправил: теперь для каждого поста и страницы берётся дата последнего изменения через get_post_modified_time.

    Третья: sitemap был недоступен. В какой-то момент Яндекс.Вебмастер начал показывать ошибку: «Sitemap недоступен». Я проверил — файл открывается. Потом понял: проблема была в кэше хостинга. Я отключил кэш для этой страницы и добавил заголовок Cache-Control: no-cache. Проблема решилась.

    Четвёртая: я не добавил sitemap в robots.txt. Sitemap работал, но роботы о нём не знали. Пришлось добавлять строку Sitemap: https://milyutin-codes.ru/sitemap.xml в robots.txt.

    Пятая: я не отправил sitemap в поисковики. Просто создать файл недостаточно. Нужно сообщить поисковикам, что он существует. Я отправил его в Яндекс.Вебмастер и Google Search Console через специальные разделы.

    Как проверить, что sitemap работает

    После того как я создал sitemap, я проверяю его несколькими способами.

    • Открываю https://сайт.ru/sitemap.xml в браузере. Если вижу XML-структуру — файл работает.

    • Проверяю, что в sitemap есть главная страница, все статьи, все рубрики и все страницы.

    • Проверяю, что даты lastmod разные для разных страниц.

    • Отправляю sitemap в Яндекс.Вебмастер → «Индексирование» → «Sitemap-файлы».

    • Отправляю sitemap в Google Search Console → «Файлы Sitemap».

    • Жду несколько дней и смотрю, сколько страниц проиндексировано.

    Я делаю это после каждого изменения структуры сайта. Если добавил новую рубрику или удалил страницу — проверяю, обновился ли sitemap.

    Что ещё можно добавить в sitemap

    Мой sitemap включает главную страницу, статьи, рубрики и страницы. Но можно добавить и другие типы контента.

    • Метки. У меня они закрыты от индексации через noindex, follow в robots.txt, поэтому в sitemap их нет.

    • Изображения. В расширенном sitemap можно указать изображения для каждой страницы. Это помогает попасть в поиск по картинкам.

    • Видео. Если на сайте есть видео, их тоже можно добавить.

    Я пока не добавлял изображения и видео. Мой сайт — блог, и основная ценность в текстах. Но если у вас много медиаконтента — стоит подумать.

    Нужно ли разбивать sitemap на части

    Есть ограничение: один sitemap может содержать не более 50 000 URL и быть не больше 50 МБ. Если у вас больше страниц — нужно разбивать на несколько файлов и создавать индексный sitemap.

    У меня пока меньше 50 000 страниц. Поэтому я использую один файл. Но если сайт вырастет — придётся разбивать.

    Что я понял про sitemap

    Sitemap — это не роскошь, а необходимость. Без него роботы ходят по сайту наугад. С ним — у них есть чёткий список. Индексация ускоряется, страницы не пропадают.

    Создать sitemap без плагинов — реально. Это не rocket science. Несколько блоков кода в functions.php — и всё работает автоматически.

    Не забывайте про постоянные ссылки. После добавления кода нужно зайти в «Настройки» → «Постоянные ссылки» и сохранить. Без этого правило не заработает.

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

    Отправьте sitemap в поисковики. Просто создать файл недостаточно. Нужно сообщить Яндексу и Google, что он существует.

    Проверяйте после каждого изменения. Добавили статью — проверьте, появилась ли она в sitemap. Удалили страницу — проверьте, исчезла ли она.

    Первые шаги

    Я начинал с этого. Ничего сложного.

    • Добавьте код sitemap в functions.php дочерней темы.

    • Сохраните постоянные ссылки в админке.

    • Откройте /sitemap.xml в браузере и проверьте, что всё работает.

    • Добавьте строку Sitemap в robots.txt.

    • Отправьте sitemap в Яндекс.Вебмастер и Google Search Console.

    • Подождите несколько дней и проверьте, сколько страниц проиндексировано.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Я не говорю, что sitemap — это самое важное в SEO. Но это база. Как ЧПУ. Как robots.txt. Как заголовки. Без этого сайт будет работать хуже, чем мог бы.

    Если вы понимаете, что ваши статьи не индексируются — остановитесь. Проверьте, есть ли у вас sitemap. Если нет — создайте. Если есть — проверьте, правильно ли он заполнен. Это займёт не так много времени, но даст эффект на месяцы вперёд.

    Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Robots.txt: зачем этот файл нужен и как его заполнить

    Robots.txt: зачем этот файл нужен и как его заполнить

    Когда я только сделал свой первый сайт, я не знал, что такое robots.txt. Честно говоря, я даже не думал, что такой файл бывает. Я публиковал статьи и ждал результата. А потом начал изучать как продвигать сайт и наткнулся на СЕО и этот файл очень важен для него.

    Robots.txt это один из главных файлов, без которого поисковики могут делать с твоим сайтом что угодно. Или наоборот — не делать того, что  вы хотите нужно. Я полез разбираться, наделал ошибок, потом исправлял. И сейчас расскажу, что это за файл, зачем он нужен и как его заполнить так, чтобы нравиться поисковикам.

    В предыдущей статье я рассказывал про ЧПУ — понятные адреса страниц. Теперь двигаемся дальше по технической части SEO. Robots.txt — это следующий шаг после того, как вы настроили адреса. Потому что роботам надо дать понять куда им можно ходить, а куда — не надо.

    Что такое robots.txt и зачем он нужен

    Метафора robots.txt: дверь с табличкой Allow и Disallow, роботы-пауки входят или остановлены, настройка доступа к папкам сайта.

    Robots.txt — это текстовый файл, который лежит в корне вашего сайта. Он говорит поисковым роботам, какие страницы можно сканировать, а какие — нельзя.

    Если по-простому: это как табличка на двери. «Сюда можно, а сюда не надо». Робот читает эту табличку и действует соответственно.

    Зачем это нужно? Вот несколько причин, которые я понял на своём опыте.

    • Чтобы закрыть от индексации служебные страницы. Например, админку, папки с движком, файлы настроек. Они не нужны в поиске.

    • Чтобы указать роботам путь к карте сайта (sitemap.xml). Это ускоряет индексацию.

    • Чтобы не плодить дубли. Например, страницы с GET-параметрами или страницы поиска внутри сайта.

    • Чтобы контролировать нагрузку на сервер. Если робот ходит слишком часто, это может замедлить сайт.

    Но тут есть важный момент, который я понял не сразу. Robots.txt — это не запрет. Это рекомендация. Если робот захочет — он может проигнорировать файл. Но крупные поисковики, Яндекс и Google, его уважают.

    Где находится robots.txt и как его создать

    Robots.txt должен лежать в корне сайта. Там же, где лежат файлы wp-config.php и wp-load.php.

    Как найти корень сайта? Через FTP или файловый менеджер хостинга. Обычно это папка /public_html/ или просто /. Внутри неё лежат папки wp-admin, wp-content, wp-includes. И там же должен быть файл robots.txt.

    Если файла нет — его нужно создать. Я создаю через файловый менеджер хостинга: нажимаю «Создать файл», ввожу имя robots.txt и записываю в него содержимое.

    Важно: файл должен быть именно в корне, а не в папке с темой или где-то ещё. Если положить его не туда, он не сработает.

    Проверить, что файл работает, можно так: откройте в браузере https://ваш-сайт.ru/robots.txt. Если видите содержимое файла — всё в порядке. Если видите ошибку 404 — значит, файл лежит не там или не создан.

    Как правильно заполнить robots.txt: мой пример

    Инфографика robots.txt: User-agent, Allow для uploads, Disallow для wp-admin и wp-includes, Sitemap для ускорения индексации.

    Вот как выглядит мой robots.txt. Я покажу его полностью, а потом разберу каждую строчку.

    text
    User-agent: *
    Allow: /wp-content/uploads/
    Disallow: /wp-admin/
    Disallow: /wp-includes/
    Disallow: /wp-content/plugins/
    Disallow: /wp-content/themes/
    Disallow: /wp-login.php
    Disallow: /wp-json/
    Disallow: /xmlrpc.php
    Disallow: /?s=*
    Disallow: /search/
    Disallow: /tag/
    Disallow: /author/
    Disallow: /feed/
    Disallow: /comments/feed/
    Disallow: /*?*
    
    Sitemap: https://milyutin-codes.ru/sitemap.xml

    Теперь разберём, что здесь к чему.

    User-agent: *

    Это директива, которая говорит: «Правила ниже применяются ко всем поисковым роботам». Звёздочка означает «все». Если вы хотите задать правила для конкретного робота, например только для Яндекса, пишете User-agent: Yandex.

    Я использую *, потому что хочу, чтобы правила работали для всех поисковиков одинаково.

    Allow: /wp-content/uploads/

    Эта строка разрешает роботам сканировать папку с загруженными изображениями. Это важно, потому что картинки из статей должны попадать в поиск по картинкам. Если закрыть эту папку, изображения не будут индексироваться.

    Disallow: /wp-admin/ и другие служебные папки

    Эти строки закрывают от индексации служебные разделы WordPress. Админка, папки с движком, файлы входа — всё это не нужно в поиске. Если робот их просканирует, это создаст лишнюю нагрузку и может привести к ошибкам в индексации.

    Я закрываю:

    • /wp-admin/ — админка.

    • /wp-includes/ — системные файлы.

    • /wp-content/plugins/ — папка с плагинами.

    • /wp-content/themes/ — папка с темами.

    • /wp-login.php — страница входа.

    • /wp-json/ — REST API.

    • /xmlrpc.php — файл для удалённого управления.

    Раньше я не закрывал эти папки. И знаете что? В Яндекс.Вебмастере появились ошибки: робот пытался проиндексировать страницы админки и выдавал ошибки. После того как я закрыл их в robots.txt, ошибки исчезли.

    Disallow: /?s=* и Disallow: /search/

    Эти строки закрывают страницы внутреннего поиска. Когда пользователь ищет что-то на сайте, формируется страница вида /?s=запрос. Таких страниц может быть бесконечно много, и все они дублируют друг друга. Закрывать их от индексации — правильно.

    Disallow: /tag/, /author/, /feed/

    Это архивы. Метки, авторы, RSS-ленты. Я закрываю их от индексации, потому что они не несут уникальной ценности. Лучше сконцентрировать вес на статьях, а не на архивах.

    Честно говоря, тут я долго сомневался. Сначала я закрывал всё подряд — и рубрики, и метки, и архивы. А потом понял, что закрыл и рубрики, которые могли бы давать трафик. Пришлось переделывать.

    Disallow: /?

    Эта строка закрывает все страницы с GET-параметрами. То есть адреса вида /statiya/?utm_source=vk. Такие страницы — дубли основных страниц, и их не нужно индексировать.

    Sitemap: https://milyutin-codes.ru/sitemap.xml

    Эта строка указывает роботам путь к карте сайта. Sitemap помогает роботам быстрее найти все страницы. Я расскажу про sitemap в следующей статье, но здесь важно упомянуть, что путь к нему нужно прописать именно в robots.txt.

    Ошибки, которые я совершил с robots.txt

    Я не могу сказать, что всё было гладко. Вот несколько ошибок, которые я допустил.

    Первая: я закрыл всё подряд. Сначала я написал Disallow: / — то есть закрыл весь сайт от индексации. Думал, что так правильно. А потом удивился, почему сайта нет в поиске. Оказалось, что Disallow: / закрывает всё. Абсолютно всё. Пришлось срочно исправлять.

    Вторая: я забыл про Allow. Я закрыл папку /wp-content/ целиком, а вместе с ней и /wp-content/uploads/ — папку с картинками. В итоге изображения перестали индексироваться. Пришлось добавлять Allow: /wp-content/uploads/, чтобы открыть только эту папку.

    Третья: я не проверил файл. Я создал robots.txt, но не открыл его в браузере. Оказалось, что файл лежал не в корне, а в папке с темой. Роботы его не видели. Теперь я всегда проверяю: открываю https://сайт.ru/robots.txt и смотрю, что отображается.

    Четвёртая: я закрыл рубрики. Я закрыл /category/ от индексации. Думал, что это правильно. А потом понял, что рубрики могут давать трафик — люди ищут статьи по категориям. Пришлось открывать обратно.

    Пятая: я забыл про Sitemap. Я создал sitemap, но не прописал путь к нему в robots.txt. В итоге роботы не знали, где его искать. Пришлось добавлять строку.

    Как проверить, что robots.txt работает

    После того как я заполнил файл, я проверяю его несколькими способами.

    • Открываю https://сайт.ru/robots.txt в браузере. Если вижу содержимое — файл на месте.

    • Захожу в Яндекс.Вебмастер → «Инструменты» → «Анализ robots.txt». Там можно проверить, правильно ли файл читается.

    • Захожу в Google Search Console → «Файлы robots.txt». Там тоже можно проверить.

    • Проверяю конкретные страницы: закрыты ли они от индексации. В Вебмастере есть инструмент «Проверка URL» — можно ввести адрес и посмотреть, закрыт он или нет.

    Я делаю это после каждого изменения. Потому что одна ошибка в robots.txt может закрыть весь сайт от поиска. А это катастрофа.

    Что я понял про robots.txt

    Robots.txt — это не сложно, но важно. Файл состоит из нескольких строк, но от него зависит, увидят ли люди ваш сайт.

    Не закрывайте всё подряд. Лучше открыть лишнее, чем закрыть нужное. Закрывайте только то, что точно не нужно в поиске.

    Проверяйте после каждого изменения. Одна ошибка — и сайт исчезнет из поиска. Проверка занимает минуту, но спасает от больших проблем.

    Не забывайте про Sitemap. Указать путь к карте сайта в robots.txt — это простой способ ускорить индексацию.

    Это не разовая настройка. По мере роста сайта правила могут меняться. Я возвращаюсь к robots.txt каждый раз, когда добавляю новый раздел или меняю структуру.

    Вот что стоит сделать первым делом

    Я начинал с этого. Ничего сложного.

    • Создайте файл robots.txt в корне сайта.

    • Добавьте User-agent: * в первой строке.

    • Закройте служебные папки: /wp-admin/, /wp-includes/, /wp-content/plugins/, /wp-content/themes/.

    • Откройте папку с картинками: Allow: /wp-content/uploads/.

    • Закройте страницы поиска: /?s=*.

    • Добавьте путь к sitemap, если он у вас есть.

    • Проверьте файл в браузере и в Яндекс.Вебмастере.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Robots.txt — это не «одна из настроек». Это допуск. Если файл закрывает сайт целиком — вас нет в поиске. Если файл закрывает нужное — вы теряете трафик. Если файл лежит не в корне — он вообще не работает, а вы думаете, что всё в порядке.

    Я убедился в этом на своём опыте. Одна строка Disallow: / — и сайт исчез из поиска. Один забытый Allow — и картинки перестали индексироваться. Одна ошибка в пути — и файл не читался месяцами.

    Проверьте свой robots.txt сегодня. Откройте, посмотрите на него глазами робота. Закрыто ли то, что должно быть закрыто? Открыто ли то, что должно быть открыто? Указан ли путь к sitemap? Если вы не уверены — зайдите в Яндекс.Вебмастер и Google Search Console, проверьте файл там. Это займёт полчаса. Но эти полчаса решают, увидят ли люди то, что вы написали.

    Robots.txt не прощает небрежности. И не прощает забывчивости. Поэтому проверяйте его. Каждый раз, когда что-то меняете на сайте.

    Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • ЧПУ: что это и как настроить в WordPress — рассказываю на своём опыте

    ЧПУ: что это и как настроить в WordPress — рассказываю на своём опыте

    Когда я только запустил свой блог на WordPress, я вообще не думал о том, как выглядят адреса страниц. Ну, работают — и ладно. Я публиковал статьи, радовался, что сайт живёт. А потом заглянул в Яндекс.Вебмастер и увидел там ссылки вида milyutin-codes.ru/?p=123. Десятки таких ссылок. И ни одной понятной.

    Я тогда не придал этому значения. Думал: какая разница, как выглядит адрес, если статья полезная? А потом DeepSeek спросил меня: «А ты ЧПУ настроил?» Я не сразу понял, о чём речь. Оказалось, что это одна из главных вещей в SEO, на которую я не обратил внимания.

    В предыдущих статьях я рассказывал, что такое SEO, как работают поисковики, где искать ключевые слова и как строить структуру статьи. Теперь переходим к технической части. И начинаем с самого простого — с адресов страниц.

    В этой статье я расскажу, что такое ЧПУ, почему это важно и как настроить их в WordPress.

    Что такое ЧПУ и зачем это нужно

    ЧПУ — это «человекопонятный URL». То есть адрес страницы, который понятен человеку. Не набор цифр и знаков, а осмысленные слова.

    Вот как это выглядит на примере. Плохой адрес: milyutin-codes.ru/?p=123. Хороший адрес: milyutin-codes.ru/kak-nastroit-seo-v-wordpress/.

    Первый вариант — это стандартный адрес WordPress по умолчанию. Он ничего не говорит ни человеку, ни поисковику. Второй вариант — понятный адрес, в котором отражена суть страницы.

    Если по-простому: ЧПУ — это как адрес дома. Когда вы говорите «улица Ленина, дом 5», то это понятно. Когда вы говорите «квартал 17, строение 3, корпус Б», этого ни кто не понимает. Так и с адресами на сайте.

    Зачем это нужно для SEO? Вот несколько причин.

    • Поисковики лучше понимают, о чём страница, когда в адресе есть ключевые слова.

    • Люди чаще кликают по понятным ссылкам в поисковой выдаче.

    • Когда кто-то делится ссылкой в соцсетях, понятный адрес вызывает больше доверия.

    • Понятные адреса легче запомнить и воспроизвести вручную.

    Когда я впервые увидел свой адрес в поисковой выдаче — /?p=123. Честно говоря, мне стало стыдно. Как будто я построил красивый дом, а на входе написал «неизвестное строение». Это выглядело отвратительно и непрофессионально.

    Как настроить ЧПУ в WordPress: пошаговая инструкция

    Настройка ЧПУ в WordPress занимает буквально пару минут. Я делал это несколько раз — сначала на тестовом сайте, потом на основном.

    Вот что нужно сделать.

    • Зайдите в админку WordPress.

    • Откройте раздел «Настройки» (Settings).

    • Выберите подраздел «Постоянные ссылки» (Permalinks).

    • Вы увидите несколько вариантов. Выберите «Название записи» (Post name).

    • Нажмите «Сохранить изменения».

    Всё. С этого момента новые статьи будут иметь понятные адреса. Вместо /?p=123 будет /nazvanie-stati/.

    Но тут есть важный момент, о котором я узнал не сразу. Если вы меняете ЧПУ на уже работающем сайте, старые ссылки могут перестать работать. WordPress автоматически создаёт редиректы для старых адресов, но не всегда это работает идеально.

    Я помню, как настраивал ЧПУ на одном из первых своих сайтов. После сохранения настроек несколько старых ссылок выдавали ошибку 404. Пришлось вручную настраивать редиректы. Это заняло время, но научило меня одной вещи: если можно настроить ЧПУ до публикации статей — настройте. Не ждите.

    Какой вариант ЧПУ выбрать

    В WordPress есть несколько вариантов постоянных ссылок. Разберём каждый.

    Простой (Plain)

    Это стандартный вариант: /?p=123. Никакой пользы для SEO. Этот вариант я не рекомендую никому. Он есть только для того, чтобы сайт работал «из коробки».

    День и имя (Day and name)

    Адрес выглядит так: /2026/10/08/nazvanie-stati/. Здесь есть дата публикации и название статьи. Это неплохой вариант, но дата в адресе может быть минусом. Если статья устареет, адрес будет намекать на это.

    Месяц и имя (Month and name)

    Адрес: /2026/10/nazvanie-stati/. То же самое, но без дня. Чуть лучше, но дата всё ещё есть.

    Числовой (Numeric)

    Адрес: /archives/123. Это вариант для тех, кто не хочет слов в адресе. Но для SEO он слабый. Поисковик не понимает, о чём страница.

    Название записи (Post name)

    Адрес: /nazvanie-stati/. Вот этот вариант я использую сам и рекомендую всем. В адресе есть только название статьи, никаких дат и цифр. Он понятный, чистый и хорошо работает для SEO.

    Что делать с русскими буквами в адресе

    Инфографика: русские буквы в URL кодируются в проценты, пример преобразования адреса.

    Вот тут я долго не мог разобраться. Когда я начал использовать ЧПУ, мой адрес выглядел так: /как-настроить-seo/. Русские буквы в адресе. Вроде бы всё понятно, но есть нюансы.

    Во-первых, русские буквы в адресе кодируются в специальные символы. Например, вместо «как» в строке браузера появляется %D0%BA%D0%B0%D0%BA. Это выглядит страшно и непонятно.

    Во-вторых, если кто-то копирует ссылку и вставляет её в мессенджер или соцсеть, она может отобразиться некорректно.

    В-третьих, не все системы корректно обрабатывают русские буквы в URL.

    Сначала я пробовал решать это вручную — писал ярлык латиницей при каждой публикации. Работает, но муторно. Особенно когда статей становится много. Ты сидишь и думаешь: «Как перевести это слово? А это?» Тратишь время на ерунду.

    Потом поставил плагин Cyr-To-Lat. И знаете что? Я пожалел, что не сделал этого раньше.

    Cyr-To-Lat автоматически транслитерирует заголовок статьи в ярлык. Пишете вы заголовок «Как настроить SEO в WordPress» — плагин сам создаёт адрес kak-nastroit-seo-v-wordpress. Не нужно ничего переводить руками. Не нужно думать, какую букву на какую менять. Нажали «Опубликовать» — и всё готово.

    Плагин простой. Установили, активировали — и он работает. Без настроек, без сложных опций. Просто берёт русские буквы и меняет их на латинские.

    Интерфейс WordPress с плагином Cyr-To-Lat: русский заголовок и автоматический латинский ярлык для SEO.

    Я советую его всем, у кого блог на русском. Это экономит время и нервы. Особенно если вы публикуете часто.

    Дефисы лучше подчёркиваний. То есть /kak-nastroit-seo/ лучше, чем /kak_nastroit_seo/. Дефисы читаются как пробелы, а подчёркивания — нет. Cyr-To-Lat по умолчанию ставит дефисы — ещё один плюс.

    Нужно ли включать рубрику в адрес

    Это ещё один вопрос, который меня мучил. В WordPress есть возможность включать в адрес рубрику. Например, /seo/kak-nastroit-seo/ вместо /kak-nastroit-seo/.

    Плюс этого подхода: в адресе видна категория, к которой относится статья. Это помогает и пользователю, и поисковику понять структуру сайта.

    Минус: если вы решите изменить рубрику, придётся менять и адрес. А это значит, что старые ссылки перестанут работать.

    Я пробовал оба варианта. На одном сайте я включал рубрику в адрес, на другом — нет. И вот что я понял: для небольшого блога проще обойтись без рубрики в адресе. Так гибче. Если понадобится изменить структуру — не придётся перенаправлять ссылки.

    Но если у вас большой сайт с чёткой структурой — рубрика в адресе может быть плюсом. Главное — не менять её слишком часто.

    Ошибки, которые я совершил с ЧПУ

    Я не могу сказать, что всё было гладко. Вот несколько ошибок, которые я допустил.

    Первая: я настроил ЧПУ после публикации статей. В итоге несколько старых ссылок перестали работать. Мне пришлось вручную настраивать редиректы. Это заняло несколько часов. Теперь я всегда настраиваю ЧПУ в первую очередь — до публикации первой статьи.

    Вторая: я использовал слишком длинные адреса. Например, /kak-ya-nastroit-seo-v-wordpress-bez-plaginov-i-pochemu-eto-rabotaet/. Слишком длинно. Теперь я стараюсь делать адреса в 3–5 слов.

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

    Четвёртая: я использовал подчёркивания вместо дефисов. Например, /kak_nastroit_seo/. Это неправильно. Теперь я всегда использую дефисы.

    Что я понял про ЧПУ

    ЧПУ — это база. Это не что-то сложное или дополнительное. Это то, что нужно настроить сразу, как только вы создали сайт. Как фундамент для дома.

    Понятный адрес — это уважение к пользователю. Когда человек видит в поиске /?p=123, он не понимает, куда попадёт. Когда он видит /kak-nastroit-seo/ — понимает. И кликает чаще.

    Транслитерация — это не обязательно, но желательно. Русские буквы в адресе работают, но латиница надёжнее. Я использую латиницу и не жалею.

    Не меняйте ЧПУ после публикации. Если вы уже настроили ЧПУ и опубликовали статьи — не трогайте. Иначе придётся настраивать редиректы, а это лишняя работа.

    Адрес должен быть коротким. 3–5 слов — оптимально. Всё, что длиннее, плохо воспринимается и не даёт пользы.

    Что делать, если вы только начинаете

    Не пытайтесь охватить всё сразу. Начните с простого.

    • Зайдите в «Настройки» → «Постоянные ссылки» в WordPress.

    • Выберите вариант «Название записи».

    • Сохраните изменения.

    • Проверьте, что новые статьи имеют понятный адрес.

    • Используйте дефисы, а не подчёркивания.

    • Старайтесь делать адрес коротким — 3–5 слов.

    • Пишите адрес латиницей, если хотите надёжности.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Я не говорю, что ЧПУ — это самое важное в SEO. Но это база, с которой всё начинается. Если адреса страниц непонятные — всё остальное работает хуже.

    Если вы тоже чувствуете, что застряли, что ваш сайт не находят — остановитесь. Посмотрите на адреса своих страниц. Понятны ли они? Если нет — начните с этого. Это займёт пару минут, но даст эффект на месяцы вперёд.

    Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Структура статьи: что влияет на SEO — разбираю на своём опыте

    Структура статьи: что влияет на SEO — разбираю на своём опыте

    Когда я только начал писать статьи для блога, главное для меня было — чтобы статья была полезная. Чтобы человек прочитал и нашел нужную ему информацию. А как она выглядит — дело десятое. Я писал сплошным потоком: без подзаголовков, без списков, без выделений. Просто абзацы, которые шли один за другим.

    А потом заглянул в Яндекс.Вебмастер и увидел, что страницы не индексируются. Не то чтобы плохо — вообще никак. Я не мог понять, в чём дело. Текст есть, ключевые слова есть, мета-теги настроены. Почему поисковик не видит статью?

    Ответ оказался простым. Поисковый робот — это программа. Он не читает текст как человек. Он анализирует структуру страницы: заголовки, подзаголовки, списки и ссылки. Если структура непонятная, робот не может разобраться, о чём статья и что в ней главное.

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

    Почему структура важна для SEO

    Представьте, что вы открыли сайт и ищете статью о том, как создать сайт. Открываете статью — а там сплошной текст без оглавления, без глав, без заголовков. Просто стена букв. Вы будете это читать? Вряд ли. Закроете и уйдете на другой сайт.

    С поисковиками то же самое. Робот сканирует страницу и оценивает структуру. Если есть заголовки, подзаголовки, списки — он быстрее понимает, что это за статья и о чём она, какие в ней разделы, что главное, а что второстепенное. Если структуры нет — робот теряется.

    Но дело не только в роботах. Структура влияет и на людей. Когда я читаю статью без подзаголовков, я быстро устаю. Глаза не за что зацепить. А когда есть разделы, списки, выделенные мысли — читать легче. И люди дольше остаются на странице.

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

    Заголовки H1–H6: как использовать правильно

    Схема иерархии заголовков статьи: H1, H2, H3 и стрелки между уровнями для правильной структуры SEO.

    Это самая важная часть структуры. Заголовки — это каркас статьи. Они говорят поисковику: «Вот главная мысль. А вот подтемы, которые её раскрывают».

    H1 — главный заголовок страницы

    H1 — это заголовок статьи. Он должен быть один на странице. Не два, не три — один. Если поставить несколько H1, поисковик не поймёт, какой из них главный.

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

    Важно: H1 и Title (заголовок во вкладке браузера) — это разные вещи. Title — для поисковика и вкладки. H1 — для страницы. Они могут отличаться, но должны быть связаны по смыслу.

    H2 — основные разделы статьи

    H2 — это подзаголовки основных разделов. Они делят статью на блоки. В моей статье про SEO, есть разделы «Что такое SEO», «Как работают поисковики», «За что отвечает SEO». Каждый из них — H2.

    Сколько должно быть H2? Столько, сколько нужно, чтобы раскрыть тему. Но не меньше двух-трёх. Если статья состоит из одного большого блока без деления — это плохо и для робота, и для читателя.

    Я делаю так, чтобы каждый H2 отвечал на конкретный вопрос. К примеру «Как работают поисковики» или «Где искать ключевые слова». Читатель видит подзаголовок и понимает, о чём пойдёт речь в этой части статьи.

    H3 — подразделы внутри H2

    H3 — это подзаголовки внутри основных разделов. Они помогают разбить большой абзац на более мелкие абзацы. Например, в разделе «Где искать ключевые слова» у меня есть подразделы «Яндекс.Вордстат», «Google Keyword Planner», «Подсказки поисковых систем». Каждый из них — H3.

    Не обязательно использовать H3 в каждой статье. Но если раздел получается большим, лучше разбить его на подразделы. Это помогает и роботу, и читателю.

    H4, H5, H6 — нужны ли они?

    Честно говоря, я почти не использую H4 и ниже. В большинстве моих статей хватает H1, H2 и H3. Если структура становится слишком большой и глубокой, это уже не статья, а диссертация и читателю сложно воспринимать такое.

    Есть правило: не пропускать уровни заголовков. Всегда переходить от H1 к H2, затем к H3. Если используешь H3, перед ним должен быть H2. Нельзя прыгать с H1 сразу на H3.

    Я стараюсь придерживаться этого правила. Сначала H1 — заголовок статьи. Потом H2 — основные разделы. Внутри них H3 — подразделы. И всё. Этого достаточно.

    Абзацы: коротко и по делу

    Сравнение сплошного текста и структурированной статьи с короткими абзацами, подзаголовками и списком для улучшения SEO.

    Следующее, что влияет на структуру, — это абзацы. Я долго писал длинные абзацы. Мне казалось, что так солиднее. А потом заметил: люди сканируют текст, а не читают его целиком. Они ищут ключевые моменты, цепляются за них глазами.

    Если абзац длинный — 10–15 строк — человек его пропустит. Если короткий — 3–5 строк — прочитает. Это не значит, что нужно писать примитивно. Это значит, что нужно уважать внимание читателя.

    Вот как я это делаю сейчас. Одна мысль — один абзац. Не пытаюсь уместить в один абзац три разные идеи. Если мысль закончилась — ставлю точку и начинаю новый абзац.

    Это помогает и с SEO. Поисковик лучше понимает структуру текста, когда абзацы короткие и логичные. И пользователи дольше остаются на странице, потому что им легче читать.

    Списки: когда использовать

    Списки — это мощный инструмент структуры. Они помогают разбить информацию на пункты, которые легко воспринимаются. Я использую списки, когда нужно перечислить шаги, пункты, советы или примеры.

    Вот пример из моей статьи про настройку SEO. Я писал: «Вот мой чек-лист. Создал дочернюю тему. Добавил мета-боксы. Настроил вывод description. Добавил noindex для архивов». Это список. Он выглядит аккуратно и понятно.

    Поисковики тоже любят списки. Они помогают им понять, что это перечисление, а не сплошной текст. Списки иногда попадают в расширенные сниппеты — блоки в поисковой выдаче, которые показывают пункты списка прямо под заголовком.

    Но не нужно превращать всю статью в список. Списки — это инструмент, а не самоцель. Если всё будет списком, читатель устанет. Чередуйте: абзац, список, абзац, подзаголовок.

    Куда вставлять ключевые слова в структуре

    В предыдущей статье я рассказывал про ключевые слова. Но там речь шла о том, где их искать. А теперь — куда их вписывать в структуру.

    Вот что я понял на своём опыте.

    • Title — главное ключевое слово должно быть в начале. Например, «Структура статьи: что влияет на SEO» — здесь ключевое слово «структура статьи» стоит в начале.

    • H1 — ключевое слово обязательно. H1 и Title могут отличаться, но ключевое слово или фраза должны быть в обоих.

    • Первый абзац — ключевое слово должно быть в первом абзаце и лучше всего в первом предложении. Это помогает поисковикам сразу понять, о чём статья.

    • H2 — в одном-двух подзаголовках можно использовать ключевое слово или его вариации. Но не во всех — это выглядит неестественно.

    • Alt-тексты изображений — если в статье есть картинки, в alt-тексте можно использовать ключевое слово, если это уместно.

    • Отрывок — в описании статьи тоже можно использовать ключевое слово.

    И вот что я понял: повторять ключевое слово двадцать раз не нужно. Это не работает. Важнее качество и структура.

    Ошибки, которые я совершал со структурой

    Я не могу сказать, что всё получилось сразу. Было несколько ошибок, которые я исправлял уже после публикации.

    Первая: несколько H1 на странице. Я не понимал, что H1 должен быть один. В некоторых статьях я ставил H1 в начале, а потом ещё один H1 где-то в середине. Поисковик не мог понять, какой из них главный. Пришлось переделывать.

    Вторая: длинные абзацы. Я писал по 10–15 строк в одном абзаце. Думал, что так солиднее. На самом деле — так утомительнее. Теперь я разбиваю на короткие абзацы и вижу, что читатели дольше остаются на странице.

    Третья: отсутствие подзаголовков. В первых статьях я писал сплошным текстом. Без H2, без H3. Поисковик не мог разобраться, где какая часть. Теперь я всегда делю статью на разделы с подзаголовками.

    Четвёртая: пропуск уровней заголовков. Я использовал H3 без H2 перед ним. Это нарушает иерархию. Теперь я всегда иду по порядку: H1 → H2 → H3.

    Пятая: списки ради списков. Я начал пихать списки везде, где можно. Даже там, где логичнее был обычный текст. Это выглядело странно. Теперь я использую списки только там, где действительно есть перечисление.

    Что я понял про структуру статьи

    Структура — это не украшение, а необходимость. Без неё поисковик не понимает статью, а читатель уходит. С ней — статья работает на вас.

    Заголовки — это каркас. H1, H2, H3 — это не просто жирный шрифт. Это иерархия, которая говорит поисковику, что главное, а что второстепенное.

    Короткие абзацы — это уважение к читателю. Люди не читают длинные тексты. Они сканируют. Если хотите, чтобы вас читали — пишите коротко и по делу.

    Списки помогают, но не заменяют текст. Списки — это инструмент. Использовать их нужно там, где есть перечисление. Не больше.

    Структура влияет на SEO не меньше, чем ключевые слова. Можно идеально подобрать ключевые слова, но если статья не структурирована — она не будет работать.

    Что делать, если вы только начинаете

    Не пытайтесь охватить всё сразу. Начните с простого.

    • Пишите короткие абзацы. Одна мысль — один абзац.

    • Используйте H2 для основных разделов. Минимум два-три на статью.

    • Используйте H3 для подразделов, если раздел получается большим.

    • Добавляйте списки, когда есть перечисление.

    • Вставляйте ключевое слово в Title, H1 и первый абзац.

    • Проверяйте, что у вас только один H1 на странице.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Я не говорю, что структура — это легко. Но это проще, чем кажется, когда начинаешь разбираться. Главное — не бояться.

    Если вы тоже чувствуете, что застряли, что ваши статьи не индексируются, что читатели уходят сразу — остановитесь. Посмотрите на свою статью глазами поисковика. Есть ли заголовки? Понятна ли структура? Если нет — начните с этого.

    Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Ключевые слова: где искать и как вписывать — объясняю на своём опыте

    Ключевые слова: где искать и как вписывать — объясняю на своём опыте

    Когда я только начал писать статьи для своего блога, я был уверен: главное — писать интересно. От души. Без оглядки на какие-то там ключевые слова. Я писал так, как мне казалось правильно. Потом я посмотрел на Яндекс.Метрику и увидел: ноль переходов из поиска. Ноль.

    Я начал разбираться почему так. Статьи есть, сайт работает, тексты нормальные. Почему никто не находит? Ответ оказался простым: я писал для себя, а не для тех, кто ищет информацию. Я не использовал те слова, которые они вводят в поисковую строку.

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

    Что такое ключевые слова и почему они нужны

    Ключевые слова — это то, что люди вводят в поиск. Если по-простому: это слова которые человек пишет в строке Яндекса или Google, когда хочет что-то найти.

    Например, пишу статью про настройку SEO в WordPress. Ключевые слова могут быть такими: «SEO в WordPress», «настройка SEO без плагинов», «как настроить SEO на сайте». Именно эти фразы люди вводят, когда хотят найти то, о чём я пишу. Я уже разбирал в прошлой статье, как поисковики понимают запросы и решают, что показать. Если коротко — они анализируют текст на странице и смотрят, насколько он соответствует запросу. Чем лучше текст оптимизирован под нужные запросы, тем выше шанс попасть в топ.

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

    Но тут важный момент. Ключевые слова — это не просто набор слов, которые нужно вставить в текст. Это отражение того, что люди ищут. Поймёшь, что они хотят найти — напишешь статью, которая действительно поможет.

    Где искать ключевые слова: бесплатные инструменты, которые я использую

    Я не покупаю дорогие сервисы вроде Ahrefs или SEMrush. Мне хватает бесплатных. Вот те, которыми пользуюсь сам.

    Яндекс.Вордстат

    Интерфейс Яндекс.Вордстат для подбора ключевых слов: поисковая строка, список похожих запросов и график частотности.

    Один из главных инструментов для подбора ключевых слов в русском интернете. Показывает, сколько раз в месяц пользователи вводят Ваш запрос. Бесплатно, нужен только аккаунт Яндекса.

    Как я это делаю. Захожу на wordstat.yandex.ru, ввожу базовое слово — например, «SEO». Мне в ответ wordstat показывает, сколько раз это слово искали за последний месяц, и список похожих запросов. Например: «SEO для сайта», «SEO настройка WordPress», «SEO без плагинов». Из этого списка выбираю те, что подходят к теме статьи.

    Есть полезные операторы. Если поставить слово в кавычки — «настройка SEO» — Вордстат покажет только точные вхождения. Если поставить восклицательный знак — !настройка !SEO — зафиксирует словоформы. Это помогает отсеять лишнее.

    Честно говоря, когда я впервые открыл Вордстат, я растерялся. Слишком много данных. Потом понял: не нужно смотреть на всё сразу. Начни с одного базового слова, посмотри похожие запросы, выбери 5–10 самых подходящих. Этого достаточно для одной статьи.

    Google Keyword Planner

    Аналог Вордстата, но для Google. Инструмент от Google Ads — показывает частотность запросов и уровень конкуренции. Хотя он заточен под рекламные кампании, для SEO тоже подходит.

    Я использую его, чтобы проверить, какие запросы популярны в Google. Иногда данные отличаются от Яндекса. Это нормально — аудитории разные. Если хочешь трафик из Google, тогда надо создать аккаунт в Google Ads. Запускать рекламу не надо — можно просто анализировать.

    Подсказки поисковых систем

    Самый быстрый и простой способ. Вводишь запрос в Яндекс или Google — появляется выдача. Популярные запросы. Они формируются на основе реальных запросов людей.

    Я пишу в поиск «как настроить SEO…» и смотрю, что предлагает поиск: «как настроить SEO на сайте», «как настроить SEO в WordPress», «как настроить SEO без плагинов». Это подсказки — готовые ключевые фразы, которые люди реально ищут. Смотрю все варианты и выбираю подходящие к теме. Занимает пару минут, но даёт хорошие идеи.

    Google Search Console

    Официальный инструмент Google для вебмастеров. Я зарегистрировал сайт в Search Console и теперь вижу, по каким запросам люди находят мои страницы.

    Что это даёт. В разделе «Performance» есть список запросов, по которым сайт показывается в поиске. Видно, сколько показов, сколько кликов, какая средняя позиция. Реальные данные, а не оценки сторонних сервисов.

    Я использую Search Console двумя способами. Во-первых, смотрю, по каким запросам меня уже находят — это подсказывает, какие темы развивать. Во-вторых с низкими кликами. Это значит, страница показывается, но её не открывают. Значит надо улучшить заголовок или описание.

    Яндекс.Вебмастер

    Аналог Search Console от Яндекса. В Вебмастере есть раздел «Подбор запросов и анализ рынка» — бесплатный инструмент для подбора целевых запросов. В базе — статистика по сотням миллионов запросов.

    Использую его, чтобы найти запросы с низкой конкурентностью. Вводишь базовое слово, выбираешь регион, система показывает, какие запросы популярны, а какие нет. Помогает найти нишу, где можно конкурировать.

    Ещё в Вебмастере есть раздел «Мониторинг запросов» — видны реальные запросы, по которым сайт показывается в Яндексе.

    Как вписывать ключевые слова в текст: практические правила

    Найти ключевые слова — половина дела. Вторая половина — вписать их так, чтобы текст оставался живым. Вот что я понял на своём опыте.

    Главное правило: ключевые слова должны быть в правильных местах

    Есть места, где ключевое слово обязательно надо написать. Это не значит, что нужно впихнуть его везде. Это значит, что есть части статьи, которые поисковики считают важными.

    • Title (заголовок страницы) — то, что отображается во вкладке браузера и в результатах поиска. Главное ключевое слово должно быть в начале заголовка. Например, «Ключевые слова: где искать и как вписывать» — здесь «ключевые слова» стоит в начале.

    • H1 (заголовок статьи) — главный заголовок на странице. Должен содержать ключевое слово и отражать суть статьи. H1 может отличаться от Title, но должен быть с ним связан.

    • Первый абзац — ключевое слово должно появиться в первом абзаце, желательно ближе к началу. Это помогает поисковику сразу понять, о чём страница.

    • Подзаголовки H2 — в одном-двух подзаголовках основного текста можно использовать ключевое слово или его вариации. Но не во всех — это выглядит неестественно.

    И вот что я понял: повторять ключевое слово двадцать раз не нужно. Это не работает. Google сам говорил, что плотность ключевых слов давно не фактор ранжирования. Важнее качество и релевантность.

    Не забывай про естественность

    Самая большая ошибка, которую я совершал, — вставлял ключевые слова так, что текст становился роботом. Например: «Настройка SEO в WordPress. SEO в WordPress — это важно. Если вы хотите настроить SEO в WordPress, вам нужно…» — это ужасно. И люди это чувствуют, и поисковики это не любят.

    Сейчас я делаю иначе. Сначала пишу статью так, как мне хочется. Потом читаю её вслух и спрашиваю себя: «Если бы я рассказывал это другу, я бы так сказал?» Если нет — переписываю. Ключевые слова вплетаются в текст естественно, как часть разговора.

    Вот пример. Вместо фразы «Ключевые слова для SEO важны для продвижения» я теперь пишу «Когда я начал использовать ключевые слова, которые люди реально ищут в поиске, ситуация изменилась». Смысл тот же, но звучит лучше.

    Используй синонимы и связанные слова

    Поисковики давно научились понимать не только точные вхождения, но и синонимы. Если пишешь про «ключевые слова», можно упомянуть «поисковые запросы», «фразы для SEO», «семантику». Это и текст обогащает, и помогает охватить больше запросов.

    Я не зацикливаюсь на одном слове. Если статья про настройку SEO, упоминаю «оптимизацию», «мета-теги», «индексацию». Все эти слова связаны с темой, и поисковик это понимает.

    Не забывай про alt-тексты и отрывок

    В предыдущей статье я рассказывал про alt для изображений и отрывок в WordPress. Это тоже места, куда можно вписать ключевые слова.

    Alt-текст для картинки должен описывать изображение и содержать ключевое слово, если это уместно. Например, для скриншота с настройками SEO я пишу: «Настройка SEO-полей в редакторе WordPress». Ключевое слово «SEO» есть, но звучит естественно.

    Отрывок — краткое описание статьи. Пишу 25–35 слов, в которых передаю суть и использую ключевые слова. Если SEO-описание не заполнено, WordPress может использовать отрывок как мета-описание. Так что это ещё и дополнительный инструмент.

    Мой алгоритм: как я работаю с ключевыми словами

    Алгоритм работы с ключевыми словами: от определения темы до публикации, с выделением мест вставки в Title, H1 и первом абзаце.

    Вот что я делаю, когда сажусь писать новую статью.

    • Определяю тему. О чём вообще статья? Например, «настройка SEO в WordPress без плагинов».

    • Ищу ключевые слова. Открываю Яндекс.Вордстат, ввожу базовое слово, смотрю похожие запросы. Записываю 5–10 вариантов. Потом проверяю в Google Keyword Planner и смотрю подсказки в поисковиках.

    • Выбираю главное ключевое слово. То, которое лучше всего описывает тему. Остальные становятся вспомогательными.

    • Пишу статью. Сначала просто пишу текст, не думая о ключевых словах. Так проще, и текст получается живым.

    • Проверяю и вставляю. Потом читаю статью и смотрю, где можно естественно вписать ключевые слова. Проверяю, есть ли главное слово в Title, H1, первом абзаце. Если нет — добавляю.

    • Заполняю SEO-поля. Пишу Title и Description, используя ключевые слова. Заполняю alt-тексты для картинок. Заполняю отрывок.

    • Публикую и проверяю. После публикации открываю страницу, смотрю код, проверяю, всё ли на месте. Отправляю страницу на переобход в Яндекс.Вебмастер и Google Search Console.

    Это занимает время. Но это работает.

    Что я понял за это время

    Ключевые слова — это не самоцель, а инструмент. Они помогают людям найти твой контент. Но если контент плохой, никакие ключевые слова не помогут.

    Не нужно гнаться за высокой частотностью. Запросы с сотнями тысяч показов в месяц — огромная конкуренция. Для молодого сайта лучше выбирать низкочастотные запросы. Конкретные, длинные фразы, которые ищут меньше людей, но с большей вероятностью прочитают.

    Естественность важнее всего. Если текст звучит как робот, люди уйдут. Если текст звучит как разговор, люди останутся. Поисковики это чувствуют.

    Это навык, который приходит с практикой. Сначала сложно. Потом привыкаешь. Начинаешь интуитивно чувствовать, какие слова искать и как их вписывать.

    Что делать, если вы только начинаете

    Не пытайтесь охватить всё сразу. Начните с простого.

    • Откройте Яндекс.Вордстат и введите базовое слово по теме вашей статьи.

    • Посмотрите похожие запросы и выпишите 5–7 штук.

    • Выберите одно главное ключевое слово.

    • Напишите статью и вставьте главное слово в Title, H1 и первый абзац.

    • Заполните Description, alt-тексты и отрывок.

    • Опубликуйте и проверьте.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Я не говорю, что SEO — это легко. Но это проще, чем кажется, когда начинаешь разбираться. Главное — не бояться.

    Если вы тоже чувствуете, что застряли, что ваш сайт не находят, что статьи пишутся в пустоту — остановитесь. Начните с ключевых слов. Посмотрите, что люди ищут. И напишите то, что им нужно.

    Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Как я ускорил свой блог до 97 баллов PageSpeed: полный код без SEO-плагинов

    Как я ускорил свой блог до 97 баллов PageSpeed: полный код без SEO-плагинов

    Сначала важное

    Эта статья — для тех, кто НЕ использует SEO-плагины. Если у вас стоит Yoast, Rank Math, All in One SEO или подобное — код ниже может с ними конфликтовать. Плагины генерируют свои title, description, canonical, Open Graph, Schema.org. Мой код делает то же самое вручную. Если поставите мой код с SEO плагинами — получите дубли мета-тегов, и поисковики запутаются.

    Всё, что описано ниже, я писал и тестировал на чистой теме Twenty Twenty-Five с дочерней темой. Без SEO-плагинов. Только код.

    Если вы пока не готовы отказаться от плагинов — просто прочитайте, вникните в логику.

    С чего всё началось

    Я долго думал, что бесплатный плагин кэширования — это хорошо. WP Fastest Cache, миллион установок и  мне его посоветовал DeepSeek. Поставил, настроил, забыл.

    А потом заметил: правило 410 Gone для удалённой страницы не срабатывает. Google видит 404 вместо 410. Полез в .htaccess — а там блок от WP Fastest Cache с флагом [L]. Плагин перехватывает запрос раньше моих правил и отдаёт кэшированную 404-страницу.

    Копнул глубже. Отключил плагин, чтобы протестировать 410. И на автомате прогнал PageSpeed.

    Было: 74. Стало: 97.

    Я не поверил. Прогнал ещё раз — 97. Другую статью — 95. И тогда я увидел, что плагин, который должен ускорять сайт, его замедлил.

    Скриншоты: с плагином и без

    Вот сравнение для одной и той же страницы — статьи «Как работает поиск Яндекса и Google».

    С WP Fastest Cache (мобильный тест): производительность 78. Скриптов много, LCP высокий.

    Без WP Fastest Cache (та же страница): производительность 97, все метрики в зелёной зоне.

    Данные pagespeed.web без плагина

    И вторая пара — страница «От идеи до работающего плагина на Python».

    С плагином: 74 балла.

    Показатель статьи в pagespeed.webс плагином

    Без плагина: 95 баллов.

    Без плагина лучше для pagespeed.web

    Обратите внимание на детали. Без WP Fastest Cache улучшились все показатели:

    МетрикаС плагиномБез плагина
    Производительность74–7895–97
    Специальные возможности96100
    Рекомендации9696
    Поисковая оптимизация100100

    Почему бесплатный плагин замедлял сайт

    Расскажу по пунктам, что именно я нашёл и понял. Это важно понять, чтобы не наступить на те же грабли.

    Причина 1. Лишний JavaScript. Бесплатные версии плагинов живут за счёт продаж PRO. Значит, они должны напоминать о PRO. Баннеры, upsell-скрипты, скрытые трекеры — часть попадает на фронтенд.

    Причина 2. Конфликты с кодом. WP Fastest Cache лезет в .htaccess, кэширует всё подряд, включая 404-страницы. Мои правила 410 Gone не работали. Google видел кэшированный 404 вместо честного 410.

    Причина 3. Кэш поверх оптимизаций. Я настроил sizes, добавил fetchpriority, предзагрузку шрифтов. А плагин кэшировал старые HTML-версии страниц, где этих оптимизаций не было. Я улучшал сайт — а посетители получали старую версию.

    Причина 4. Кэш не нужен маленькому сайту. Блог из 20 статей с посещаемостью 100 человек в день. PHP отрабатывает за 50 мс, база за 10 мс. Плагин добавляет 200 мс на инициализацию и проверки. В итоге у Вас минус, а не плюс.

    Что я сделал вместо плагина

    Пошёл проверенным своим способом. Просто написал код, который я понимаю и контролирую. Разберу его для Вас по блокам.

    Блок 1. Исправление атрибута sizes для изображений

    Тема генерировала sizes="(max-width: 1152px) 100vw, 1152px", хотя контейнер контента всего 645px. Браузер послушно качал картинку шириной 1152px вместо 768px. Экономия на одной картинке — до 60% размера.

    php
    /**
     * ИСПРАВЛЕНИЕ: размер изображений в srcset / sizes.
     * Заставляет браузер выбирать картинки под ширину колонки контента (645px),
     * а не под ширину экрана. Экономит до 500 КБ на мобильных.
     */
    function milyutin_fix_image_sizes_attribute( $sizes, $size, $image_src, $image_meta ) {
        if ( is_admin() ) {
            return $sizes;
        }
        return '(max-width: 645px) 100vw, 645px';
    }
    add_filter( 'wp_calculate_image_sizes', 'milyutin_fix_image_sizes_attribute', 10, 4 );

    Браузер теперь выбирает картинку под ширину контейнера 645px. Вместо версии 1152px — берёт 768px. Разница в весе — в разы.

    Блок 2. fetchpriority для первого изображения

    Это сигнал браузеру: «вот эту картинку грузи первой, она важная для LCP».

    php
    /**
     * Добавляем fetchpriority="high" первому изображению в контенте для улучшения LCP.
     */
    function milyutin_add_fetchpriority_to_first_image( $content ) {
        if ( ! is_singular() ) {
            return $content;
        }
        if ( preg_match( '/<img[^>]+>/i', $content, $matches ) ) {
            $first_img = $matches[0];
            $new_img = str_replace( 'loading="lazy"', '', $first_img );
            $new_img = str_replace( '<img', '<img fetchpriority="high"', $new_img );
            $content = str_replace( $first_img, $new_img, $content );
        }
        return $content;
    }
    add_filter( 'the_content', 'milyutin_add_fetchpriority_to_first_image', 5 );

    Первая картинка в статье загружается приоритетно, без lazy. Браузер не ждёт прокрутки. LCP улучшается.

    Блок 3. Предзагрузка локальных шрифтов

    Шрифты — часто самое узкое место. Браузер скачивает CSS, находит в нём ссылки на шрифты, и только потом начинает их грузить. Предзагрузка ломает эту цепочку.

    php
    /**
     * Предзагрузка локальных шрифтов.
     */
    function milyutin_preload_local_fonts() {
        $fonts = array(
            'https://milyutin-codes.ru/wp-content/themes/twentytwentyfive/assets/fonts/manrope/Manrope-VariableFont_wght.woff2',
            'https://milyutin-codes.ru/wp-content/themes/twentytwentyfive/assets/fonts/fira-code/FiraCode-VariableFont_wght.woff2',
        );
        foreach ( $fonts as $font_url ) {
            echo '<link rel="preload" href="' . esc_url( $font_url ) . '" as="font" type="font/woff2" crossorigin>' . "\n";
        }
    }
    add_action( 'wp_head', 'milyutin_preload_local_fonts', 1 );

    Важно: замените URL шрифтов на свои. Откройте исходный код страницы, поищите woff2 — увидите пути. Либо посмотрите в папке темы /assets/fonts/.

    Блок 4. Defer для некритичных скриптов

    comment-reply и hoverintent нужны не сразу. Их можно отложить, чтобы не блокировали рендеринг.

    php
    /**
     * Добавляем defer к некритичным скриптам для снижения TBT.
     */
    function milyutin_defer_non_critical_scripts( $tag, $handle ) {
        $defer_scripts = array(
            'comment-reply',
            'hoverintent-js',
        );
        if ( in_array( $handle, $defer_scripts, true ) ) {
            return str_replace( ' src=', ' defer src=', $tag );
        }
        return $tag;
    }
    add_filter( 'script_loader_tag', 'milyutin_defer_non_critical_scripts', 10, 2 );

    Скрипты загружаются параллельно, но выполняются после парсинга HTML. TBT (Total Blocking Time) снижается.

    Блок 5. Исключение архивов из кэша (если кэш остался)

    Если вы всё-таки оставили какой-то кэширующий плагин — попросите его не кэшировать архивы. Они обновляются часто, а кэш только вредит.

    php
    /**
     * Исключаем архивы из кэша WP Fastest Cache.
     * Если плагин удалён — функция просто не сработает, ничего не сломает.
     */
    function milyutin_exclude_archive_pages_from_cache() {
        if ( is_home() || is_front_page() || is_category() ) {
            if ( function_exists( 'wpfc_exclude_current_page' ) ) {
                wpfc_exclude_current_page();
            }
        }
    }
    add_action( 'wp', 'milyutin_exclude_archive_pages_from_cache' );

    Если WP Fastest Cache установлен — архивы не кэшируются. Если удалён — функция просто не вызовется.

    Блок 6. 410 Gone для удалённых страниц через .htaccess

    Это не PHP, а конфиг сервера. Правило говорит поисковикам: «страница удалена навсегда, забудьте про неё». Google убирает такие страницы из индекса быстрее, чем 404.

    Откройте .htaccess в корне сайта. Найдите блок # BEGIN WordPress. Перед ним вставьте:

    apache
    # ========== 410 GONE ДЛЯ УДАЛЁННЫХ СТРАНИЦ ==========
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^novosti-ii/?$ - [G,L]
    </IfModule>
    # ========== КОНЕЦ БЛОКА ==========

    Важно: novosti-ii — это пример. Замените на слаг вашей удалённой страницы. Если страниц несколько — добавьте правила по аналогии:

    apache
    RewriteRule ^staraya-stranica/?$ - [G,L]
    RewriteRule ^eshchyo-odna/?$ - [G,L]

    G — возвращает 410 Gone. L — останавливает обработку, WordPress не перехватит запрос.

    Подводный камень: если у вас стоит плагин кэширования — он может перехватить запрос раньше. У меня так и было. Именно это и стало первым признаком, что плагин мне не помогает.

    Как я столкнулся с проблемой оптимизации картинок

    Когда я разобрался с кэшем и увидел 97 баллов, осталась одна нерешённая задача — изображения. JPEG-файлы весили по 80–300 КБ. Google в отчёте PageSpeed прямым текстом писал: «Конвертируйте в WebP, сэкономите 500 КБ».

    Я поставил Converter for Media. Плагин с громким описанием: «Ускорьте работу сайта с помощью конвертера WebP и AVIF!». Звучало идеально. Бесплатный, в каталоге WordPress, миллион установок.

    А потом я открыл его настройки. И понял: бесплатная версия практически ничего не делает. Да, там есть кнопка «Конвертировать», но:

    • AVIF недоступен — только в PRO.

    • Массовая конвертация всей медиатеки — ограничена или отсутствует.

    • Автоконвертация при загрузке новых файлов — только в PRO.

    • Отдача через <picture> с правильным srcset — только в PRO.

    То есть плагин как бы есть. Но пользы от него — почти ноль. Он просто висит в админке и напоминает: «купи PRO, купи PRO».

    И тогда я решил: напишу свой плагин. Без PRO, без ограничений, без чужих трекеров. Только код, который делает ровно то, что нужно мне.

    Так я сделал Milyutin Image Optimizer — плагин, который:

    • конвертирует JPG/PNG в WebP и AVIF через Imagick или GD;

    • делает массовую конвертацию всей медиатеки батчами по 5 файлов через AJAX;

    • автоматически конвертирует новые изображения при загрузке;

    • отдаёт изображения через <picture> с правильным порядком: AVIF → WebP → оригинал;

    • ведёт лог и статистику экономии;

    • не требует PRO, не показывает баннеры, не следит за вами.

    Скачать плагин можно на моей странице «Мои плагины». Там же — инструкция по установке и настройке.

    Но я не хочу, чтобы вы просто скачали и поставили мой плагин. Я хочу, чтобы вы поняли, как его сделать. Потому что чужой код сложно понять. А свой код, лучше и понятнее.

    Ниже — промпт для DeepSeek, с которым вы сможете создать точно такой же плагин самостоятельно. Я даю его в том виде, в котором сам его написал. Скопируйте, вставьте в DeepSeek — и получите рабочий плагин.

    Промпт для DeepSeek: создаём свой аналог Converter for Media

    Скопируйте этот текст целиком и отправьте в DeepSeek. Не нужно ничего добавлять, не нужно объяснять — всё уже внутри.

    text
    Ты — опытный WordPress-разработчик на PHP 8+. Напиши мне полноценный плагин для WordPress, который я могу установить на свой сайт и который будет делать бесплатно то, что в плагине Converter for Media доступно только в PRO-версии.
    
    ## Что должен делать плагин
    
    Плагин конвертирует изображения JPG и PNG в современные форматы WebP и AVIF. Он должен:
    
    1. **Автоматически конвертировать новые изображения** при загрузке в медиатеку. Сработать после того, как WordPress создаст все размеры (хук `wp_generate_attachment_metadata`).
    
    2. **Уметь массово конвертировать все старые изображения**, которые уже есть на сайте. Работать это должно батчами по 5–10 файлов через admin-ajax.php, чтобы не упасть по таймауту. С прогресс-баром в админке.
    
    3. **Отдавать изображения на фронтенде через `<picture>`** с порядком источников AVIF → WebP → оригинал. Заменять `<img>` на `<picture>` через фильтры `wp_content_img_tag` и `wp_get_attachment_image`. При этом корректно обрабатывать `srcset` и `sizes` — если хотя бы один размер не сконвертирован, формат пропускается.
    
    4. **Иметь страницу настроек в админке**: тумблер авто-конвертации, выбор форматов (WebP, AVIF или оба), ползунки качества для каждого формата, кнопка запуска массовой конвертации, отображение статистики (сколько сконвертировано, сколько ошибок, сколько сэкономлено байт), лог операций.
    
    5. **Проверять поддержку форматов на сервере** через Imagick и GD. Показывать пользователю статус: Imagick, WebP, AVIF. Если формат не поддерживается — предупреждать и пропускать.
    
    6. **Приоритет конвертации**: сначала через Imagick (более качественный результат, лучшее сжатие), если Imagick недоступен или упал — использовать GD через WP_Image_Editor.
    
    ## Технические требования
    
    - PHP 8.0+.
    - WordPress 6.0+.
    - Классовая структура: отдельные классы для логгера, конвертера, настроек, массовой конвертации и фронтенда. Один главный класс-бутстрап.
    - Безопасность: nonce в AJAX-запросах, `current_user_can('manage_options')` для всех админских действий, `sanitize_callback` для настроек, `esc_attr`/`esc_html` при выводе, `$wpdb->prepare()` для запросов к базе.
    - Никаких внешних зависимостей, никаких трекеров, никакой отправки данных на сторонние серверы.
    - Опции хранить через `update_option` с `autoload = false`, чтобы не грузить их на каждой странице.
    - При удалении плагина через `uninstall.php` — удалять настройки, лог и статистику. **Но не удалять сконвертированные файлы** — они нужны сайту.
    
    ## Структура плагина
    
    Сделай такую структуру файлов:
    
    milyutin-image-optimizer/
    ├── milyutin-image-optimizer.php
    ├── uninstall.php
    ├── includes/
    │   ├── class-mio-logger.php
    │   ├── class-mio-converter.php
    │   ├── class-mio-settings.php
    │   ├── class-mio-bulk.php
    │   └── class-mio-frontend.php
    └── assets/
        ├── css/admin.css
        └── js/admin.js
    
    ## Обязательные элементы в шапке главного файла
    
    Plugin Name: Milyutin Image Optimizer
    Plugin URI:  https://milyutin-codes.ru
    Description: Конвертация JPG/PNG в WebP и AVIF для ускорения сайта. Массовая и автоматическая конвертация, отдача через <picture>.
    Version:     1.0.0
    Author:      Константин Милютин
    Author URI:  https://milyutin-codes.ru
    License:     GPL-2.0-or-later
    Text Domain: milyutin-image-optimizer
    Requires at least: 6.0
    Requires PHP: 8.0
    
    ## Брендинг автора
    
    На странице настроек плагина сделай отдельный блок «Автор плагина» со ссылками:
    - Сайт: https://milyutin-codes.ru
    - Группа ВКонтакте: https://vk.com/milyutin_codes
    
    Стилизуй блок мягко, с градиентом, чтобы он выделялся.
    
    ## Качество кода
    
    - Не используй устаревшие функции и практики.
    - Пиши чистый, читаемый код с комментариями на русском языке.
    - Не используй `extract()`, не подавляй ошибки через `@` без необходимости.
    - Все регулярные выражения и строки — с экранированием.
    - Логику конвертации вынеси в отдельный метод, чтобы её можно было легко расширить.
    
    ## Формат ответа
    
    Выдай ответ пошагово:
    
    **Шаг 1.** Создайте папку wp-content/plugins/milyutin-image-optimizer/ и подпапки includes/, assets/css/, assets/js/.
    
    **Шаг 2.** Создайте файл milyutin-image-optimizer.php и вставьте в него код: [полный код]
    
    **Шаг 3.** Создайте файл includes/class-mio-logger.php и вставьте в него код: [полный код]
    
    **Шаг 4.** Создайте файл includes/class-mio-converter.php и вставьте в него код: [полный код]
    
    **Шаг 5.** Создайте файл includes/class-mio-settings.php и вставьте в него код: [полный код]
    
    **Шаг 6.** Создайте файл includes/class-mio-bulk.php и вставьте в него код: [полный код]
    
    **Шаг 7.** Создайте файл includes/class-mio-frontend.php и вставьте в него код: [полный код]
    
    **Шаг 8.** Создайте файл assets/css/admin.css и вставьте в него код: [полный код]
    
    **Шаг 9.** Создайте файл assets/js/admin.js и вставьте в него код: [полный код]
    
    **Шаг 10.** Создайте файл uninstall.php и вставьте в него код: [полный код]
    
    **Шаг 11.** Заархивируйте папку milyutin-image-optimizer целиком в ZIP.
    
    **Шаг 12.** В админке WordPress: Плагины → Добавить новый → Загрузить плагин → выбрать ZIP → Установить → Активировать.
    
    **Шаг 13.** Зайдите в меню «Milyutin Image Opt.» в админке. Проверьте статус сервера (Imagick, WebP, AVIF). Настройте ползунки качества (рекомендую WebP = 82, AVIF = 50). Сохраните.
    
    **Шаг 14.** Нажмите «Запустить массовую конвертацию». Дождитесь завершения — страница перезагрузится автоматически.
    
    **Шаг 15.** Опубликуйте новую статью с картинкой и проверьте: в исходном коде страницы изображение должно быть обёрнуто в `<picture>` с источником WebP или AVIF.
    
    Начни с Шага 1 и выдай полный код каждого файла полностью, без сокращений. Не используй многоточия и не пиши «и так далее». Я хочу получить готовый к установке плагин.

    Как использовать этот промпт

    Откройте DeepSeek. Скопируйте текст промпта выше целиком. Вставьте в чат. Дождитесь ответа — DeepSeek выдаст код пошагово.

    Если ответ получился неполным (например, DeepSeek сократил какой-то файл) — напишите ему: «Продолжи, ты сократил файл X. Выдай его полный код без многоточий».

    Что делать после того, как DeepSeek выдаст код

    Соберите плагин так, как описано в предыдущем разделе. Я специально дал в промпте пошаговую инструкцию, чтобы DeepSeek сам её продублировал в ответе — вам останется просто следовать.

    Проверьте главное: в файле class-mio-converter.php должен быть метод make_webp() и make_avif(). Первый пробует Imagick, если не получается — падает на GD. Второй — только Imagick или GD с AVIF (PHP 8.1+). Если AVIF на вашем хостинге не поддерживается — плагин должен просто пропустить этот формат и работать только с WebP.

    Проверьте безопасность: во всех AJAX-запросах должен быть check_ajax_referer, а в class-mio-settings.php — sanitize_callback в register_setting.

    Если что-то не так — не стесняйтесь просить DeepSeek переписать конкретный файл. Он умеет.

    Что делать вам

    Шаг 1. Отключите WP Fastest Cache (и другие кэширующие плагины). Не удаляйте — отключите. Прогоните PageSpeed. Сравните с тем, что было.

    Шаг 2. Если показатели выросли — оставьте плагин отключённым. Удалите его через панель WordPress.

    Шаг 3. Скопируйте код из статьи в functions.php дочерней темы. Замените пути к шрифтам на свои.

    Шаг 4. Настройте .htaccess для 410 Gone, если у вас есть удалённые страницы.

    Шаг 5. Создайте плагин оптимизации картинок по промпту выше (если возникнут вопросы, то пишите мне).

    Шаг 6. Прогоните PageSpeed ещё раз. Не ждите идеала сразу — сначала может быть 80–85. Дальше добираете мелочами.

    Шаг 7. Отправьте sitemap в Яндекс.Вебмастер и Google Search Console. Запросите переобход изменённых страниц.

    Чего не делать

    Не ставьте новые плагины «для скорости». Не покупайте PRO-версии, не разобравшись, зачем они вам. Не кэшируйте всё подряд — кэш на маленьком сайте только вредит.

    И не бойтесь удалять. Плагин — это инструмент. Если инструмент мешает — его выбрасывают.

    Итог

    Я удалил WP Fastest Cache и получил 97 баллов на мобильном (На ПК показатели моего сайта изначально почти все 100 баллов). Не потому что плагин плохой сам по себе. А потому что для моего сайта он был лишним звеном.

    Потом я столкнулся с проблемой оптимизации картинок. Поставил Converter for Media — и понял, что бесплатная версия ничего не делает. Написал свой плагин. Теперь у меня есть инструмент, который я понимаю от начала до конца.

    Всё, что я использовал для ускорения — это шесть блоков кода и один плагин. Их можно разобрать за вечер. И они не сломаются при обновлении чужих плагинов, потому что это мой код.

    Мы строим то, что останется. А чужой код — остаётся чужим.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Как работает поиск Яндекса и Google: объясняю простыми словами, без заумных терминов

    Как работает поиск Яндекса и Google: объясняю простыми словами, без заумных терминов

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

    Потом я зашёл в Яндекс.Вебмастер и увидел, что моего сайта там нет. Ни одной страницы. Я потратил месяцы на код и статьи, а результата — ноль. Вот тогда до меня дошло: надо понять, как эта штука SEO работает. Не «поставь плагин и всё наладится», а по-настоящему. В прошлой статье я разбирал, что такое SEO в целом. А сегодня копну глубже — как именно работают Яндекс и Google.

    Главное, что нужно понять сразу

    И Яндекс, и Google — это не просто «поисковые строки». Это огромные системы. Они постоянно сканируют интернет, собирают информацию о страницах, выстраивают их по полезности. Всё автоматически. Без человека.

    Всё делают алгоритмы. И если хочешь, чтобы твой сайт был в топе, придётся понять, как они работают.

    Три этапа, через которые проходит каждая страница

    Схема одна у всех: сканирование, индексирование, ранжирование. Разберём по порядку.

    Этап 1: Сканирование (или обход сайта)

    По интернету бродят тысячи маленьких роботов. Их называют «поисковыми роботами» или «пауками». У Яндекса — YandexBot, у Google — Googlebot.

    Они ходят по сайтам, переходят по ссылкам, собирают информацию. Не спят, не едят, не устают.

    Как робот узнаёт о новом сайте? Может найти ссылку на тебя с другого ресурса. А можешь сам ему сообщить — через Sitemap, Яндекс.Вебмастер или Google Search Console.

    Я когда запустил блог, был уверен: поисковики сами всё найдут. Наивный. Найдут, конечно. Но это может занять недели или даже месяцы. Гораздо быстрее — сказать им самому.

    Этап 2: Индексирование

    Робот просканировал страницу, передал информацию на сервер. Там она обрабатывается и попадает в базу — поисковый индекс. Это и есть индексирование.

    Представь библиотеку. Ты хочешь найти книгу. Ты же не идёшь наугад по всем полкам — смотришь в каталог. Вот и поисковик так же: если страницы нет в его каталоге, он её не покажет.

    Что именно он анализирует? Текст, картинки, видео. Всё это сохраняется в базе.

    Но не все страницы туда попадают. Некоторые закрыты через robots.txt. Некоторые удаляются, если дублируют другие. Некоторые просто не проходят проверку на качество.

    Если страницы нет в индексе — её никто не найдёт через поиск. Как книга, которой нет в каталоге: стоит на полке, но никто не знает где.

    Этап 3: Ранжирование

    Три этапа работы поисковых систем: сканирование, индексирование и ранжирование страниц сайта.

    Пользователь вводит запрос. Поисковик не просто показывает все страницы, где есть это слово. Он выстраивает их по важности. Это ранжирование.

    Представь, ты ищешь «как починить кран». Тебе не нужны все страницы, где встречается слово «кран». Тебе нужна та, где написано, как починить кран. Вот это и есть релевантность — соответствие запросу.

    Релевантная страница — та, что лучше всего отвечает на вопрос. Не просто содержит нужные слова, а реально решает задачу.

    Что влияет на ранжирование

    Тут самое интересное и загадочное. Google и Яндекс используют каждый свои сложные алгоритмы, которые оценивают десятки факторов и добавили на свое вооружение ИИ (Ai). Точные факторы никто не знает — это коммерческая тайна. Но базовые принципы известны.

    Релевантность контента. Насколько страница отвечает на запрос. Если человек ищет «как настроить SEO в WordPress», а на странице написано «SEO — это важно» — нерелевантно. Если там пошаговая инструкция с кодом — релевантно.

    Качество контента. Полезен ли текст? Понятен? Есть ответ? Яндекс даже ввёл аббревиатуру для оценки — ЭПОС: Экспертность, Полезность, Оригинальность, Содержательность. Смотрят не на количество ключевых слов, а на реальную ценность. Разбирается ли автор в теме? Помогает ли статья решить задачу? Есть ли что-то новое, а не пересказ?

    Авторитетность сайта. Доверяют ли поисковики ресурсу. Зависит от многого: как давно существует сайт, сколько на него ссылаются, как часто обновляется контент, есть ли история нарушений.

    Поведенческие факторы. Как ведут себя люди на сайте. Остаются? Читают дальше? Переходят по ссылкам? Или сразу возвращаются в поиск? Если быстро уходят — поисковик может решить, что страница некачественная.

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

    Чем Яндекс отличается от Google

    Сравнение поиска Яндекса и Google: поведенческие факторы, ссылочный авторитет, скорость индексации и требования к оригинальности контента.

    Многие думают, что Яндекс и Google работают одинаково. Не совсем. Я заметил несколько отличий.

    Яндекс больше смотрит на поведенческие факторы. Google в большей степени полагается на ссылочный авторитет и качество контента. А Яндекс смотрит, как люди ведут себя на сайте. Он лучше понимает русскоязычную аудиторию.

    Google быстрее индексирует новые страницы. На моём опыте Google индексирует новые статьи быстрее. Иногда хватает нескольких дней. Яндекс может тянуть неделями. Но это не значит, что Google лучше. Просто подходы разные.

    Яндекс больше ценит оригинальность. Жёстче относится к перепечаткам и дублям. Если статья — просто пересказ чужого материала, шансов попасть в топ мало. Google тоже не любит дубли, но может дать шанс, если контент полезен.

    Что я понял, пока разбирался

    Поисковики — это алгоритмы. Они работают по правилам. Понимаешь правила — можешь влиять на результат. Не на 100%, но можешь.

    Нет секретной кнопки «в топ». Никто не может гарантировать первое место. Даже если заплатишь. Те, кто обещает такое — врут.

    SEO — это игра в долгую. Не жди результатов через день. Индексация занимает недели. Ранжирование — месяцы. Если готов работать в долгую — SEO твой инструмент.

    Качество контента важнее всего. Можно идеально настроить мета-теги, но без полезного контента это бесполезно. Поисковики становятся всё умнее. Они учатся понимать, что действительно полезно.

    Что делать, если ты только начинаешь

    Не пытайся охватить всё сразу. Начни с базы.

    Зарегистрируй сайт в Яндекс.Вебмастере и Google Search Console. Это официальные сервисы, которые позволяют сообщить поисковикам о своём существовании. Создай robots.txt и sitemap.xml — роботы быстрее найдут страницы. Настрой ЧПУ, чтобы адреса были понятными, а не ?p=123. Заполни title и description для главной. Напиши первую статью и опубликуй.

    Этого достаточно, чтобы начать. Остальное придёт с опытом. Я уже рассказывал, как настроил всё это вручную, без единого SEO-плагина — можешь почитать, если хочешь конкретных шагов.

    Я не говорю, что SEO — это легко. Но это проще, чем кажется, когда начинаешь разбираться. Главное — не бояться.

    Если ты тоже чувствуешь, что застрял, что твой сайт не находят, что статьи пишутся в пустоту — остановись. Посмотри на свой сайт глазами поисковика. Сделай базу. И тогда контент, который ты пишешь, начнут находить.

    Подписывайся на мой блог, читай другие статьи, делись опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Что такое SEO и за что оно отвечает: объясняю на пальцах, как я сам понял

    Что такое SEO и за что оно отвечает: объясняю на пальцах, как я сам понял

    Когда я только начинал свой путь в IT, слово «SEO» вызывало у меня непонимание. Плагины, мета-теги, алгоритмы, какие-то «семантические ядра» — от всего этого голова шла кругом. Я думал: «Мне бы код писать, а не вот это вот всё».

    А потом я заглянул в Яндекс.Вебмастер и увидел, что моего сайта там нет. Совсем. Ни одной страницы в индексе. Месяцы работы — а результата ноль. Тогда я понял: без SEO мой блог просто не существует для поисковиков. Как будто его нет.

    Сегодня я хочу объяснить, что такое SEO, максимально простым языком. Без заумных терминов. Так, как я сам это понял, когда начинал разбираться с нуля.

    Если ты читал мои предыдущие статьи, ты знаешь: я разработчик-самоучка. Начинал с PHP, потом перешёл на Python, написал плагин для ВК, выложил его в WordPress.org, прошёл четыре раунда ревью. А потом взял паузу в разработке, чтобы писать статьи. И вот тогда я столкнулся с SEO лицом к лицу.

    SEO — что это?

    Если по-простому, SEO — это поисковая оптимизация (Search Engine Optimization). То есть процесс работы с сайтом, с помощью которого поисковые системы — Яндекс и Google — находят страницы твоего сайта и показывают их людям.

    Суть простая: ты делаешь так, чтобы поисковик понял, о чём твой сайт, и показал его тем, кто ищет что-то похожее.

    Google в своей официальной документации формулирует так: SEO — это «усилия по улучшению того, как ваш сайт отображается в поиске Google». То есть ты не просто создаёшь контент — ты помогаешь поисковику понять, что этот контент полезен и заслуживает внимания.

    Когда я это осознал, всё встало на свои места. SEO — это не магия. Это дисциплина. Как техника безопасности на станке. Ты просто делаешь всё правильно, и оно работает.

    Как поисковики находят сайты: три этапа, которые важно понять

    Чтобы разобраться в SEO, нужно сначала понять, как работают поисковые системы. Если по-простому, процесс состоит из трёх этапов: сканирование, индексация и ранжирование.

    Этап 1: Сканирование (краулинг)

    Представь, что в интернете работает огромное количество маленьких роботов. Они называются «пауками» или «краулерами». Эти роботы постоянно ходят по сайтам, переходят по ссылкам и собирают информацию о страницах.

    Робот Яндекса называется YandexBot, робот Google — Googlebot. Они не спят, не едят и не устают. Они просто бродят по интернету и запоминают, что где находится.

    Как робот узнаёт о новом сайте? Если ты только что создал сайт, робот может найти его двумя способами: либо ты сам сообщишь ему о существовании сайта — через специальные сервисы вроде Яндекс.Вебмастера или Google Search Console, либо кто-то другой поставит ссылку на твой сайт со своего ресурса.

    Помню, когда я только запустил свой блог, я был уверен, что поисковики сами всё найдут. Наивный. Они, конечно, найдут — но это может занять недели или даже месяцы. Гораздо быстрее — сказать им самому.

    Этап 2: Индексация

    После того как робот просканировал страницу, он передаёт информацию на сервер поисковой системы. Там она обрабатывается и добавляется в специальную базу — поисковый индекс. Этот процесс называется индексацией.

    Можно представить это как каталог в библиотеке. Когда ты приходишь в библиотеку и хочешь найти книгу, ты не идёшь её наугад по всем полкам. Ты смотришь в каталог — там указано, какая книга где стоит. Поисковый индекс — это такой же каталог, только для страниц в интернете.

    Если страница не в индексе, её никто не найдёт через поиск. Это как книга, которой нет в каталоге библиотеки — она физически стоит на полке, но никто не знает, где её искать.

    Я помню, как впервые проверил свой сайт в Яндексе через оператор site:. Ничего не нашлось. Мой блог не был проиндексирован. Это было неприятно. Я осознал, что все статьи, которые я написал, были невидимы для поисковиков.

    Этап 3: Ранжирование

    Когда пользователь вводит запрос, поисковая система не просто показывает все страницы, где встречается это слово. Она выстраивает ответы на запрос в порядке важности и полезности. Это называется ранжированием.

    Позиция страницы сайта в выдаче зависит от множества факторов. Поисковики Google и Яндекс используют сложные алгоритмы, которые оценивают:

    • Релевантность контента — насколько страница отвечает на запрос пользователя.

    • Качество контента — полезен ли текст, понятен ли он, есть ли ответ на вопрос.

    • Авторитетность сайта — доверяют ли поисковики этому ресурсу.

    • Поведенческие факторы — как ведут себя пользователи на сайте: остаются, уходят сразу, читают дальше.

    • Техническое состояние сайта — скорость загрузки, мобильная адаптация, наличие ошибок.

    Важно понимать: никто не знает точный алгоритм ранжирования, а сейчас они ещё стали использовать ИИ (Ai) . Google и Яндекс не раскрывают все свои секреты. Но базовые принципы известны, и их достаточно, чтобы начать.

    Три этапа работы поисковых систем: сканирование, индексация и ранжирование страниц сайта.

    За что конкретно отвечает SEO?

    Когда я начинал разбираться, мне казалось, что SEO — это что-то абстрактное. Но на самом деле SEO отвечает за конкретные вещи. Вот за что.

    За то, чтобы поисковики вообще узнали о твоём сайте

    Это первый и самый важный шаг. Если поисковик не знает о существовании твоего сайта, никакой SEO не поможет. Ты можешь написать гениальные статьи, но их никто не увидит.

    Как я это делал: зарегистрировал сайт в Яндекс.Вебмастере и Google Search Console. Это официальные сервисы, которые позволяют сообщить поисковикам о своём существовании. После регистрации нужно подтвердить, что сайт действительно твой — например, добавить специальный мета-тег в код страницы.

    За то, чтобы роботы добавили страницы в индекс

    После того как поисковик узнал о сайте, нужно, чтобы страницы были проиндексированы. Для этого я создал файл sitemap.xml — это карта сайта, в которой находится список всех страниц, которые я хочу показать поисковикам. Sitemap надо отправить в Яндекс.Вебмастер и Google Search Console. Так роботы быстрее узнают о новых статьях.

    Кроме того, я настроил файл robots.txt — он говорит роботам, какие страницы я разрешаю индексировать, а какие страницы запрещаю. Служебные страницы вроде /wp-admin/ я закрыл, а статьи — открыл.

    За то, чтобы статьи были понятны поисковикам

    Поисковый робот — это программа. Он не «читает» текст так, как человек. Он анализирует структуру страницы: заголовки, подзаголовки, ссылки, мета-теги. Если структура понятная, робот быстрее поймёт, о чём статья.

    Я настроил для каждой статьи уникальный title — заголовок, который отображается во вкладке браузера и в результатах выдачи поиска. И description — это краткое описание, его видно под заголовком в выдаче. Это базовые вещи и они сильно влияют на то, как твоя статья выглядит в выдаче поиска.

    Alt-текст для изображений: то, что я долго игнорировал

    Честно говоря, про alt-тексты я узнал не сразу. Я просто загружал картинки в статьи, давал им имена вроде IMG_2026_09_11.jpg и не парился. А потом DeepSeek спросил меня: «А ты заполняешь alt для изображений?» И я понял, что нет. Совсем.

    Что такое alt-текст? Это альтернативное описание изображения. Оно не видно на странице, но оно есть в HTML-коде. Поисковый робот не «видит» картинку — он не может понять, что на ней нарисовано. Но он может прочитать alt-текст и понять, о чём изображение.

    Зачем это нужно? Во-первых, для доступности. Если у человека плохое зрение и он использует скринридер, alt-текст озвучивается вслух. Во-вторых, для SEO. Если alt-текст заполнен правильно, изображение может попасть в поиск по картинкам. А это дополнительный трафик на сайт.

    Вот как я теперь это делаю. Во-первых, даю файлу осмысленное имя перед загрузкой. Не IMG_1234.jpg, а, например, seo-nastrojka-wordpress-bez-plaginov.jpg. Во-вторых, заполняю поле «Альтернативный текст» при вставке изображения в пост. Или в медиатеке — там есть отдельное поле «Alt-текст».

    Что писать в alt? Описание того, что изображено. Кратко и по делу. Если это скриншот с настройками — напиши «Настройка SEO-полей в редакторе WordPress». Если это график — «График роста трафика за три месяца». Если это твоё фото — «Константин Милютин за работой над кодом».

    Я не пишу туда ключевые слова через запятую. Это выглядит неестественно и может быть воспринято как спам. Лучше описать изображение так, как ты бы рассказал о нём другу. Просто, понятно, по делу.

    Сейчас я проверяю каждую картинку перед публикацией. Это занимает минуту, но даёт плюс к SEO. И я жалею, что не делал этого раньше.

    Отрывок в WordPress: зачем он нужен и как его заполнять

    Отрывок — это ещё одна вещь, которую я недооценивал. В WordPress у каждой записи есть поле «Отрывок» (Excerpt). Оно находится в редакторе поста — обычно под основным полем ввода текста. Если его не видно, включи через «Настройки экрана» в правом верхнем углу.

    Что такое отрывок? Это краткая выжимка из поста. Она отображается на главной странице блога, в архивах, в результатах внутреннего поиска. Если ты не заполнил отрывок вручную, WordPress автоматически берёт первые несколько предложений из текста. Но это не всегда хорошо.

    Почему? Потому что первые предложения могут быть не самыми информативными. Или слишком длинными. Или обрываться на полуслове. А отрывок, который ты написал сам, — это твоя визитная карточка. Он показывает читателю, о чём статья, и помогает решить, стоит ли её открывать.

    Вот что я понял: отрывок — это не просто анонс. Это ещё и инструмент SEO. Если SEO-описание не заполнено, WordPress может использовать отрывок как мета-описание. И тогда то, что ты напишешь в отрывке, попадёт в результаты поиска.

    Как я заполняю отрывок? Пишу 25–35 слов. Примерно 150–160 символов. Кратко передаю суть статьи. Например, для статьи про SEO я написал бы: «Разбираю, что такое SEO, как работают поисковики и за что отвечает оптимизация. Простым языком, с примерами из личного опыта».

    Зачем это нужно? Во-первых, улучшает внешний вид анонсов на сайте. Во-вторых, помогает посетителям быстрее понять, о чём статья. В-третьих, работает как мета-описание, если ты не заполнил SEO-поле. Один раз написал — и работает на тебя.

    Я заполняю отрывок для каждой статьи. Это занимает пару минут, но результат заметен. Анонсы выглядят аккуратно, читатели чаще кликают, а поисковики лучше понимают, о чём страница.

    Если ты только начинаешь, не игнорируй эти два поля — alt для картинок и отрывок для постов. Они кажутся мелочами, но из таких мелочей и складывается SEO.

    За то, чтобы статьи кликали

    Даже если статья находится в топе, это не значит, что её будут открывать. Всё зависит от того, как она выглядит в результатах поиска. Заголовок должен быть привлекательным. Описание — понятным. Адрес страницы — читаемым.

    Я заметил: когда я начал писать description вручную, а не оставлять поле пустым, кликабельность выросла. Люди чаще переходят по ссылкам, где понятно, о чём статья.

    Почему без SEO сайт не существует

    Сайт без SEO как магазин без вывески: поисковики не находят страницы, посетители проходят мимо.

    Вот простая аналогия. Представь, что ты открыл магазин в подвале без вывески. Товар у тебя отличный, цены хорошие, обслуживание на уровне. Но люди просто не знают, что ты существуешь. Они ходят мимо, потому что не видят входа.

    SEO — это вывеска, указатель и реклама твоего магазина. Без него тебя не найдут.

    Я понял это на своём опыте. Я писал статьи, вкладывал в них время и силы. Но пока сайт не был настроен для поисковиков, эти статьи были невидимы. Ноль трафика. Ноль читателей. Ноль отдачи.

    Когда я настроил SEO — не идеально, но хотя бы базово — ситуация начала меняться. Страницы стали индексироваться. Появились первые переходы из поиска. Первые читатели.

    Это не произошло мгновенно. Индексация занимает время. Ранжирование — тем более. Но без SEO этого не произошло бы вообще.

    Что я понял про SEO, пока разбирался

    Первое: SEO — это не магия, а дисциплина. Нет секретной кнопки, которая выведет сайт в топ. Есть набор правил, которые нужно соблюдать. Регулярно. Последовательно.

    Второе: SEO не работает в вакууме. Ты можешь идеально настроить мета-теги, но без контента это бесполезно. SEO = 20% техники + 80% контента. Техническая часть нужна, чтобы поисковик понял твой сайт. Контент нужен, чтобы пользователю было что читать.

    Третье: SEO — это долгосрочная работа. Не жди результатов через день. Индексация занимает недели. Ранжирование — месяцы. Если ты готов работать вдолгую — SEO твой инструмент.

    Четвёртое: SEO можно освоить самому. Мне никто не объяснял. Я читал документацию Google, задавал вопросы DeepSeek, пробовал, ошибался, исправлял. И в итоге разобрался. Ты тоже сможешь. Я уже рассказывал, как настроил SEO вручную без плагинов — можешь почитать, если хочешь конкретики.

    Что делать, если ты только начинаешь

    Не пытайся охватить всё сразу. Начни с базы.

    • Добавь сайт в панели управления Яндекс.Вебмастер и Google Search Console.

    • Создай файлы robots.txt и sitemap.xml.

    • Настрой ЧПУ — понятные адреса страниц вместо ?p=123.

    • Заполни title,description, Alt изображения и Отрывок для WordPress для главной страницы.

    • Напиши первую статью с заполненными title,description, Alt изображения, Отрывок для WordPress  и опубликуй её.

    Этого достаточно, чтобы начать. Остальное придёт с опытом.

    Я не говорю, что SEO — это легко. Но это проще, чем кажется, когда начинаешь разбираться. Главное — не бояться.

    Если ты тоже чувствуешь, что застрял, что твой сайт не находят, что статьи пишутся в пустоту — остановись. Посмотри на свой сайт глазами поисковика. Сделай базу. И тогда контент, который ты пишешь, начнут находить.

    Подписывайся на мой блог, читай другие статьи, делись опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • SEO — это проще, чем кажется: мой опыт ручной настройки без плагинов

    SEO — это проще, чем кажется: мой опыт ручной настройки без плагинов

    SEO — это проще, чем кажется: мой опыт ручной настройки без плагинов

    Честно говоря, я долго думал, что SEO — это что-то из области высшего образования которому надо учиться много лет. Ну, ты знаешь про что я: плагины, мета-теги, какие-то там алгоритмы, которые меняются каждый день. Я смотрел на это и думал: «Блин, у меня нет времени разбираться во всём этом. Я лучше код напишу».

    Я разработчик-самоучка. Начинал с PHP, потом перешёл на Python, написал плагин для автопостинга в ВК, выложил его в WordPress.org, прошёл четыре проверки для исправления ошибок. А потом взял паузу в разработке, чтобы писать статьи. И вот тогда я заглянул в Яндекс.Вебмастер и понял: мой сайт там себя чувствует плохо. Яндекс отклоняет мои страницы в индексе.

    Я потратил месяцы на код, на статьи, а поисковики меня просто не видели. Это был удар. Я осознал, что строил сайт без фундамента. Красивый, с хорошей навигацией, но без фундамента. SEO — это фундамент.

    И тогда я решил: хватит бояться и я в этом разберусь сам (а у меня склад ума математический и я люблю докапываться до истинны). Я настрою SEO вручную. Без плагинов. И Вы не поверите в мой результат! Это оказалось проще, чем я думал.

    Вот результат

    идеальное SEO

    Почему я вообще решил, что SEO — это сложно

    Потому что все вокруг говорят: «Поставь Yoast, поставь Rank Math, купи PRO-версию». И создаётся ощущение, что без этих плагинов ты никто. Что SEO — это отдельная профессия, где нужно учиться годами.

    Я тоже так думал. Пока не начал разбираться. Оказалось, что 80% SEO — это базовые вещи которые есть в wordpress. Заголовок, описание, robots.txt, sitemap и контент. Всё остальное — тонкости, которые приходят с опытом.

    Если по-простому: SEO — это не магия. Это дисциплина. Как техника безопасности на станке. Ты просто делаешь всё правильно, и оно работает.

    Что на самом деле важно в SEO (а что можно отложить)

    Заголовки и описания

    Самое простое и самое важное. У каждой страницы должен быть уникальный title и description. Всё. Не надо писать их через плагин. Я сделал два поля в редакторе постов через functions.php дочерней темы — и всё работает.

    Если не заполнить вручную, я генерирую описание из первых 160 символов текста. Это не идеально, но лучше, чем ничего. Главное — не оставлять поля пустыми.

    Robots.txt и sitemap

    Robots.txt и sitemap

    Robots.txt — это файл, который говорит поисковикам, что можно индексировать, а что нельзя. Я закрыл служебные папки, архивы и поиск. Открыл только статьи и рубрики.

    Sitemap — это карта сайта. Я сделал её динамической через код. Она автоматически обновляется при публикации новых постов. Да, пришлось повозиться с правилами ЧПУ, но это заняло один час.

    Помню, сначала sitemap был недоступен. Потом все даты lastmod были одинаковыми. Я обращался к DeepSeek, мы вместе искали ошибки. И нашли. Сейчас всё работает.

    Контент — король

    Сколько бы ты ни настраивал SEO, без контента это бесполезно. Я пишу статьи каждую неделю. Пусть не идеальные, но живые. И они индексируются.

    Я понял простую вещь: SEO = 20% техники + 80% контента. Техническая часть у меня почти идеальная. Теперь важно наполнять сайт полезными материалами. И этим я сейчас и занимаюсь!

    Как я настроил SEO вручную за один вечеров

    Вот мой чек-лист. Может, и Вам пригодится.

    • Создал дочернюю тему Twenty Twenty-Five. Не трогаю родительскую — только свою.

    • Добавил в functions.php мета-боксы для SEO-заголовка и описания.

    • Настроил автоматический вывод description в head.

    • Добавил noindex, follow для архивов, чтобы не плодить дубли.

    • Сделал канонические ссылки для пагинации и без GET-параметров.

    • Добавил Open Graph и Twitter Cards — чтобы ссылки красиво выглядели в ВК и Telegram.

    • Внедрил Schema.org разметку для статей и хлебных крошек.

    • Написал свой sitemap.xml через add_rewrite_rule и template_redirect.

    • Создал robots.txt в корне сайта.

    Всё это — без единого SEO-плагина. Только код. И да, я пользовался DeepSeek, чтобы не запутаться. Но код писал сам, разбирался сам.

    Как я проверял, что всё работает

    Как я проверял, что всё работает

     

    Я не могу сказать, что всё получилось с первого раза. Это было далеко не так. Это был бой с DeepSeek.

    Сначала DeepSeek сказал, что sitemap недоступен. Я исправил. Потом — что Open Graph на странице блога дублирует главную. Я исправил. Потом — что Schema.org на странице блога описывает конкретную статью, а не архив. Я исправил.

    А потом мы застряли. Страница /blog/ загружала список статей через JavaScript. В HTML-коде не было ни одной ссылки на статьи. Для поискового робота это выглядело так, будто на странице нет контента. DeepSeek предложил вывести список статей через WP_Query прямо в шаблоне. Я попробовал. И это сработало.

    Как я проверяю сейчас: открываю любую страницу, нажимаю «Посмотреть код» и ищу title, description, Open Graph, Schema. Потом открываю sitemap.xml и robots.txt. И отправляю sitemap в Яндекс.Вебмастер и Google Search Console.

    Главные ошибки, которые я совершил

    Первая: я думал, что SEO — это быстро и просто. Нет. Индексация занимает время и настройка SEO. Мой сайт до сих пор не в топе, но он уже в индексе. Это главное.

    Вторая: я закрыл robots.txt всё подряд. Рубрики, метки, архивы. Думал, так лучше. Оказалось, я лишил себя трафика. Пришлось переделывать.

    Третья: я забыл про alt-тексты для картинок. Теперь заполняю всегда. Это просто и даёт плюс к SEO.

    Четвёртая: я не сразу понял, что плагины — это не всегда решение. Я отказался от Yoast и Rank Math. Да, было сложнее. Да, пришлось разбираться. Но теперь я понимаю, как всё работает. И могу контролировать каждый аспект.

    Что я понял: SEO — это не магия, а дисциплина

    Если по-простому, SEO — это набор правил. Ты просто делаешь всё правильно, и оно работает. Не нужно быть гуру. Не нужно покупать курсы. Нужно понять базу и не лениться заполнять поля.

    Я не говорю, что SEO — это легко. Но это проще, чем кажется. Особенно если ты умеешь писать код или пользоваться ИИ.

    Самое сложное для меня было — не код. Самое сложное — перестать бояться и начать разбираться. Когда я понял, что SEO — это просто последовательность шагов, всё встало на свои места.

    Что делать, если ты тоже боишься SEO

    Начни с малого. Проверь, индексируется ли твой сайт. Открой Яндекс.Вебмастер и Google Search Console. Посмотри, есть ли sitemap. Настрой robots.txt. Заполни title и description для главной страницы.

    Это займёт пару часов. Но это уже база. Дальше — больше.

    Если ты увлёкся программированием и забыл о SEO — остановись на минуту. Проверь свой сайт. Посмотри, индексируется ли он. Есть ли у тебя sitemap. Правильно ли настроен robots.txt.

    Это не так сложно, как кажется. Да, придётся разобраться. Да, будет не с первого раза. Но это стоит того. Потому что сайт, который не находят люди, — это сайт, который не существует.

    Я не жалею, что отказался от SEO-плагинов. Да, пришлось разбираться. Но теперь я понимаю, как всё работает. И могу менять что угодно без оглядки на разработчиков плагинов и не платить деньги за доступ к полному SEO.

    Если ты тоже чувствуешь, что застрял — остановись. Посмотри на свой сайт глазами поисковика. Сделай базу. И тогда контент, который ты пишешь, начнут находить.

    Подписывайся на мой блог, читай другие статьи, делись опытом. Вместе мы строим то, что останется.

    Автор: Константин Милютин
    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com

  • Почему я взял паузу в разработке и начал писать статьи: что изменилось в моём подходе

    Почему я взял паузу в разработке и начал писать статьи: что изменилось в моём подходе

    Меня зовут Константин Милютин. Это мой дневник — место, где я фиксирую свой путь в IT с помощью ИИ, свои ошибки и выводы. Это блог не для развлекательного контента. Этот блог мой отчёт о проделанной работе и об опыте, который я приобретаю каждый день. Цель блога — помочь Вам не совершать мои ошибки и быстрее прийти к результату.

    Если ты читал мои предыдущие записи, ты знаешь: я прошёл длинный путь. Начинал с PHP-плагина, перешёл на Python, написал с помощью ИИ плагин для автопостинга в ВК, выложил его в официальный репозиторий WordPress.org, а потом отказался его продавать. Я исправил больше 30 ошибок, прошёл четыре раунда ревью, настроил SEO вручную без плагинов. Для  SEO правил код и создал дочернюю тему с помощью deepseek. 

    И вот теперь я беру паузу. Не потому, что устал. И не потому, что всё сломалось. А потому, что понял одну важную вещь: я слишком долго воевал с платформами и забыл, зачем всё это делаю.

    Сегодня я хочу разобраться в этом. Зафиксировать. Понять, почему пауза в разработке — это не отказ от мечты, а осознанная стратегия. И почему я решил сфокусироваться на контенте, а не на коде.

    Как я понял, что пора остановиться

    Всё началось с VK API. Мой плагин для автопостинга в ВК работал стабильно, но потом ВК ввёл новые ограничения. Из-за этого сервис, через который плагин получал доступ к API, перестал работать. И как следствие — мой плагин перестал публиковать картинки. Текст и ссылка на статью публикует, а изображения — нет.

    Я не переписывал код. Я не искал обходные пути. Потому что проблема была не в моём коде. Проблема была в том, что ВК изменил правила. И никакие мои усилия не могли это исправить.

    Потом WordPress.org заблокировал доступ к странице моего плагина. Просто так, без объяснений. Через несколько дней доступ вернули, но осадок остался. Я понял, что я не контролирую свою же работу. Я завишу от чужих решений.

    И тогда я задал себе вопрос: «А зачем мне это?»

    Я вспомнил, зачем я вообще начал программировать. Я хотел создавать полезные инструменты. Я хотел делиться опытом. Я хотел учиться и расти. Но вместо этого я тратил всё время на борьбу с платформами, которые меняют правила без предупреждения.

    Это выматывает. Это приносит временный результат. И это не то, чем я хочу заниматься.

    Что сломалось и чему это меня научило

    Я не буду делать вид, что всё было гладко. Было несколько моментов, которые меня действительно выбили из колеи.

    Что сломалось и чему это меня научило

    Первое — VK API. Когда ВКонтакте ввёл ограничения, сервис, через который мой плагин получал доступ к API, перестал работать. Картинки перестали публиковаться. Текст и ссылка на статью уходят, а изображения — нет. Я начал искать в чем проблема, чтобы понять, что происходит. Как оказалось проблема была не в моём коде. Проблема была в том, что ВК решил ограничить доступ. И это не в моих силах.

    Второе — WordPress.org. Когда доступ к странице плагина заблокировали, я сначала подумал, что это ошибка. Потом — что это связано с обновлением. Но потом понял: это просто очередное событие с которым я ничего не мог сделать.

    И тогда я понял: я завишу от платформ. Я не контролирую свою работу. Я не могу гарантировать, что завтра всё будет работать так же, как сегодня.

    Это не то, что я хочу. Это не то, ради чего я начал этот путь.

    Почему пауза — это не отказ, а стратегия

    Я хочу зафиксировать одну вещь: я не бросаю программирование. Я не отказываюсь от своих проектов. Я просто меняю приоритеты.

    Пауза в разработке — это не слабость. Это осознанное решение. Я понял, что тратить всё время на борьбу с платформами — это путь в никуда. Я не могу построить что-то стабильное, если я завишу от чужих API и чужих правил.

    Но что я могу построить? Что не зависит от платформ? Что работает годами и не ломается при обновлении?

    Ответ прост: контент.

    Контент — это единственный актив, который работает годами. Он не зависит от API. Он не ломается при обновлении платформ. Он не блокируется без предупреждения. Он живёт своей жизнью и приносит пользу людям.

    Именно поэтому я решил сфокусироваться на контенте. Я буду писать статьи. Я буду делиться опытом. Я буду строить блог, который не зависит от капризов платформ.

    Разработка никуда не уходит, так как мне нужен опыт. Я просто пока что не буду делиться тем, над чем работаю. Когда я буду точно знать, что нужно моим читателям. Когда я буду уверен, что мой код не сломается через месяц. Я начну об этом рассказывать.

    А пока — контент. Полезные статьи. Живые истории. Честные выводы.

    Что я делаю, пока не пишу код и что изменилось в моём подходе

    Что я делаю, пока не пишу код

    Моя пауза в разработке — это не безделье. Я не сижу и не жду, когда что-то изменится. Я работаю. Просто иначе.

    Первое — я пишу статьи. Каждую неделю я публикую новый материал. Это может быть история о моём опыте, разбор ошибок, практический совет или просто размышление. Главное — чтобы это было полезно.

    Второе — я строю план контента. Я не пишу хаотично. У меня есть план на несколько месяцев вперёд. Я знаю, какие темы буду раскрывать, какие истории рассказывать, какие выводы делать. Но они могут меняться исходя из моего опыта.

    Третье — я учусь писать лучше. Я работаю с ИИ, но не позволяю ему писать за меня. Я использую его как помощника: для структуры, для идей, для проверки. Но голос остаётся моим.

    Четвёртое — я строю сообщество единомышленников. Я не жду, что люди придут сами. Я делюсь статьями в группе ВК, отвечаю на вопросы, общаюсь с читателями. Я строю сообщество единомышленников.

    Пятое — я не забываю про разработку. Я не забрасываю код. Я просто не гонюсь за моментным результатом. Сейчас есть действительно важные для меня идеи, как найду способ сделать их стабильными и независимыми, я вернусь к полной их разработке. Но сейчас мой приоритет — контент.

    Это не значит, что я перестал быть разработчиком. Это значит, что я стал ещё и автором. И это только улучшило моё понимание того, что я делаю.

    Что дальше?

    Я не знаю, когда вернусь к разработке. Может быть, через месяц. Может быть, через год. Но я знаю точно: я не брошу программирование. Я просто меняю приоритеты.

    Сейчас мой фокус — контент. Я буду писать статьи. Я буду делиться опытом. Я буду строить блог, который помогает людям.

    А когда придёт время — я покажу Вам код. Но это будет уже другой код. Это будет код, который я напишу с ясным пониманием того, что нужно моим читателям и мне. Это будет код, который я напишу с уверенностью, а не бояться, что он перестанет работать из-за правил платформ.

    Потому что я понял главное: я не бросаю программирование. Я меняю свои приоритеты.

    И это — правильное решение.

    Если ты тоже чувствуешь и понимаешь, что застрял в борьбе с правилами платформ, если ты устал от того, что твои проекты ломаются из-за чужих решений — остановись. Подумай. Может быть, тебе тоже стоит взять паузу. Сфокусироваться на контенте. Сделать проект, который не зависит от капризов платформ.

    Это не слабость. Это стратегия. И это работает.

    Читай мой дневник, подписывайся на обновления, делись своим опытом. Вместе мы строим то, что останется.

    Группа ВК: vk.com/milyutin_codes
    Email: milyutinkv@gmail.com