в Блог

Удалил сео плагин – Yoast Seo WordPress. И вот почему…

Всем привет! Наконец-то удалил сео плагин – Yoast Seo для WordPress и больше не использую сео плагины вообще. В 2026 году поисковики ранжируют смысл и скорость, а не количество тегов и избыточного функционала от плагинов.

Сейчас я использую собственное решение вместо SEO-плагина. Это честный, прозрачный и самый быстрый способ оптимизировать блог в 2026 году.

Ниже покажу, какой код для functions.php дочерней темы Independent Publisher я использую сейчас.

Слежу за ситуацией и в случае чего дополняю или изменяю. Актуальный код ниже…

Код вместо Seo плагина

/**
* ============================================================
* ПОЛНАЯ ЗАМЕНА YOAST SEO — ВЕРСИЯ 2026 (июль)
* Без дублей, без лишнего мусора, только нужное
* ============================================================
*/

// ============================================================
// 1. КАСТОМНЫЕ ПОЛЯ ДЛЯ ТАЙТЛА И ОПИСАНИЯ (как в Yoast)
// ============================================================

// Добавляем метабоксы под редактором
add_action('add_meta_boxes', function() {
add_meta_box(
'seo_meta_box', 
'🔍 SEO-настройки (замена Yoast)', 
'seo_meta_box_callback', 
['post', 'page'], 
'normal', 
'high'
);
});

function seo_meta_box_callback($post) {
$seo_title = get_post_meta($post->ID, '_seo_title', true);
$seo_desc = get_post_meta($post->ID, '_seo_desc', true);
wp_nonce_field('seo_meta_box', 'seo_meta_box_nonce');
?>
<p>
<label style="font-weight:bold;">SEO-заголовок (тайтл):</label><br>
<input type="text" name="seo_title" value="<?php echo esc_attr($seo_title); ?>" 
style="width:100%; padding:8px; border:1px solid #ccc;" 
placeholder="Оставьте пустым для автоматического заголовка" />
<span style="color:#666;font-size:12px;">Рекомендуемая длина: 50-60 символов</span>
</p>
<p>
<label style="font-weight:bold;">Мета-описание:</label><br>
<textarea name="seo_desc" rows="3" style="width:100%; padding:8px; border:1px solid #ccc;" 
placeholder="Краткое описание для поисковиков"><?php echo esc_textarea($seo_desc); ?></textarea>
<span style="color:#666;font-size:12px;">Рекомендуемая длина: 150-160 символов</span>
</p>
<?php
}

// Сохраняем значения полей
add_action('save_post', function($post_id) {
if (!isset($_POST['seo_meta_box_nonce']) || !wp_verify_nonce($_POST['seo_meta_box_nonce'], 'seo_meta_box')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}

if (isset($_POST['seo_title'])) {
update_post_meta($post_id, '_seo_title', sanitize_text_field($_POST['seo_title']));
}

if (isset($_POST['seo_desc'])) {
update_post_meta($post_id, '_seo_desc', sanitize_textarea_field($_POST['seo_desc']));
}
});

// ============================================================
// 2. ВЫВОД ТАЙТЛА И META-ОПИСАНИЯ (ТОЛЬКО ДЛЯ ПОИСКОВИКОВ)
// ============================================================

// Тайтл: если заполнен кастомный — выводим ТОЛЬКО его
add_filter('document_title_parts', function($parts) {
if (is_singular() && $custom_title = get_post_meta(get_the_ID(), '_seo_title', true)) {
return ['title' => $custom_title];
}
return $parts;
});

// Robots: правильная директива для поисковиков
add_action('wp_head', function() {
echo '<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />' . "\n";
}, 1);


// Meta description для поисковиков (с fallback)
add_action('wp_head', function() {
if (is_singular()) {
// Сначала берём из кастомного поля
$desc = get_post_meta(get_the_ID(), '_seo_desc', true);

// Если пусто — берём отрывок (excerpt)
if (empty($desc)) {
$desc = get_the_excerpt();
}

if ($desc) {
echo '<meta name="description" content="' . esc_attr($desc) . '" />' . "\n";
}
}
}, 2);

// ============================================================
// 3. OPEN GRAPH (превью для соцсетей)
// ============================================================

add_action('wp_head', function() {
if (is_singular() || is_home() || is_front_page()) {
$title = wp_get_document_title();
$desc = get_post_meta(get_the_ID(), '_seo_desc', true) ?: get_the_excerpt() ?: get_bloginfo('description');
$img = has_post_thumbnail() ? get_the_post_thumbnail_url(get_the_ID(), 'full') : '';
$url = get_permalink() ?: home_url();
?>
<meta property="og:title" content="<?php echo esc_attr($title); ?>" />
<meta property="og:description" content="<?php echo esc_attr(wp_trim_words($desc, 30)); ?>" />
<?php if ($img): ?>
<meta property="og:image" content="<?php echo esc_url($img); ?>" />
<?php endif; ?>
<meta property="og:url" content="<?php echo esc_url($url); ?>" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="<?php bloginfo('name'); ?>" />
<meta name="twitter:card" content="summary_large_image" />
<?php
}
}, 3);

// ============================================================
// 4. СХЕМА-РАЗМЕТКА (Article для Google)
// ============================================================

add_action('wp_head', function() {
if (is_singular('post')) {
$author_id = get_post_field('post_author', get_the_ID());
$author_name = get_the_author_meta('display_name', $author_id); 
$date = get_the_date('c');
$modified = get_the_modified_date('c');
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "<?php echo esc_js(get_the_title()); ?>",
"datePublished": "<?php echo $date; ?>",
"dateModified": "<?php echo $modified; ?>",
"author": {"@type": "Person", "name": "<?php echo esc_js($author_name); ?>"},
"publisher": {"@type": "Organization", "name": "<?php echo esc_js(get_bloginfo('name')); ?>"}
}
</script>
<?php
}
}, 4);

// ============================================================
// 5. ВКЛЮЧАЕМ НАТИВНУЮ ПОДДЕРЖКУ ТАЙТЛОВ WP
// ============================================================

add_theme_support('title-tag');

// Разрешаем красивые разделители в тайтлах (если не заполнен кастомный)
add_filter('document_title_separator', function() { 
return '—';
});

// ============================================================
// 6. ЧИСТИМ HEAD ОТ МУСОРА WORDPRESS
// ============================================================

remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10);

// ============================================================
// 7. ОТКЛЮЧАЕМ НЕНУЖНЫЙ REST API (ОПЦИОНАЛЬНО)
// ============================================================

add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
return $endpoints;
});

// ============================================================
// 8. УДАЛЯЕМ ОСТАВШИЙСЯ МУСОР (БЕЗОПАСНОСТЬ + СКОРОСТЬ)
// ============================================================

// 1. Удаляем pingback (безопасность)
remove_action('wp_head', 'pingback_link');
add_filter('xmlrpc_enabled', '__return_false');

// 2. Делаем href пустым (чтобы не трогать тему)

add_filter('bloginfo_url', function($output, $property) {
if ($property == 'pingback_url') {
return '';
}
return $output;
}, 10, 2);

// 3. Удаляем X-Pingback из HTTP-заголовков
add_filter('wp_headers', function($headers) {
unset($headers['X-Pingback']);
return $headers;
});

// 4. Удаляем Emoji (скорость)
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');


// ============================================================
// 9. ЗАКРЫВАЕМ ОТ ИНДЕКСАЦИИ МУСОРНЫЕ СТРАНИЦЫ
// ============================================================

// 9.1. Пагинация (страницы 2, 3, ...)
add_action('wp_head', function() {
if (is_paged()) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}, 100);

// 9.2. Страницы поиска (выдача по запросам)
add_action('wp_head', function() {
if (is_search()) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}, 100);

// 9.3. (Опционально) Страницы авторов, если у вас блог с одним автором
// Если у вас один автор, эта страница дублирует главную — можно закрыть.
add_action('wp_head', function() {
if (is_author()) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}, 100);

// 9.4. (Опционально) Страницы архивов по датам (месяц/год)
// Они дублируют содержимое и не нужны в поиске.
add_action('wp_head', function() {
if (is_date()) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}, 100);

Преимущества

✅ Заменяет сео плагин Yoast SEO.
✅ Ускоряет сайт.
✅ Повышает безопасность.
✅ Даёт полный контроль.
✅ Лёгкий, чистый и современный.

В завершении

Долгое время, я считал Yoast SEO чем-то вроде святого Грааля. Устанавливал его на каждый проект, мирился с его тяжеловесностью и бесконечными уведомлениями о «плохой читабельности» и других надоедливых баннеров в админке. Любой сео плагин – это быстрое, но компромиссное решение. Он тащит за собой избыточный функционал, лишние SQL-запросы и мусорный HTML-код, что добавляет тяжести блогу в ущерб скорости.

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

Я пересмотрел свой подход и переписал всю SEO-логику в дочерней теме. Теперь на каждой странице генерируется только то, что действительно нужно: правильный тайтл, мета-описание, OG-теги для соцсетей и минимальная разметка Schema для Google. Без надоедливых баннеров в админке и без потери скорости.