Google Sheets Auto Page Generator
Glossary overview

Google Sheets Auto Page Generator

Можно сделать так, чтобы 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();
?>

Как запустить:

  1. Сохрани файл import_metro.php в корневую директорию WordPress.
  2. Запусти скрипт через браузер:
http://yourwebsite.com/import_metro.php

или через консоль (если есть доступ к серверу):

php import_metro.php

Теперь этот код будет выполняться как отдельный PHP-скрипт и загружать данные таксономии прямо из Google Таблицы.