İlk görüntü olarak temel görüntüler, konumları toplu olarak değiştirin - Magento 2.3.5
Temel görüntünün galerinin ortasında bir yere konumlandırıldığı birçok üründen oluşan geniş bir kataloğumuz (125K ürün) var.
Temel görüntünün seçilmesi gayet iyi, bu temel görüntü olmalı ve öyle kalmalı, sadece bu görüntünün galerideki konumunu değiştirmemiz gerekiyor.
Görsellerin sıralamasını manuel olarak değiştirebileceğimizi ve bu görseli galerinin önüne yerleştirebileceğimizi biliyoruz, ancak bunu tüm ürünler için toplu olarak yapmanın bir yolu var mı?
Temel görüntünün konumunu değiştiren ve bunu önüne yerleştiren bir sql sorgusu gibi bir şey mi?
Aşağıdaki ekran görüntülerinde, galerinin ortasında temel resmin olduğu ve olması gerektiği gibi son resmin olduğu ilk resmi görüyorsunuz. Galeride ilk olarak temel görüntünün yerleştirildiği yer.
Önce:

Sonra:

Yanıtlar
Aşağıdaki snippet, sorununuzu çözmek için izleyeceğiniz adımlardır
$mainImage = $this->imageQueryResource->getProductMainImage($productId); $firstImage = $this->imageQueryResource->getFirstImages($productId);
$output->writeln('first image' . $firstImage);
if ($mainImage != $firstImage) {
$output->writeln('fix product ' . $mainImage . ' product id: ' . $productId); $otherImages = $this->imageQueryResource->getAllImages($productId);
foreach ($otherImages as $image) {
$position = 1; if ($image['value'] == $mainImage) { $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
}
}
reset($otherImages); foreach ($otherImages as $image) { if ($image['value'] != $mainImage) { $position++;
$this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
}
}
}
aşağıdaki dosya resimleriniz için sorgulama ve güncelleme yapar.
<?php
namespace Mbs\ImageSorting\Model;
use Magento\Framework\App\ResourceConnection;
class ImageQueryResource
{
/**
* @var ResourceConnection
*/
private $resourceConnection;
/**
* @var \Magento\Eav\Model\Config
*/
private $config; public function __construct( ResourceConnection $resourceConnection,
\Magento\Eav\Model\Config $config ) { $this->resourceConnection = $resourceConnection; $this->config = $config; } public function getProductMainImage(int $productId)
{
$mainImageAttribute = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'image');
$select = $this->resourceConnection->getConnection()->select();
$select->from($this->resourceConnection->getTableName('catalog_product_entity_' . $mainImageAttribute->getBackendType())); $select->where('entity_id=?', $productId); $select->where('attribute_id=?', $mainImageAttribute->getId()); $select->reset(\Magento\Framework\DB\Select::COLUMNS);
$select->columns(['value']); return $this->resourceConnection->getConnection()->fetchOne($select); } /** * @param int $productId
* select * from catalog_product_entity_media_gallery_value as v
inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
where entity_id=1802
order by position
*/
public function getAllImages(int $productId) { $select = $this->resourceConnection->getConnection()->select(); $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]); $select->join(
['g' => 'catalog_product_entity_media_gallery'],
'g.value_id=v.value_id',
[]
);
$select->where('entity_id=?', $productId);
$select->reset(\Magento\Framework\DB\Select::COLUMNS); $select->columns(['v.value_id', 'v.position', 'g.value']);
$select->order('v.position'); return $this->resourceConnection->getConnection()->fetchAll($select); } /** * @param int $productId
* select * from catalog_product_entity_media_gallery_value as v
inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
where entity_id=1802
order by position
*/
public function getFirstImages(int $productId) { $select = $this->resourceConnection->getConnection()->select(); $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]); $select->join(
['g' => 'catalog_product_entity_media_gallery'],
'g.value_id=v.value_id',
[]
);
$select->where('entity_id=?', $productId);
$select->reset(\Magento\Framework\DB\Select::COLUMNS); $select->columns(['g.value', 'v.position']);
$select->order('v.position'); //$select->limit(1);
$result = $this->resourceConnection->getConnection()->fetchAll($select); $minPosition = 2000;
$position = []; $minImage = '';
foreach ($result as $row) {
if ($row['position'] < $minPosition) {
$minPosition = $row['position'];
$minImage = $row['value'];
$position[$row['position']] = 1;
}
}
if (count($position) > 1) { return $minImage;
}
}
public function updatePosition(int $valueId, int $position)
{
$this->resourceConnection->getConnection()->update( $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value'),
['position' => $position], ['value_id=?' => $valueId]
);
}
}