Фильтр запроса “get_terms”

Вопрос или проблема

В настоящее время я получаю данные из пользовательской таксономии, используя это:

$terms = get_terms(array(
    'taxonomy' => 'my_custom_taxonomy_name',
    'hide_empty' => true
));

Теперь это возвращает много данных в каждом объекте WP_Term; term_id, name, slug, term_group, term_taxonomy_id, taxonomy, description, parent, count и filter.

Мне нужно получить только 2 из этих данных: name и slug. Как мне отфильтровать этот запрос, чтобы он не возвращал все эти неиспользуемые данные?

Таким способом, как вы это делаете, невозможно. Вам нужно будет сделать ручной запрос для того, что вам нужно.

global $wpdb;
$query = "SELECT 'name', 'slug' FROM wp-term_taxonomy WHERE ..."

Параметр fields позволяет вам выбрать, что будет возвращено методом get_terms(). Вы можете выбрать массив имен ('fields' => 'id=>names') или слагов ('fields' => 'id=>slugs'), но не массив с обеими свойствами.

Существует фильтр get_terms_fields, в котором вы можете изменить столбцы, которые будут запрашиваться (получить только имя и слаг), но результат все равно будет массивом объектов WP_Terms.

Я думаю, будет лучше остаться с решением, которое у вас есть в настоящее время.

В WordPress функция get_terms предназначена для возврата полного объекта WP_Term для каждого термина, который включает все свойства, которые вы упомянули, такие как term_id, name, slug, term_group и т. д. К сожалению, нет прямого способа ограничить функцию get_terms так, чтобы она возвращала только конкретные поля, такие как name и slug.

Тем не менее, вы можете достичь своей цели, извлекая все термины с помощью get_terms, а затем извлекая только те данные, которые вам нужны. Этот подход подразумевает дополнительную обработку на PHP, но его легко реализовать. Вот как вы можете это сделать:

$terms = get_terms(array(
    'taxonomy' => 'my_custom_taxonomy_name',
    'hide_empty' => true
));

// Извлечь только имя и слаг
$filtered_terms = array_map(function($term) {
    return array(
        'name' => $term->name,
        'slug' => $term->slug
    );
}, $terms);

// Теперь $filtered_terms содержит только имя и слаг каждого термина

В этом фрагменте кода используется array_map для итерации по каждому термину и создания нового массива, содержащего только свойства name и slug.

Хотя это не сокращает данные, первоначально извлекаемые из базы данных, это предоставляет вам массив, который содержит только необходимую информацию. Это может быть особенно полезно, если вы передаете эти данные во фронтенд-приложение или API, где минимизация объема переданных данных имеет важное значение.

Если вы хотите оптимизировать запросы к базе данных по причинам производительности, и набор данных велик, вы можете рассмотреть возможность использования пользовательских SQL-запросов, но это обычно не рекомендуется из-за проблем с обслуживанием и совместимостью с обновлениями ядра WordPress. Для большинства типичных случаев использования вышеуказанный метод должен быть достаточным и сохраняет ваш код внутри структуры API WordPress.

Ответ или решение

Использование функции get_terms в WordPress для извлечения данных из пользовательской таксономии является распространенной задачей. Как вы заметили, эта функция возвращает полный объект WP_Term, который содержит множество свойств, таких как term_id, name, slug, и другие. Если вам нужно всего лишь два поля — name и slug, вы можете применить несколько подходов для фильтрации данных.

1. Использование get_terms с последующей обработкой

На данный момент, в WordPress нет возможности напрямую ограничить возвращаемые поля в функции get_terms. Однако вы можете извлечь все термины, а затем отфильтровать массив, чтобы оставить только нужные вам свойства. Это можно сделать с помощью функции array_map, что позволит реализовать следующий код:

$terms = get_terms(array(
    'taxonomy' => 'my_custom_taxonomy_name',
    'hide_empty' => true
));

// Извлекаем только name и slug
$filtered_terms = array_map(function($term) {
    return array(
        'name' => $term->name,
        'slug' => $term->slug
    );
}, $terms);

// Теперь, $filtered_terms содержит только name и slug каждого термина

Таким образом, в переменной $filtered_terms после выполнения этого кода будет массив, содержащий только интересующие вас значения.

2. Оптимизация запроса с помощью кастомного SQL

Если вы работаете с большой выборкой данных и вас беспокоит производительность, можно рассмотреть возможность выполнения кастомного SQL-запроса. Это позволит вам извлечь только необходимые поля из базы данных и сократить объем передаваемой информации:

global $wpdb;
$query = "SELECT t.name, tt.slug
          FROM {$wpdb->terms} AS t
          INNER JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id
          WHERE tt.taxonomy = 'my_custom_taxonomy_name' AND tt.count > 0";

$results = $wpdb->get_results($query);

Этот способ, хотя и более производителен, требует от вас явного управления SQL-запросами, что легче сделать, когда вы уже знакомы с внутренними таблицами WordPress. Тем не менее, его следует применять с осторожностью, поскольку ломают совместимость с будущими обновлениями WordPress.

3. Использование фильтра get_terms_fields

Еще одним подходом к изменению возвращаемых полей является использование фильтра get_terms_fields. С его помощью вы можете изменить выбираемые столбцы, однако результат все равно будет в виде массива объектов WP_Term. Это означает, что даже если вы измените поля, обработка массива все равно придется делать.

Заключение

Наиболее простой и безопасный способ — это использовать первый подход с фильтрацией массива. Он сохраняет совместимость с WordPress и довольно легко реализуется. Если вы работаете с ограниченным объемом данных, это решение подойдет вам лучше всего.

Тем не менее, подход с кастомным SQL-запросом может оказаться полезным, если у вас большие объемы данных и критична производительность. В конечном итоге выбор за вами и зависит от специфики вашего проекта и требований к производительности.

Оцените материал
Добавить комментарий

Капча загружается...