wp-load.php
Glossary overview

wp-load.php

Що таке wp-load.php

wp-load.php — це файл-завантажувач, який ініціалізує ядро WordPress.
Його основна задача — підготувати середовище, як при відкритті звичайної сторінки сайту.

Коли ти підключаєш wp-load.php, відбувається:

  1. Завантаження wp-config.php (конфіг з базою даних)
  2. Підключення ядра WordPress (wp-settings.php)
  3. Запуск плагінів і хуків (plugins_loaded, init, і т.д.)
  4. Завантаження теми (якщо потрібно)
  5. Доступ до всіх глобальних функцій: get_posts, wp_insert_post, get_term, update_option, і т.д

Як правильно використовувати wp-load.php

📁 Структура:

У корені WordPress (/var/www/html або /your-site) є структура:

Приклад використання:

<?php
require_once __DIR__ . '/wp-load.php';

// Тепер ти можеш:
$post = get_post(123);
echo $post->post_title;

$terms = get_terms(['taxonomy' => 'category']);
foreach ($terms as $term) {
    echo $term->name . "\n";
}

Або я писав скрипт по створенюю таксономій, який запускався з терміналу

<?php

require_once __DIR__ . '/wp-load.php';

// ✅ Запуск только из терминала
if (php_sapi_name() === 'cli') {
    $taxonomy_arg = $argv[1] ?? null;
    if (!$taxonomy_arg) {
        echo "❌ Укажи таксономию как аргумент. Пример: php import-terms.php area\n";
        exit(1);
    }

    import_terms_from_sheet($taxonomy_arg);
    exit(0);
}

remove_filter('pre_term_description', 'wp_filter_kses');
remove_filter('term_description', 'wp_kses_data');

// 💬 Удобный логгер
function term_import_log($message) {
    if (!is_string($message)) {
        $message = print_r($message, true);
    }
    error_log('[Term Import] ' . $message);
}

// 🔄 Основная функция импорта
function import_terms_from_sheet($taxonomy_name) {
    $overwrite_description = false;

    $all_terms_by_lang = get_translated_terms_grouped_by_lang($taxonomy_name);
    $existing_ru_terms = $all_terms_by_lang['ru'] ?? [];

    // 📥 Google Sheet
    $id = '';
    $gid = "";
    $url = "https://docs.google.com/spreadsheets/d/$id/gviz/tq?tqx=out:json&gid=$gid";

    $json = file_get_contents($url);
    if ($json === false) {
        wp_die("Ошибка получения данных: $url");
    }

    $jsonTrimmed = substr($json, 47, -2);
    $data = json_decode($jsonTrimmed, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        wp_die("Ошибка JSON: " . json_last_error_msg());
    }

    $rows = $data['table']['rows'] ?? [];
    $columns = $data['table']['cols'] ?? [];
    if (empty($rows)) {
        wp_die("Таблица пуста или не загружена.");
    }

    $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;
        }
    }

    $all_updated = [];

    foreach ($result as $row) {
        // Обязательные поля из Google Sheet
        $term_name = trim($row['Column_0'] ?? '');
        $description      = trim($row['Column_4'] ?? '');
        $meta_title       = trim($row['Column_5'] ?? '');
        $meta_description = trim($row['Column_6'] ?? '');
        $term_title       = trim($row['Column_7'] ?? '');

        if (empty($term_name)) continue;

        // Поиск существующего терма по совпадению названия (без учёта регистра)
        $matched_term_id = null;
        foreach ($existing_ru_terms as $term_id => $term_info) {
            if (isset($term_info['name']) && mb_strtolower($term_info['name']) === mb_strtolower($term_name)) {
                $matched_term_id = $term_id;
                break;
            }
        }

        if ($matched_term_id) {
            term_import_log("✅ Найден существующий терм '$term_name' (ID: $matched_term_id).");
        } else {
            term_import_log("❌ Термин '$term_name' не найден среди существующих русских переводов.");
        }

        if ($matched_term_id) {
            // 🔄 Обновление: перезаписываем описание, если флаг установлен или если оно пустое
            if ($overwrite_description || !term_has_description($matched_term_id)) {
                wp_update_term($matched_term_id, $taxonomy_name, ['description' => $description]);
                term_import_log("Обновлено описание терма: '$term_name'.");
            }

            // Обновляем ACF и meta-поля, если они пусты или если установлен флаг перезаписи
            if ($overwrite_description || !get_term_meta($matched_term_id, 'rank_math_title', true)) {
                update_term_meta($matched_term_id, 'rank_math_title', $meta_title);
            }
            if ($overwrite_description || !get_term_meta($matched_term_id, 'rank_math_description', true)) {
                update_term_meta($matched_term_id, 'rank_math_description', $meta_description);
            }
            if ($overwrite_description || !get_field('term_title', "term_$matched_term_id")) {
                update_field('term_title', $term_title, "term_$matched_term_id");
            }
        } else {
            // 🆕 Создание нового терма
            $new_term = wp_insert_term($term_name, $taxonomy_name, [
                'description' => $description
            ]);
            if (is_wp_error($new_term)) {
                term_import_log("❌ Ошибка при создании '$term_name': " . $new_term->get_error_message());
                continue;
            }

            $term_id = $new_term['term_id'];
            update_term_meta($term_id, 'rank_math_title', $meta_title);
            update_term_meta($term_id, 'rank_math_description', $meta_description);
            update_field('term_title', $term_title, "term_$term_id");

            term_import_log("🆕 Создан термин '$term_name' (ID: $term_id).");
        }

        $all_updated[] = $term_name;
    }

    term_import_log('✅ Обновлены или созданы: ' . implode(', ', $all_updated));
    term_import_log("🎉 Импорт завершен.");
}

// ✅ Проверка описания
function term_has_description($term_id) {
    $term = get_term($term_id);
    return !empty($term->description);
}

// 📥 Получение всех термов с переводами
function get_translated_terms_grouped_by_lang($taxonomy = 'area') {
    global $wpdb;

    $results = $wpdb->get_results("
        SELECT 
            t.term_id,
            t.name,
            t.slug,
            tx.taxonomy,
            icl.language_code,
            icl.trid
        FROM {$wpdb->terms} t
        INNER JOIN {$wpdb->term_taxonomy} tx ON t.term_id = tx.term_id
        INNER JOIN {$wpdb->prefix}icl_translations icl ON icl.element_id = tx.term_taxonomy_id
        WHERE tx.taxonomy = '{$taxonomy}'
          AND icl.element_type = 'tax_{$taxonomy}'
        ORDER BY icl.trid ASC
    ");

    $grouped = [];

    foreach ($results as $row) {
        $grouped[$row->language_code][$row->term_id] = [
            'name' => $row->name,
            'slug' => $row->slug,
            'trid' => $row->trid,
        ];
    }

    // error_log("[DB Terms] Термы '$taxonomy': " . print_r($grouped, true));
    return $grouped;
}

// 🐞 Отладка в браузере: ?debug_terms=1
add_action('wp_loaded', function () {
    if (isset($_GET['debug_terms']) && current_user_can('manage_options')) {
        get_translated_terms_grouped_by_lang('area');
    }
});

Запуск скрипта в терминале:

php google-sheets-api-wpml-script.php area

Де це використовувати

  • В CLI-скриптах: php my-script.php
  • В cron-задачах: */5 * * * * php /path/to/import.php
  • В вебхуках: окремий endpoint, який обробляє JSON-запити
  • У міграціях чи інструментах, які не повинні бути частиною теми чи плагіна

Що треба враховувати

ОсобливістьПояснення
❌ Не всі хуки спрацьовуютьwp-load.php не запускає шаблон сторінки (не буде the_content, wp_footer і т.д.)
✅ Усі плагіни доступніТи можеш використовувати функції ACF, WooCommerce, RankMath
❗ Не запускай через браузерЯкщо це CLI-скрипт, переконайся, що його ніхто не викликає ззовні
🧪 Перевіряй php_sapi_name()Для безпеки можна перевіряти, що скрипт запускається через CLI
🌐 Базовий URL може не працюватиhome_url(), site_url() можуть не працювати без $_SERVER-змінних — їх можна підставляти вручну