Вопрос или проблема
Возможно ли получить случайные термины? Чтобы получить случайные посты, вы можете использовать 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-запроса, что обеспечит более быструю и эффективную выборку данных.
Таким образом, следуя вышеизложенным рекомендациям, вы сможете с легкостью получать случайные термины для ваших нужд, снижая нагрузку на сервер и улучшая общую производительность вашего сайта.