Tuesday 18 September 2018

Magento 2 : [SOLVE] Magento 2.2.* Find and Remove Duplicate Product Images

One of the biggest issue was product image duplicate on 2.2.*  the issue of storage. The below script delete the unused product images.

Create a php file in your magento root directory like '/public_html/findduplicateimage.php' and past the code

<?php

use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$params = $_SERVER;
$params[Bootstrap::PARAM_REQUIRE_MAINTENANCE] = true; // default false
$params[Bootstrap::PARAM_REQUIRE_IS_INSTALLED] = false; // default true

$bootstrap = Bootstrap::create(BP, $params);

$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$fileSystem = $objectManager->create('\Magento\Framework\Filesystem');
$mediaPath = $fileSystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath();
//echo $mediaPath;

$path = $mediaPath . DIRECTORY_SEPARATOR . "catalog" . DIRECTORY_SEPARATOR . "product";
$product_folder = array();
$di = new RecursiveDirectoryIterator($path);

foreach (new RecursiveIteratorIterator($di) as $filename => $file) {
//echo $filename . ' - ' . $file->getSize() . ' bytes <br/>';
if (!is_dir($filename)) {
$folder_file = str_replace($mediaPath, '', $filename);
$folder_file = str_replace('\\', '/', $folder_file);
$product_folder[] = $folder_file;
}
}

// creat and load all product collection
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\CollectionFactory');
$collection = $productCollection->create()
->addAttributeToSelect('*')
->load();

$images_array = array();

foreach ($collection as $product) {
$objectManager->get("Magento\Catalog\Model\Product\Gallery\ReadHandler")->execute($product);
$imageProcessor = $objectManager->create('\Magento\Catalog\Model\Product\Gallery\Processor');
$images = $product->getMediaGalleryImages();
foreach ($images as $child) {
$file_update = str_replace($mediaPath, "", $child->getPath());
$images_array[] = "/" . $file_update;
}
}
// uncoment below code print array all catalog media array & product use media file array
/*echo "<pre>";
print_r($images_array);
echo "<br/>=======";
print_r($product_folder);
echo "</pre>";*/

foreach ($product_folder as $file) {

if (!in_array($file, $images_array)) {
//echo "<br/> Unlink Found File :::: ".unlink($mediaPath . $file); // uncoment the code when remove the file
echo "<br/>Found file :::::: ". $mediaPath ."  ===  ".$file;

}

die("stop");

?>

Sunday 9 September 2018

Magento 2: [SOLUTION] Order confirmation email contains no FROM or FROM EMAIL address

Confirmation emails have no FROM or FROM email address 2.2.4

Going to : /vendor/magento/module-sales/Model/Order/Email/SenderBuilder.php

 Edit function configureEmailTemplate() and add this line
 $this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity());
 to show like below:

 protected function configureEmailTemplate()
 {
$this->transportBuilder->setTemplateIdentifier($this->templateContainer->getTemplateId());
$this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
$this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
$this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity()); //the below are commented
//$this->transportBuilderByStore->setFromByStore(
// $this->identityContainer->getEmailIdentity(),
// $this->identityContainer->getStore()->getId()
// );
 }

Its a simple fix and its work perfectly.

Magento 2 : [SOLUTION] Tier price saving percentage wrong when Tax/Vat is included in price

Solution:

Magento2 ver. 2.1.5, 2.1.7 

Going to 'vendor/magento/module-catalog/Pricing/Price/TierPrice.php

Line No 209

public function getSavePercent(AmountInterface $amount)
    {
       return ceil(
            100 - ((100 / $this->priceInfo->getPrice(FinalPrice::PRICE_CODE)->getValue())
                * $amount->getBaseAmount())
        );        
       

    }


Replace to :

public function getSavePercent(AmountInterface $amount)
    {
        /*return ceil(
            100 - ((100 / $this->priceInfo->getPrice(FinalPrice::PRICE_CODE)->getValue())
                * $amount->getBaseAmount())
        );*/
        
        $productPriceAmount = $this->priceInfo->getPrice(
            FinalPrice::PRICE_CODE
        )->getAmount();

        return round(
            100 - ((100 / $productPriceAmount->getValue()) * $amount->getValue())
        );

    }


Wednesday 2 May 2018

Magento 2 : How to get associated products of a grouped product in product list page

The following sample code how to load a group product by object manager and get all child products (associated simple products) as an array.


$product_id = $_product->getId();
$groupedProduct = $objectManager->create('Magento\Catalog\Model\Product')->load($product_id);
$_children=$groupedProduct->getTypeInstance()->getAssociatedProducts($groupedProduct);
                                    if(count($_children)>0){                                      
                                    foreach ($_children as $child){
                                    echo "Here are your child Product Ids ".$child->getID()."\n";                                       
                                        }                                      

                                    }

Thursday 15 March 2018

Magento 2 : [Solution] Update default Order Id / Invoice Id / Shipment Id

Go to your database from phpmyadmin,

Here _1 is used for store id after tablename.

Default Frontend store id is 1. if you have multi store then you have to set query for each store with table name like sequence_order_2 upto sequence_order_.*

Enter below query for table sequence_order_1 is used for default store. If you have multiple store you have to set tablename as per store id in below query.

This is only used for order placed from frontend.

sequence_order_1 is used for order id management in magento 2.

ALTER TABLE sequence_order_1 AUTO_INCREMENT=100000001;

Next order id is start from 100000002.

Below Query is defined for INVOICE, if you want to change invoice id

ALTER TABLE sequence_invoice_1 AUTO_INCREMENT=100000001;

For Shipment ALTER TABLE sequence_shipment_1 AUTO_INCREMENT=100000001;

Magento 2 : [Solution] Remove compare functionality in Magento 2

Removed compare product functionality by adding below code in my theme 'degault.xml' file.

/app/design/frontend/themes/default/Magento_Theme/layout/default.xml

<referenceBlock name="catalog.compare.sidebar" remove="true"/>
<referenceBlock name="catalog.compare.link" remove="true"/>

And

/app/design/frontend/themes/default/Magento_Catalog/layout/default.xml

<referenceBlock name="catalog.compare.sidebar" remove="true"/>
<referenceBlock name="catalog.compare.link" remove="true"/>

Thursday 22 February 2018

Magento 2 : [Solution] How to Remove Links on My Account Navigation


Complete list of customer account using XML removal for Magento 2.


<!-- Store credit -->
<referenceBlock name="customer-account-navigation-customer-balance-link" remove="true"/>

<!-- Downloadable product link -->
<referenceBlock name="customer-account-navigation-downloadable-products-link" remove="true"/>

<!-- Subscription link -->
<referenceBlock name="customer-account-navigation-newsletter-subscriptions-link" remove="true"/>

<!-- Billing agreement link -->
<referenceBlock name="customer-account-navigation-billing-agreements-link" remove="true"/>

<!-- Product review link -->
<referenceBlock name="customer-account-navigation-product-reviews-link" remove="true"/>

<!-- My credit card link -->
<referenceBlock name="customer-account-navigation-my-credit-cards-link" remove="true"/>

<!-- Account link -->
<referenceBlock name="customer-account-navigation-account-link" remove="true"/>

<!-- Account edit link -->
<referenceBlock name="customer-account-navigation-account-edit-link" remove="true"/>

<!-- Address link -->
<referenceBlock name="customer-account-navigation-address-link" remove="true"/>

<!-- Orders link -->
<referenceBlock name="customer-account-navigation-orders-link" remove="true"/>

<!-- Wish list link -->
<referenceBlock name="customer-account-navigation-wish-list-link" remove="true"/>

<!-- Gift card link -->
<referenceBlock name="customer-account-navigation-gift-card-link" remove="true"/>

<!-- Gift registry -->
<referenceBlock name="customer-account-navigation-giftregistry-link" remove="true"/>

<!-- Order by SKU -->
<referenceBlock name="customer-account-navigation-checkout-sku-link" remove="true"/>

<!-- Reward points -->
<referenceBlock name="customer-account-navigation-reward-link" remove="true"/>

Any issues please email me.

Thanks,
Kuldeep singh

Wednesday 10 January 2018

Mysql [SOLVED] ERROR 1227 (42000) at line *: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Mysql [SOLVED] ERROR 1227 (42000) at line 1080: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Either remove the DEFINER=.. statement from your sqldump file, or replace the user values with CURRENT_USER.

Like

Find
DEFINER=`olddbusername`@`localhost`

Then replace

DEFINER=`newdbusername`@`localhost`

Thanks,

Monday 1 January 2018

When save a Category Error : A technical problem with the server created an error. Try again to continue what you were doing. If the problem persists, try again later.

Solved this problem with below command line:

php bin/magento maintenance:enable; 
php bin/magento setup:upgrade; 
php bin/magento setup:static-content:deploy -f; 
php bin/magento cache:clean; 
php bin/magento maintenance:disable

if can not solve then remove category content and save it.


Any issues please email me.

Thanks,
Kuldeep singh