Glossary overview

$wpdb

Что такое $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;
}