Wbudowane mechanizmy importu w Magento 2 umożliwiają import/aktualizacje produktów z plików csv. Zdarza się jednak że jesteśmy zmuszeni synchronizować stany magazynowe, ceny lub dodawać "całe" produkty z poziomu kodu. Mamy do wyboru kilka ścieżek aby to wykonać m.in. bezpośrednio poprzez bazę danych [rozwiązanie najszybsze obarczone jednak problemem weryfikacji danych i zależności po stronie naszego kodu], korzystanie z metod i funkcji Magento [częściowa walidacja danych i obsługa zależności po stronie klas Magento] i poprzez API [pełna walidacja po stronie sklepu].
Poniżej prezentuję kod który po dopasowaniu można ożyć by dodać produkt do sklepu z poziomu pliku umieszczonego w katalogu instalacji magento. Część zmiennych zadeklarowanych jest nieużywana w kodzie, mogą się one przydać po modyfikacjach kodu dlatego pozostawiłem je w kodzie.
try {
require __DIR__ . '/app/bootstrap.php';
} catch (\Exception $e) {
echo "problem";
exit(1);
}
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$url = \Magento\Framework\App\ObjectManager::getInstance();
$storeManager = $url->get('\Magento\Store\Model\StoreManagerInterface');
$mediaurl= $storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);//[url do katalogu media]
$state = $objectManager->get('\Magento\Framework\App\State');
$state->setAreaCode('frontend');
$websiteId = $storeManager->getWebsite()->getWebsiteId(); //[id widoku sklepu]
$store = $storeManager->getStore();
$storeId = $store->getStoreId();//[id sklepu]
$rootNodeId = $store->getRootCategoryId(); //[id kategori root]
$_product = $objectManager->create('Magento\Catalog\Model\Product');
$_product->setName('Nazwa produktu');
$_product->setTypeId('simple');//typ produktu
$_product->setAttributeSetId(4);
$_product->setSku( 'SKU produktu');
$_product->setWebsiteIds(array(1));
$_product->setVisibility(4);
$_product->setPrice(array(1));
$_product->setStockData(array(
'use_config_manage_stock' => 0,
'manage_stock' => 1, //zarządznie magazynem
'min_sale_qty' => 1,
'max_sale_qty' => 2,
'is_in_stock' => 1, //status magazynu [jest/brak]
'qty' => $i->carteQuantity //ilosc w magazynie
)
);
$_product->save();