Можно сделать так, чтобы Google Sheets генерил контент.
Например, в первую колонку пользователь пишет Title.
Потом начинает генериться текст по тематике этого заголовка во вторую колонку.
Это все реализовано с помощью Apps Script.

Потом можем парсить гугл таблицу. Получаем контент и создаем термы, и заполняем их контентом с таблицы. Так же можно создавать страницы.
Этот код будет выполняться при загрузке страницы в WordPress.
<?php
remove_filter('pre_term_description', 'wp_filter_kses'); // чтобы можно было в описание термов вставлять html теги
remove_filter('term_description', 'wp_kses_data');
function import_metro_taxonomies() {
// 🔧 Конфигурация
$overwrite_description = false; // Если true – обновляет все поля, если false – оставляет старые
$taxonomy_name = 'metro'; // Название таксономии
$id = '***';
$gid = "65540390"; // страница (в таблице может быть несколько страниц)
$url = "https://docs.google.com/spreadsheets/d/$id/gviz/tq?tqx=out:json&gid=$gid";
$json = file_get_contents($url);
if ($json === false) {
error_log("Ошибка получения данных из Google Таблицы: $url");
return;
}
// Убираем ненужные символы
$jsonTrimmed = substr($json, 47, -2);
error_log("Обрезанный JSON: " . substr($jsonTrimmed, 0, 500));
$data = json_decode($jsonTrimmed, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("Ошибка декодирования JSON: " . json_last_error_msg());
return;
}
// Проверяем, есть ли данные
$rows = $data['table']['rows'] ?? [];
$columns = $data['table']['cols'] ?? [];
if (empty($rows)) {
error_log("Ошибка: таблица пуста или данные не загружены.");
return;
}
// Заголовки (если их нет, подставляем заглушки)
$headers = [];
foreach ($columns as $index => $col) {
$headers[] = !empty($col['label']) ? $col['label'] : "Column_$index";
}
error_log("Заголовки: " . json_encode($headers, JSON_UNESCAPED_UNICODE));
$result = [];
foreach ($rows as $rowIndex => $row) {
$rowData = [];
foreach ($row['c'] as $index => $cell) {
$rowData[$headers[$index]] = $cell['v'] ?? null;
}
// Убираем пустые строки
if (array_filter($rowData)) {
$result[] = $rowData;
} else {
error_log("Пустая строка: $rowIndex");
}
}
error_log("Данные из Лист2:\n" . print_r($result, true));
// Проверяем, зарегистрирована ли таксономия
if (!taxonomy_exists($taxonomy_name)) {
error_log("Таксономия '$taxonomy_name' не зарегистрирована! Проверь functions.php.");
return;
}
// Добавляем или обновляем термины
foreach ($result as $row) {
$term_name = trim($row['Column_0'] ?? '');
$new_description = trim($row['Column_4'] ?? '');
$new_meta_title = trim($row['Column_5'] ?? '');
$new_meta_description = trim($row['Column_6'] ?? '');
$new_term_title = trim($row['Column_7'] ?? '');
if (!empty($term_name)) {
$existing_term = term_exists($term_name, $taxonomy_name);
if (!$existing_term) {
// Создаем новую таксономию с описанием
$new_term = wp_insert_term($term_name, $taxonomy_name, ['description' => $new_description]);
if (is_wp_error($new_term)) {
error_log("Ошибка при создании '$term_name': " . $new_term->get_error_message());
} else {
$term_id = $new_term['term_id'];
error_log("Создана таксономия '$term_name' с описанием '$new_description'");
// Устанавливаем мета-данные и ACF поле
update_term_meta($term_id, 'rank_math_title', $new_meta_title);
update_term_meta($term_id, 'rank_math_description', $new_meta_description);
update_field('term_title', $new_term_title, "term_$term_id");
error_log("Добавлены мета-данные и ACF поле для '$term_name'");
}
} else {
// Получаем ID существующего термина
$term_id = $existing_term['term_id'];
$current_term = get_term($term_id, $taxonomy_name);
// Проверяем, нужно ли обновлять описание
if ($overwrite_description || empty($current_term->description)) {
wp_update_term($term_id, $taxonomy_name, ['description' => $new_description]);
error_log("Обновлено описание для '$term_name': '$new_description'");
} else {
error_log("Оставлено старое описание для '$term_name'");
}
// Проверяем и обновляем RankMath meta title
$current_meta_title = get_term_meta($term_id, 'rank_math_title', true);
if ($overwrite_description || empty($current_meta_title)) {
update_term_meta($term_id, 'rank_math_title', $new_meta_title);
error_log("Обновлен RankMath meta title для '$term_name': '$new_meta_title'");
} else {
error_log("Оставлен старый RankMath meta title для '$term_name'");
}
// Проверяем и обновляем RankMath meta description
$current_meta_description = get_term_meta($term_id, 'rank_math_description', true);
if ($overwrite_description || empty($current_meta_description)) {
update_term_meta($term_id, 'rank_math_description', $new_meta_description);
error_log("Обновлен RankMath meta description для '$term_name': '$new_meta_description'");
} else {
error_log("Оставлен старый RankMath meta description для '$term_name'");
}
// Проверяем и обновляем ACF поле term_title
$current_term_title = get_field('term_title', "term_$term_id");
if ($overwrite_description || empty($current_term_title)) {
update_field('term_title', $new_term_title, "term_$term_id");
error_log("Обновлено ACF поле term_title для '$term_name': '$new_term_title'");
} else {
error_log("Оставлено старое ACF поле term_title для '$term_name'");
}
}
}
}
}
add_action('init', 'import_metro_taxonomies');
?>
Код для запуска как скрипт (import_metro.php)
Создай файл, например, import_metro.php в корневой директории WordPress и вставь этот код:
<?php
require __DIR__ . '/wp-load.php';
remove_filter('pre_term_description', 'wp_filter_kses');
remove_filter('term_description', 'wp_kses_data');
function import_metro_taxonomies() {
// 🔧 Конфигурация
$overwrite_description = false; // Если true – обновляет все поля, если false – оставляет старые
$taxonomy_name = 'metro'; // Название таксономии
$id = '*****';
$gid = "65540390";
$url = "https://docs.google.com/spreadsheets/d/$id/gviz/tq?tqx=out:json&gid=$gid";
$json = file_get_contents($url);
if ($json === false) {
die("Ошибка получения данных из Google Таблицы: $url\n");
}
// Убираем ненужные символы
$jsonTrimmed = substr($json, 47, -2);
$data = json_decode($jsonTrimmed, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die("Ошибка декодирования JSON: " . json_last_error_msg() . "\n");
}
$rows = $data['table']['rows'] ?? [];
$columns = $data['table']['cols'] ?? [];
if (empty($rows)) {
die("Ошибка: таблица пуста или данные не загружены.\n");
}
$headers = [];
foreach ($columns as $index => $col) {
$headers[] = !empty($col['label']) ? $col['label'] : "Column_$index";
}
$result = [];
foreach ($rows as $row) {
$rowData = [];
foreach ($row['c'] as $index => $cell) {
$rowData[$headers[$index]] = $cell['v'] ?? null;
}
if (array_filter($rowData)) {
$result[] = $rowData;
}
}
if (!taxonomy_exists($taxonomy_name)) {
die("Таксономия '$taxonomy_name' не зарегистрирована! Проверь functions.php.\n");
}
foreach ($result as $row) {
$term_name = trim($row['Column_0'] ?? '');
$new_description = trim($row['Column_4'] ?? '');
$new_meta_title = trim($row['Column_5'] ?? '');
$new_meta_description = trim($row['Column_6'] ?? '');
$new_term_title = trim($row['Column_7'] ?? '');
if (!empty($term_name)) {
$existing_term = term_exists($term_name, $taxonomy_name);
if (!$existing_term) {
$new_term = wp_insert_term($term_name, $taxonomy_name, ['description' => $new_description]);
if (!is_wp_error($new_term)) {
$term_id = $new_term['term_id'];
update_term_meta($term_id, 'rank_math_title', $new_meta_title);
update_term_meta($term_id, 'rank_math_description', $new_meta_description);
update_field('term_title', $new_term_title, "term_$term_id");
echo "Создана таксономия '$term_name'.\n";
} else {
echo "Ошибка при создании '$term_name': " . $new_term->get_error_message() . "\n";
}
} else {
$term_id = $existing_term['term_id'];
$current_term = get_term($term_id, $taxonomy_name);
if ($overwrite_description || empty($current_term->description)) {
wp_update_term($term_id, $taxonomy_name, ['description' => $new_description]);
echo "Обновлено описание для '$term_name'.\n";
}
$current_meta_title = get_term_meta($term_id, 'rank_math_title', true);
if ($overwrite_description || empty($current_meta_title)) {
update_term_meta($term_id, 'rank_math_title', $new_meta_title);
}
$current_meta_description = get_term_meta($term_id, 'rank_math_description', true);
if ($overwrite_description || empty($current_meta_description)) {
update_term_meta($term_id, 'rank_math_description', $new_meta_description);
}
$current_term_title = get_field('term_title', "term_$term_id");
if ($overwrite_description || empty($current_term_title)) {
update_field('term_title', $new_term_title, "term_$term_id");
}
}
}
}
echo "Импорт завершен.\n";
}
import_metro_taxonomies();
?>
Как запустить:
- Сохрани файл
import_metro.phpв корневую директорию WordPress. - Запусти скрипт через браузер:
http://yourwebsite.com/import_metro.php
или через консоль (если есть доступ к серверу):
php import_metro.php
Теперь этот код будет выполняться как отдельный PHP-скрипт и загружать данные таксономии прямо из Google Таблицы.
