Вопрос или проблема
У меня есть такой запрос:
$args = array(
'posts_per_page' => -1,
'post_type' => 'page',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
'tipo_pagina_clause' => array(
'key' => 'tipo_pagina',
'value' => 'prodotto',
'compare' => '='
),
'tipo_prodotto_clause' => array(
'key' => 'tipo_prodotto',
'compare' => 'EXISTS',
),
array(
'key' => 'brand',
'value' => get_the_id(),
'compare' => 'LIKE',
),
),
'orderby' => array(
'tipo_prodotto_clause' => 'ASC',
'post_title' => 'asc',
),
);
// запрос
$prodotti_brand = new WP_Query( $args );
Все работает нормально, но я хочу, чтобы ‘post_title’ => ‘rand’, но ‘rand’, похоже, не работает. Что я делаю не так?
Краткий ответ: “вы не можете этого сделать.” Посмотрите Codex.
При использовании order
в виде массива значение может быть либо ASC
, либо DESC
. Если вы хотите установить rand
, вы должны сделать это только как ключ с помощью orderby
. Тем не менее, упорядочивание по случайному значению переопределит любые другие заказы, так что вы не получите много пользы от упорядочивания по tipo_prodotto_clause
сначала.
'order' => 'ASC',
'orderby' => 'rand',
Также убедитесь, что вы обратили внимание на необходимый контекст для orderby rand:
Случайный порядок. Вы также можете использовать ‘RAND(x)’, где ‘x’ – это целочисленное значение seed. Обратите внимание, что для “orderby” требуется наличие параметра “order” для работы rand.
Совет: случайный порядок крайне не рекомендуется. Запрос плохо работает в mysql и может нарушить кэширование на сайте для каждого запроса или не сработать, если кэширование менее гибкое. Фактически, WP Engine запретили его использование по умолчанию. Будьте осторожны с этим. Обычно лучше найти альтернативное решение.
Ответ или решение
Для решения проблемы с многократной сортировкой в WP_Query, где один из параметров ‘orderby’ должен быть ‘rand’, важно понимать ограничения WordPress в этом контексте. Согласно документации WordPress, когда используется массив для параметра ‘orderby’, значение для порядка может быть либо ‘ASC’, либо ‘DESC’. Если вы пытаетесь использовать ‘rand’, это должно быть указано в ключе ‘orderby’ без множества параметров сортировки.
Почему ‘RAND’ не работает в текущей конфигурации?
Сортировка по ‘rand’ в WordPress делает выборку записей в случайном порядке. Однако при использовании массива для ‘orderby’, сочетание случайного порядка с другими полями, такими как ‘tipo_prodotto_clause’, не имеет смысла, так как случайная сортировка перевешивает любое другое указание порядка. Это нужно учитывать при проектировании запросов. Сделать сортировку по нескольким критериям не получится, если один из них – случайный.
Решение: Как сделать так, чтобы это работало?
Если ваша цель – достичь случайного порядка, вам нужно изменить конфигурацию запроса:
$args = array(
'posts_per_page' => -1,
'post_type' => 'page',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
'tipo_pagina_clause' => array(
'key' => 'tipo_pagina',
'value' => 'prodotto',
'compare' => '='
),
'tipo_prodotto_clause' => array(
'key' => 'tipo_prodotto',
'compare' => 'EXISTS',
),
array(
'key' => 'brand',
'value' => get_the_id(),
'compare' => 'LIKE',
),
),
'orderby' => 'rand',
'order' => 'ASC', // Параметр 'order' обязателен для работы 'rand'
);
$prodotti_brand = new WP_Query($args);
Остерегайтесь использования ‘orderby’ => ‘rand’
Хотя упомянутая конфигурация может работать, следует знать о ее недостатках. Использование ‘rand’ в запросах MySQL является неэффективным и может значительно нагрузить сервер, особенно при больших объемах данных. Это также может негативно сказаться на кэшировании, приводя к его частому обновлению и, как следствие, к снижению производительности сайта.
Некоторые компании, такие как WP Engine, запрещают использование ‘rand’ по умолчанию. Поэтому, если использование случайного порядка для вас критически важно, рассмотрите альтернативные подходы, возможно, с использованием сторонних инструментов для кэширования или предварительной обработки данных.
Заключение
Для достижения необходимой функциональности важно быть осведомленным о том, как WP_Query обрабатывает сортировку, и какие могут быть побочные эффекты от использования случайной выборки. Всегда старайтесь выбирать решение, которое будет не только функциональным, но и оптимальным с точки зрения производительности веб-сайта.