Как обновить количество продуктов и статус запасов программным способом по идентификатору продукта: Magento 2
Я хочу обновить количество продуктов и изменить статус запасов, как на складе, программно по идентификатору продукта. Я не хочу вставлять новый продукт, но я хочу только обновить существующий продукт по его идентификатору. Кто-нибудь знает, как это сделать? Я попытался следовать коду, но не получил результата.
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$storeManager = $obj->get('\Magento\Store\Model\StoreManagerInterface');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
//$productMetadata = $objectManager->get('Magento\Framework\App\ProductMetadataInterface');
//echo 'VERSION ==> '.$productMetadata->getVersion();
$product_id = 1;
$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface');
$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
//$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$product->setQty(100);
$product->save();
Редактировать: я хочу запустить в корневом каталоге и простой php-файл. Я хочу работать как
Localhost/m229/updateproduct.php
4 answers
Вы можете использовать приведенный ниже пример кода
$product->setStockData(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->save();
Вы можете использовать приведенный ниже фрагмент кода в своем скрипте для обновления данных о запасах и статусе продукта.
$stockData = [
'use_config_manage_stock' => 0, // checkbox for 'Use config settings'
'manage_stock' => 1, // manage stock
'min_sale_qty' => 1, // Shopping Cart Minimum Qty Allowed
'max_sale_qty' => 2, // Shopping Cart Maximum Qty Allowed
'is_in_stock' => 1, // Stock Availability of product
'qty' => 100 // qty of product
];
$product->setStockData($stockData);
$product->setQuantityAndStockStatus($stockData);
$product->save();
Кроме того, вы можете использовать приведенный ниже код в своем классе помощника или блока в пользовательском модуле для обновления состояния запасов продукта.
protected $_product;
/**
* @var Magento\CatalogInventory\Api\StockStateInterface
*/
protected $_stockStateInterface;
/**
* @var Magento\CatalogInventory\Api\StockRegistryInterface
*/
protected $_stockRegistry;
/**
* @param Magento\Framework\App\Helper\Context $context
* @param Magento\Catalog\Model\Product $product
* @param Magento\CatalogInventory\Api\StockStateInterface $stockStateInterface,
* @param Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Catalog\Model\Product $product,
\Magento\CatalogInventory\Api\StockStateInterface $stockStateInterface,
\Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry,
) {
$this->_product = $product;
$this->_stockStateInterface = $stockStateInterface;
$this->_stockRegistry = $stockRegistry;
parent::__construct($context);
}
/**
* For Update stock of product
* @param int $productId which stock you want to update
* @param array $stockData your updated data
* @return void
*/
public function updateProductStock($productId,$stockData) {
$product=$this->_product->load($productId); //load product which you want to update stock
$stockItem=$this->_stockRegistry->getStockItem($item['product_id']); // load stock of that product
$stockItem->setData('is_in_stock',$stockData['is_in_stock']); //set updated data as your requirement
$stockItem->setData('qty',$stockData['qty']); //set updated quantity
$stockItem->setData('manage_stock',$stockData['manage_stock']);
$stockItem->setData('use_config_notify_stock_qty',1);
$stockItem->save(); //save stock of item
$product->save(); // also save product
}
Надеюсь, это поможет!!!
Примечание: использование диспетчера объектов не рекомендуется, но поскольку вы используете пользовательский скрипт, я также дам вам ответ с помощью диспетчера объектов
Попробуйте этот код:
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productRepository = $objectManager->create('\Magento\Catalog\Model\ProductRepository');
$stockRegistry = $objectManager->create('\Magento\CatalogInventory\Api\StockRegistryInterface');
$id = 1;
$product = $productRepository->getById($id);
$stockItem = $stockRegistry->getStockItemBySku($product->getSku());
$stockItem->setQty(100);
$stockRegistry->updateStockItemBySku($product->getSku(), $stockItem);
Надеюсь, это сработает для вас
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$storeManager = $obj->get('\Magento\Store\Model\StoreManagerInterface');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
//$productMetadata = $objectManager->get('Magento\Framework\App\ProductMetadataInterface');
//echo 'VERSION ==> '.$productMetadata->getVersion();
$product_id = 1;
$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface');
$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
//$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
//$product->setQty(100);
$yourQty = 100;
$product->setStockData(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->save();
Это работает для меня. я скопировал некоторый код из ответа Нарайяна.