Массовое изменение метатегов title и description в магазине на Wocommerce с помощью нейросети Claude

У меня на продвижении находится магазин, разработан на WordPress + Wocommerce. Я постепенно прорабатывал семантику по всему магазину и детально работал с одной из категорий. Тем временем все title по всему сайту были не очень релевантные (были построены по шаблону) и не содержали в себе нужных ключей, а description вообще были все пустые.

Было бы неплохо на текущем этапе, собрав все страницы по сайту, разом составить список новых title и description, и разом внедрить их на сайт. Потом, по мере сборки и проработки семантики, по кажой категории и товару уже заняться более детальной проработкой метатегов уже конкретных страниц.

Было решено воспользоваться ИИ Claude для этих целей. Как оказалось, существует расширение для клода которое даёт ему доступ к Яндекс Wordstat. Это существенно расширяет возможности, ведь клод может в реальном времени посмотреть статистику фраз по частотности, определить более частотные словоформы, и уже с этими данными составить более релевантные тайтл и дескрипшен для страницы.

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

Телеграм бот, где можно получить ссылку для вставки в клод:
Telegram @mcp_wordstat
Чат с обсуждением интеграции:
Telegram @mcp_wordstat
Сам разработчик:
Telegram @chuvacode_dev
Youtube канал:
YouTube @seo-easy-ru

После этого заходим в настройки Claude — Settings — Integrations — Add integration. Вводим название wordstat, вводим полученную у telegram робота ссылку.

Далее я попробовал на что способен Claude вместе с новой интеграцией. Результат меня даже удивил:

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

промт: Создай php скрипт который на магазине с wordpress + woccomerce выгрузит все страницы всех типов: стандартные записи wp, страницы wp, страницы woocommerce, категории woocommerce, товары woocommerce. Результатом работы скрипта должна быть таблица соответствий url и id.

Вот готовый php скрипт, который сделает экспорт страниц и их id:

export_pages.php
<?php
/**
 * Скрипт для выгрузки всех страниц WordPress + WooCommerce
 * Создает таблицу соответствий URL и ID для всех типов контента
 * 
 * Использование: разместить в корне сайта и запустить через браузер
 * Например: https://yoursite.com/export_pages.php
 */
// Устанавливаем кодировку
header('Content-Type: text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');
ini_set('default_charset', 'UTF-8');


// Подключаем WordPress
require_once('wp-config.php');
require_once('wp-load.php');



// Проверяем, что WooCommerce активен
if (!class_exists('WooCommerce')) {
    die('WooCommerce не активен на данном сайте!');
}

// Устанавливаем лимит времени выполнения
set_time_limit(300);

// Массив для хранения всех данных
$all_pages = array();

/**
 * Функция для получения полного URL страницы
 */
function get_page_url($post_id, $post_type = 'post') {
    if ($post_type === 'product_cat' || $post_type === 'product_tag') {
        return get_term_link($post_id);
    }
    return get_permalink($post_id);
}

/**
 * Функция для добавления данных в массив
 */
function add_to_export($id, $url, $title, $type, $status = 'publish') {
    global $all_pages;
    
    // Проверяем, что URL валидный
    if (is_wp_error($url)) {
        $url = 'ERROR: ' . $url->get_error_message();
    }
    
    $all_pages[] = array(
        'id' => $id,
        'url' => $url,
        'title' => $title,
        'type' => $type,
        'status' => $status
    );
}

echo "<h1>Экспорт всех страниц WordPress + WooCommerce</h1>";
echo "<p>Выполняется сбор данных...</p>";

// 1. СТАНДАРТНЫЕ ЗАПИСИ WORDPRESS (posts)
echo "<h3>1. Обрабатываем записи (posts)...</h3>";
$posts = get_posts(array(
    'post_type' => 'post',
    'post_status' => array('publish', 'private', 'draft'),
    'numberposts' => -1,
    'suppress_filters' => false
));

foreach ($posts as $post) {
    $url = get_page_url($post->ID, 'post');
    add_to_export($post->ID, $url, $post->post_title, 'post', $post->post_status);
}
echo "Найдено записей: " . count($posts) . "<br>";

// 2. СТРАНИЦЫ WORDPRESS (pages)
echo "<h3>2. Обрабатываем страницы (pages)...</h3>";
$pages = get_posts(array(
    'post_type' => 'page',
    'post_status' => array('publish', 'private', 'draft'),
    'numberposts' => -1,
    'suppress_filters' => false
));

foreach ($pages as $page) {
    $url = get_page_url($page->ID, 'page');
    add_to_export($page->ID, $url, $page->post_title, 'page', $page->post_status);
}
echo "Найдено страниц: " . count($pages) . "<br>";

// 3. ТОВАРЫ WOOCOMMERCE (products)
echo "<h3>3. Обрабатываем товары WooCommerce...</h3>";
$products = get_posts(array(
    'post_type' => 'product',
    'post_status' => array('publish', 'private', 'draft'),
    'numberposts' => -1,
    'suppress_filters' => false
));

foreach ($products as $product) {
    $url = get_page_url($product->ID, 'product');
    add_to_export($product->ID, $url, $product->post_title, 'product', $product->post_status);
}
echo "Найдено товаров: " . count($products) . "<br>";

// 4. КАТЕГОРИИ ТОВАРОВ WOOCOMMERCE
echo "<h3>4. Обрабатываем категории товаров WooCommerce...</h3>";
$product_cats = get_terms(array(
    'taxonomy' => 'product_cat',
    'hide_empty' => false,
    'suppress_filters' => false
));

if (!is_wp_error($product_cats)) {
    foreach ($product_cats as $cat) {
        $url = get_term_link($cat->term_id, 'product_cat');
        add_to_export($cat->term_id, $url, $cat->name, 'product_category', 'publish');
    }
    echo "Найдено категорий товаров: " . count($product_cats) . "<br>";
} else {
    echo "Ошибка при получении категорий товаров<br>";
}

// 5. ТЕГИ ТОВАРОВ WOOCOMMERCE
echo "<h3>5. Обрабатываем теги товаров WooCommerce...</h3>";
$product_tags = get_terms(array(
    'taxonomy' => 'product_tag',
    'hide_empty' => false,
    'suppress_filters' => false
));

if (!is_wp_error($product_tags)) {
    foreach ($product_tags as $tag) {
        $url = get_term_link($tag->term_id, 'product_tag');
        add_to_export($tag->term_id, $url, $tag->name, 'product_tag', 'publish');
    }
    echo "Найдено тегов товаров: " . count($product_tags) . "<br>";
} else {
    echo "Ошибка при получении тегов товаров<br>";
}

// 6. АТРИБУТЫ ТОВАРОВ WOOCOMMERCE
echo "<h3>6. Обрабатываем атрибуты товаров WooCommerce...</h3>";
$attribute_taxonomies = wc_get_attribute_taxonomies();
$attributes_count = 0;

foreach ($attribute_taxonomies as $attribute) {
    $taxonomy = 'pa_' . $attribute->attribute_name;
    $terms = get_terms(array(
        'taxonomy' => $taxonomy,
        'hide_empty' => false,
        'suppress_filters' => false
    ));
    
    if (!is_wp_error($terms)) {
        foreach ($terms as $term) {
            $url = get_term_link($term->term_id, $taxonomy);
            add_to_export($term->term_id, $url, $term->name, 'product_attribute_' . $attribute->attribute_name, 'publish');
            $attributes_count++;
        }
    }
}
echo "Найдено атрибутов товаров: " . $attributes_count . "<br>";

// 7. СТРАНИЦЫ МАГАЗИНА WOOCOMMERCE
echo "<h3>7. Обрабатываем специальные страницы WooCommerce...</h3>";
$woo_pages = array(
    'shop' => wc_get_page_id('shop'),
    'cart' => wc_get_page_id('cart'),
    'checkout' => wc_get_page_id('checkout'),
    'myaccount' => wc_get_page_id('myaccount'),
    'terms' => wc_get_page_id('terms')
);

$woo_pages_count = 0;
foreach ($woo_pages as $page_type => $page_id) {
    if ($page_id && $page_id > 0) {
        $page = get_post($page_id);
        if ($page) {
            $url = get_page_url($page_id, 'page');
            add_to_export($page_id, $url, $page->post_title, 'woo_page_' . $page_type, $page->post_status);
            $woo_pages_count++;
        }
    }
}
echo "Найдено специальных страниц WooCommerce: " . $woo_pages_count . "<br>";

// 8. ДОПОЛНИТЕЛЬНЫЕ ТИПЫ ЗАПИСЕЙ
echo "<h3>8. Обрабатываем дополнительные типы записей...</h3>";
$custom_post_types = get_post_types(array(
    'public' => true,
    '_builtin' => false
), 'names');

// Исключаем уже обработанные типы WooCommerce
$exclude_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook');
$custom_post_types = array_diff($custom_post_types, $exclude_types);

$custom_posts_count = 0;
foreach ($custom_post_types as $post_type) {
    $custom_posts = get_posts(array(
        'post_type' => $post_type,
        'post_status' => array('publish', 'private', 'draft'),
        'numberposts' => -1,
        'suppress_filters' => false
    ));
    
    foreach ($custom_posts as $custom_post) {
        $url = get_page_url($custom_post->ID, $post_type);
        add_to_export($custom_post->ID, $url, $custom_post->post_title, $post_type, $custom_post->post_status);
        $custom_posts_count++;
    }
}
echo "Найдено записей дополнительных типов: " . $custom_posts_count . "<br>";

// Сортируем результаты по ID
usort($all_pages, function($a, $b) {
    return $a['id'] <=> $b['id'];
});

$total_count = count($all_pages);
echo "<br><h2>Всего найдено: {$total_count} записей</h2>";

// Определяем формат вывода
$format = isset($_GET['format']) ? $_GET['format'] : 'html';

if ($format === 'csv') {
    // ЭКСПОРТ В CSV
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="wordpress_woocommerce_export_' . date('Y-m-d_H-i-s') . '.csv"');
    
    $output = fopen('php://output', 'w');
    
    // BOM для корректного отображения UTF-8 в Excel
    fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
    
    // Заголовки
    fputcsv($output, array('№', 'ID', 'URL', 'Заголовок', 'Тип', 'Статус'), ';');
    
    // Данные
    foreach ($all_pages as $index => $page) {
        fputcsv($output, array(
            $index + 1,
            $page['id'],
            $page['url'],
            $page['title'],
            $page['type'],
            $page['status']
        ), ';');
    }
    
    fclose($output);
    exit;
    
} elseif ($format === 'json') {
    // ЭКСПОРТ В JSON
    header('Content-Type: application/json; charset=utf-8');
    header('Content-Disposition: attachment; filename="wordpress_woocommerce_export_' . date('Y-m-d_H-i-s') . '.json"');
    
    $export_data = array(
        'export_date' => date('Y-m-d H:i:s'),
        'site_url' => home_url(),
        'total_count' => $total_count,
        'pages' => $all_pages
    );
    
    echo json_encode($export_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
    
} else {
    // ОТОБРАЖЕНИЕ В HTML
    echo "<div style='margin: 20px 0;'>";
    echo "<a href='?format=csv' style='margin-right: 10px; padding: 10px 15px; background: #0073aa; color: white; text-decoration: none; border-radius: 3px;'>Скачать CSV</a>";
    echo "<a href='?format=json' style='padding: 10px 15px; background: #00a32a; color: white; text-decoration: none; border-radius: 3px;'>Скачать JSON</a>";
    echo "</div>";
    
    echo "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse; width: 100%; font-size: 12px;'>";
    echo "<thead style='background: #f1f1f1;'>";
    echo "<tr><th>№</th><th>ID</th><th>URL</th><th>Заголовок</th><th>Тип</th><th>Статус</th></tr>";
    echo "</thead>";
    echo "<tbody>";
    
    foreach ($all_pages as $index => $page) {
        $row_color = ($index % 2 == 0) ? '#f9f9f9' : '#ffffff';
        echo "<tr style='background: {$row_color};'>";
        echo "<td>" . ($index + 1) . "</td>";
        echo "<td>" . htmlspecialchars($page['id']) . "</td>";
        echo "<td><a href='" . htmlspecialchars($page['url']) . "' target='_blank'>" . htmlspecialchars($page['url']) . "</a></td>";
        echo "<td>" . htmlspecialchars($page['title']) . "</td>";
        echo "<td>" . htmlspecialchars($page['type']) . "</td>";
        echo "<td>" . htmlspecialchars($page['status']) . "</td>";
        echo "</tr>";
    }
    
    echo "</tbody>";
    echo "</table>";
    
    // Статистика по типам
    echo "<h3>Статистика по типам контента:</h3>";
    $type_stats = array();
    foreach ($all_pages as $page) {
        $type = $page['type'];
        if (!isset($type_stats[$type])) {
            $type_stats[$type] = 0;
        }
        $type_stats[$type]++;
    }
    
    arsort($type_stats);
    echo "<ul>";
    foreach ($type_stats as $type => $count) {
        echo "<li><strong>{$type}:</strong> {$count} записей</li>";
    }
    echo "</ul>";
    
    echo "<p><small>Скрипт выполнен: " . date('Y-m-d H:i:s') . "</small></p>";
}
?>

<style>
body {
    font-family: Arial, sans-serif;
    margin: 20px;
    line-height: 1.6;
}

table {
    margin-top: 20px;
    font-size: 12px;
}

th {
    background: #0073aa;
    color: white;
    padding: 8px;
    text-align: left;
}

td {
    padding: 5px;
    border: 1px solid #ddd;
}

a {
    color: #0073aa;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

h1, h2, h3 {
    color: #333;
}

.download-buttons {
    margin: 20px 0;
}

.btn {
    display: inline-block;
    padding: 10px 15px;
    margin-right: 10px;
    background: #0073aa;
    color: white;
    text-decoration: none;
    border-radius: 3px;
}

.btn:hover {
    background: #005a87;
}

.btn.green {
    background: #00a32a;
}

.btn.green:hover {
    background: #007c20;
}
</style>

Сохраняем полученный код под именем export_pages.php в корне вашего сайта и запускаем через браузер по адресу yoursite.ru/export_pages.php
Результат работы скрипта:

Скачиваем табличку, в случае необходимости открываем в excel и удаляем лишние страницы (желательно поправить нумерацию строк). После отработки скрипта, лучше его удалить с хостинга.

Далее опять идём в клод,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *