Що таке wp-load.php
wp-load.php — це файл-завантажувач, який ініціалізує ядро WordPress.
Його основна задача — підготувати середовище, як при відкритті звичайної сторінки сайту.
Коли ти підключаєш wp-load.php, відбувається:
- Завантаження
wp-config.php(конфіг з базою даних) - Підключення ядра WordPress (
wp-settings.php) - Запуск плагінів і хуків (
plugins_loaded,init, і т.д.) - Завантаження теми (якщо потрібно)
- Доступ до всіх глобальних функцій:
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-змінних — їх можна підставляти вручну |
