Что такое $wpdb
$wpdb — это встроенный объект WordPress, который позволяет выполнять SQL-запросы к базе данных безопасно и удобно.
Он автоматически учитывает:
- префикс таблиц (обычно
wp_) - безопасность (например, экранирует значения)
- и возвращает результат как удобный PHP-объект.
Подключение $wpdb
global $wpdb;
Делаешь $wpdb доступным внутри функции. Это глобальный объект, и его надо импортировать явно.
Выполнение запроса
$results = $wpdb->get_results("SQL ЗАПРОС");
SELECT
t.term_id,
t.name,
t.slug,
tx.taxonomy,
icl.language_code,
icl.trid
FROM wp_terms t
INNER JOIN wp_term_taxonomy tx ON t.term_id = tx.term_id
INNER JOIN wp_icl_translations icl ON icl.element_id = tx.term_taxonomy_id
WHERE tx.taxonomy = 'area'
AND icl.element_type = 'tax_area'
ORDER BY icl.trid ASC
$wpdb->terms, $wpdb->term_taxonomy, $wpdb->prefix — это динамически сгенерированные названия таблиц, с учётом установленного префикса (wp_, abc_, и т.д.).
🔁 get_results() — выполняет SELECT-запрос и возвращает массив объектов (stdClass), где каждое поле — это колонка из результата.
Преобразование результата
foreach ($results as $row) {
$grouped[$row->language_code][$row->term_id] = [
'name' => $row->name,
'slug' => $row->slug,
'trid' => $row->trid,
];
}
Группировка термов по языку:
$grouped = [
'en' => [
14 => ['name' => 'Dubai', 'slug' => 'dubai', 'trid' => 123],
15 => ['name' => 'Jumeirah', 'slug' => 'jumeirah', 'trid' => 124],
],
'ru' => [
88 => ['name' => 'Дубай', 'slug' => 'dubai-ru', 'trid' => 123],
89 => ['name' => 'Джумейра', 'slug' => 'jumeirah-ru', 'trid' => 124],
]
];
📌 Объекты $wpdb
$wpdb->get_results()→ возвращает массив объектов$wpdb->get_row()→ возвращает одну строку$wpdb->get_var()→ одно значение$wpdb->get_col()→ одну колонку
Весь код:
// 📌 Получение всех термов с переводами
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,
];
}
return $grouped;
}
