Получить случайные термины

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

Возможно ли получить случайные термины? Чтобы получить случайные посты, вы можете использовать WP_Query и установить 'orderby' => 'rand'.

Но есть ли способ сделать это с терминами?

Я попробовал следующее:

$terms = get_terms( array(
    'taxonomy' => 'webshops',
    'hide_empty' => false,
    'orderby' => 'rand',
    'number' => 6
) );

В отличие от обычного WP_Query(), get_terms() или WP_Term_Query() не имеют случайной сортировки. Вам нужно будет сделать это в SQL самостоятельно или получить все термины и перемешать их, вытащив 6, чтобы создать ваш массив случайных терминов:

// Получаем все термины
$terms = get_terms( array(
    'taxonomy'      => 'webshops',
    'hide_empty'    => false,
) );

// Перемешиваем массив терминов
shuffle( $terms );

// Берем индексы 0 - 5, всего 6
$random_terms = array_slice( $terms, 0, 6 );

Хотя другой ответ предоставляет жизнеспособный вариант для сайтов с небольшим количеством терминов, в случаях, когда количество не так уж и мало, получение всех терминов и перемешивание на стороне PHP приведет к неэффективному использованию ресурсов и замедлению работы.

Гораздо лучшим подходом будет заставить SQL-запрос из класса WP_Term_Query выполнять настоящую случайную ORDER BY на уровне SQL.

Этот фрагмент кода будет работать гораздо лучше, чем рандомизация на стороне PHP.

function make_rand($order, $q) {
    return 'RAND()';
}

add_filter('get_terms_orderby', 'make_rand', 10, 2);

$terms = get_terms([
    'taxonomy' => 'webshops',
    'hide_empty' => false,
    'orderby' => 'rand',
    'number' => 6
]);

remove_filter('get_terms_orderby', 'make_rand', 10, 2);

// $terms находятся в случайном порядке здесь

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

Как получить случайные термины в WordPress

Получение случайных терминов в WordPress может оказаться более сложной задачей, чем получение случайных записей. В данном ответе мы рассмотрим несколько подходов, которые позволят вам эффективно извлекать термины из вашей таксономии.

1. Начальные трудности

Использование функции get_terms() в WordPress по умолчанию не предоставляет параметр для сортировки терминов в случайном порядке. Применение 'orderby' => 'rand' не будет работать так, как ожидалось. Вместо этого, у вас есть несколько альтернативных способов решить эту задачу.

2. Метод с перетасовкой на стороне PHP

Один из простых подходов — это извлечь все термины заданной таксономии, а затем использовать функцию shuffle() для случайной сортировки. Например:

// Получаем все термины
$terms = get_terms( array(
    'taxonomy'      => 'webshops',
    'hide_empty'    => false,
) );

// Перетасовываем массив терминов
shuffle( $terms );

// Извлекаем 6 случайных терминов
$random_terms = array_slice( $terms, 0, 6 );

Хотя этот метод работает, он имеет свои недостатки. Если количество терминов велико, то извлечение всех терминов и последующая перетасовка могут затратить много ресурсов и замедлить работу сайта.

3. SQL-подход с использованием фильтров

Более эффективным решением, особенно при большом объеме данных, является изменение SQL-запроса, чтобы он возвращал термины в случайном порядке непосредственно на уровне базы данных. Для этого можно использовать фильтр get_terms_orderby следующим образом:

function make_rand($order, $q) {
    return 'RAND()';
}

add_filter('get_terms_orderby', 'make_rand', 10, 2);

// Получаем 6 случайных терминов
$terms = get_terms([
    'taxonomy' => 'webshops',
    'hide_empty' => false,
    'orderby' => 'rand',
    'number' => 6
]);

// Убираем фильтр, чтобы не влиять на другие запросы
remove_filter('get_terms_orderby', 'make_rand', 10, 2);

// $terms теперь отсортированы в случайном порядке

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

Заключение

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

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

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

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