WP_Query – множественное orderby с полем rand не работает

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

У меня есть такой запрос:

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

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

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