Skip to content

Instantly share code, notes, and snippets.

@MagePsycho
Last active January 8, 2024 03:08
Show Gist options
  • Save MagePsycho/8fae2823235915f7a2bb615e2b332072 to your computer and use it in GitHub Desktop.
Save MagePsycho/8fae2823235915f7a2bb615e2b332072 to your computer and use it in GitHub Desktop.
Update Magento2 Prices in bulk - an easier and faster way! - https://www.magepsycho.com/magento2-mass-regular-special-tier-group-price-importer.html
<?php
/**
*
* @author Raj KB<magepsycho@gmail.com>
* @website http://www.magepsycho.com
* @extension MassImporterPro: Pricing - http://www.magepsycho.com/mass-importer-pro-price-importer-regular-special-tier-group.html
*/
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Capture warning / notice as exception
set_error_handler('ctv_exceptions_error_handler');
function ctv_exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
return;
}
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
require __DIR__ . '/../app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');
/**************************************************************************************************/
// UTILITY FUNCTIONS - START
/**************************************************************************************************/
function _mpLog($data, $includeSep = false)
{
$fileName = BP . '/var/log/m2-magepsycho-import-prices.log';
if ($includeSep) {
$separator = str_repeat('=', 70);
file_put_contents($fileName, $separator . '<br />' . PHP_EOL, FILE_APPEND | LOCK_EX);
}
file_put_contents($fileName, $data . '<br />' .PHP_EOL, FILE_APPEND | LOCK_EX);
}
function mpLogAndPrint($message, $separator = false)
{
_mpLog($message, $separator);
if (is_array($message) || is_object($message)) {
print_r($message);
} else {
echo $message . '<br />' . PHP_EOL;
}
if ($separator) {
echo str_repeat('=', 70) . '<br />' . PHP_EOL;
}
}
function getIndex($field)
{
global $headers;
$index = array_search($field, $headers);
if ( !strlen($index)) {
$index = -1;
}
return $index;
}
function readCsvRows($csvFile)
{
$rows = [];
$fileHandle = fopen($csvFile, 'r');
while(($row = fgetcsv($fileHandle, 0, ',', '"', '"')) !== false) {
$rows[] = $row;
}
fclose($fileHandle);
return $rows;
}
function _getResourceConnection()
{
global $obj;
return $obj->get('Magento\Framework\App\ResourceConnection');
}
function _getReadConnection()
{
return _getConnection('core_read');
}
function _getWriteConnection()
{
return _getConnection('core_write');
}
function _getConnection($type = 'core_read')
{
return _getResourceConnection()->getConnection($type);
}
function _getTableName($tableName)
{
return _getResourceConnection()->getTableName($tableName);
}
function _getAttributeId($attributeCode)
{
$connection = _getReadConnection();
$sql = "SELECT attribute_id FROM " . _getTableName('eav_attribute') . " WHERE entity_type_id = ? AND attribute_code = ?";
return $connection->fetchOne(
$sql,
[
_getEntityTypeId('catalog_product'),
$attributeCode
]
);
}
function _getEntityTypeId($entityTypeCode)
{
$connection = _getConnection('core_read');
$sql = "SELECT entity_type_id FROM " . _getTableName('eav_entity_type') . " WHERE entity_type_code = ?";
return $connection->fetchOne(
$sql,
[
$entityTypeCode
]
);
}
function _getIdFromSku($sku)
{
$connection = _getConnection('core_read');
$sql = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
return $connection->fetchOne(
$sql,
[
$sku
]
);
}
function checkIfSkuExists($sku)
{
$connection = _getConnection('core_read');
$sql = "SELECT COUNT(*) AS count_no FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
return $connection->fetchOne($sql, [$sku]);
}
function updatePrices($sku, $price, $storeId = 0)
{
$connection = _getWriteConnection();
$entityId = _getIdFromSku($sku);
$attributeId = _getAttributeId('price');
$sql = "INSERT INTO " . _getTableName('catalog_product_entity_decimal') . " (attribute_id, store_id, entity_id, value) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)";
$connection->query(
$sql,
[
$attributeId,
$storeId,
$entityId,
$price
]
);
}
/**************************************************************************************************/
// UTILITY FUNCTIONS - END
/**************************************************************************************************/
try {
$csvFile = 'var/import/prices.csv'; #EDIT - The path to import CSV file (Relative to Magento2 Root)
$csvData = readCsvRows(BP . '/' . $csvFile);
$headers = array_shift($csvData);
$count = 0;
foreach($csvData as $_data) {
$count++;
$sku = $_data[getIndex('sku')];
$price = $_data[getIndex('price')];
if ( ! checkIfSkuExists($sku)) {
$message = $count .'. FAILURE:: Product with SKU (' . $sku . ') doesn\'t exist.';
mpLogAndPrint($message);
continue;
}
try {
updatePrices($sku, $price);
$message = $count . '. SUCCESS:: Updated SKU (' . $sku . ') with price (' . $price . ')';
mpLogAndPrint($message);
} catch(Exception $e) {
$message = $count . '. ERROR:: While updating SKU (' . $sku . ') with Price (' . $price . ') => ' . $e->getMessage();
mpLogAndPrint($message);
}
}
} catch (Exception $e) {
mpLogAndPrint(
'EXCEPTION::' . $e->getTraceAsString()
);
}
sku price
24-MB01 31
24-MX02 32
24-UG04 94
24-UG05 99
@MagePsycho
Copy link
Author

Announcement

An extension for Magento 2 called Magento 2 Regular, Special & Tier Price Importer has been released to make your price importing task much easier.

Key Features

  • Provides bulk update for all types of price with just a single CSV file - more import sources will be added soon
  • Option to preview the uploaded file which gives the glance view of the file data
  • The detailed error message provided during import validation helps to fix the price data faster
  • Support for different types of price rounding (whole number to the psychological pricing)
  • Price values can be increased(+), decreased(-) by a fixed amount value or percentage
  • Price values can also be set as a certain percentage of some reference attribute value
  • Option to export the different prices which makes import file preparation much easier

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment