diff -Nuar a/vendor/magento/module-target-rule/Block/Product/AbstractProduct.php b/vendor/magento/module-target-rule/Block/Product/AbstractProduct.php index 89bebf67c4c..b7230f37027 100644 --- a/vendor/magento/module-target-rule/Block/Product/AbstractProduct.php +++ b/vendor/magento/module-target-rule/Block/Product/AbstractProduct.php @@ -136,7 +136,7 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr // Perform rotation mode $select = $this->_linkCollection->getSelect(); if ($this->isShuffled()) { - $this->_resourceIndex->orderRand($select); + $select->order($this->getRandomOrderExpression()); } else { $select->order('link_attribute_position_int.value ASC'); } @@ -147,6 +147,20 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr } /** + * Used to generate pseudo-random sort order to avoid using Mysql ORDER BY RAND() + * + * @return string + */ + private function getRandomOrderExpression() : string + { + $productEntityFieldsToRandomize = ['e.entity_id', 'e.attribute_set_id', 'e.sku']; + $sortOrderToRandomize = ['ASC', 'DESC']; + return $productEntityFieldsToRandomize[random_int(0, count($productEntityFieldsToRandomize) -1)] + . ' ' + . $sortOrderToRandomize[random_int(0, count($sortOrderToRandomize) -1)]; + } + + /** * Get linked products * * @return array @@ -160,6 +174,9 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr $items[$item->getEntityId()] = $item; } } + if ($this->isShuffled()) { + shuffle($items); + } return $items; }