To change All the Images to External Images Please follow below steps and create one module for that.
To change all Images in front-end you need to create four plugin for that to modify and change images with your custom external images.
First Create di.xml file
<VendorName>/<ModuleName>/etc/frontend/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Block\Product\View\Gallery">
<plugin name="add_images_to_gallery" type="<VendorName>\<ModuleName>\Plugin\AddImagesToGalleryBlock" />
</type>
<type name="Magento\Catalog\Block\Product\AbstractProduct">
<plugin name="after_get_image_plugin" type="<VendorName>\<ModuleName>\Plugin\AfterGetImage"/>
</type>
<type name="Magento\Catalog\Block\Product\Image">
<plugin name="after_get_image_url_plugin" type="<VendorName>\<ModuleName>\Plugin\AfterGetImageUrl"/>
</type>
<type name="Magento\Checkout\CustomerData\AbstractItem">
<plugin name="minicart_after_get_itemdata_plugin" type="<VendorName>\<ModuleName>\Plugin\Minicart\AfterGetItemData"/>
</type>
</config>
Now You need to create a plugin files.
<VendorName>/<ModuleName>/Plugin/AddImagesToGalleryBlock.php
<?php
namespace <VendorName>\<ModuleName>\Plugin;
use Magento\Catalog\Block\Product\View\Gallery;
use Magento\Framework\Data\Collection;
use Magento\Framework\Data\CollectionFactory;
use Magento\Framework\DataObject;
class AddImagesToGalleryBlock
{
/**
* @var CollectionFactory
*/
protected $dataCollectionFactory;
/**
* AddImagesToGalleryBlock constructor.
*
* @param CollectionFactory $dataCollectionFactory
*/
public function __construct(
CollectionFactory $dataCollectionFactory
) {
$this->dataCollectionFactory = $dataCollectionFactory;
}
/**
* afterGalleryImages Plugin to change images and use external images stored in custom attribute
*
* @param Gallery $subject
* @param Collection|null $images
* @return Collection|null
*/
public function afterGetGalleryImages(Gallery $subject, $images) {
try {
$hasExternalImage = false;
// logic to get your external images url
if (!$hasExternalImage) {
return $images;
}
$product = $subject->getProduct();
$images = $this->dataCollectionFactory->create();
$productName = $product->getName();
$externalImages = ["https://static.integromat.com/img/packages/magento_256.png"]; // Array of images
foreach ($externalImages as $item) {
$imageId = uniqid();
$small = $item;
$medium = $item;
$large = $item;
$image = [
'file' => $large,
'media_type' => 'image',
'value_id' => $imageId, // unique value
'row_id' => $imageId, // unique value
'label' => $productName,
'label_default' => $productName,
'position' => 100,
'position_default' => 100,
'disabled' => 0,
'url' => $large,
'path' => '',
'small_image_url' => $small,
'medium_image_url' => $medium,
'large_image_url' => $large
];
$images->addItem(new DataObject($image));
}
return $images;
} catch (\Exception $e) {
return $images;
}
}
}
<VendorName>/<ModuleName>/Plugin/AfterGetImage.php
<?php
namespace <vendorName>\<ModuleName>\Plugin;
use Magento\Catalog\Block\Product\AbstractProduct;
class AfterGetImage
{
/**
* AfterGetImage constructor.
*/
public function __construct()
{
}
/**
* @param AbstractProduct $subject
* @param $result
* @param $product
* @param $imageId
* @param $attributes
* @return mixed
*/
public function afterGetImage(AbstractProduct $subject, $result, $product, $imageId, $attributes) {
try {
if ($product) {
$image = array();
$image['image_url'] = "https://static.integromat.com/img/packages/magento_256.png";
$image['width'] = "240";
$image['height'] = "300";
$image['label'] = $product->getName();
$image['ratio'] = "1.25";
$image['custom_attributes'] = "";
$image['resized_image_width'] = "399";
$image['resized_image_height'] = "399";
$image['product_id'] = $product->getId();
if ($image) {
$result->setData($image);
}
}
} catch (\Exception $e) {
}
return $result;
}
}
<VendorName>\<ModuleName>\Plugin\AfterGetImageUrl.php
<?php
namespace <venfdorName>\<moduleName>\Plugin;
use Magento\Catalog\Block\Product\Image;
class AfterGetImageUrl
{
/**
* AfterGetImage constructor.
*/
public function __construct(
)
{
}
/**
* @param Image $image
* @param $method
* @return array|null
*/
public function after__call(Image $image, $result, $method)
{
try {
if ($method == 'getImageUrl' && $image->getProductId() > 0) {
$result = "https://static.integromat.com/img/packages/magento_256.png";
}
} catch (\Exception $e) {
}
return $result;
}
}
<VendorName>\<ModuleName>\Plugin\Minicart\AfterGetItemData.php
<?php
namespace <vendorName>\<moduleName>\Plugin\Minicart;
use Magento\Checkout\CustomerData\AbstractItem;
class AfterGetItemData
{
/**
* AfterGetImageData constructor.
*/
public function __construct(
)
{
}
/**
* @param AbstractItem $item
* @param $result
* @return mixed
*/
public function afterGetItemData(AbstractItem $item, $result)
{
try {
if ($result['product_id'] > 0) {
$image = "https://static.integromat.com/img/packages/magento_256.png";
$result['product_image']['src'] = $image;
}
} catch (\Exception $e) {
}
return $result;
}
}
Thats all changes for Change images in storefront for product on all the places.
I hope it will help you.