This article shows how you can programmatically assign a product to multiple categories and how you can remove a product from a category in Magento2.
The below things are done in the below code:
- Initialize the object manager.
- Set the area code as adminhtml as we are editing the product.
- Define the logger to log information about the delete process. Zend Logger is used.
<?php
error_reporting(1);
set_time_limit(0);
ini_set('memory_limit', '2056M');
use Magento\Framework\App\Bootstrap;
/**
* If your external file is in root folder
*/
require __DIR__ . '/app/bootstrap.php';
/**
* If your external file is NOT in root folder
* Let's suppose, your file is inside a folder named 'xyz'
*
* And, let's suppose, your root directory path is
* /var/www/html/magento2
*/
// $rootDirectoryPath = '/var/www/html/magento2';
// require $rootDirectoryPath . '/app/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$objectManager = $bootstrap->getObjectManager();
// Set Area Code
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode(\Magento\Framework\App\Area::AREA_ADMINHTML); // or \Magento\Framework\App\Area::AREA_FRONTEND, depending on your need
// Define Zend Logger
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/assign-remove-product-to-category.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
Here we need product SKU for this operation, if you have product ID then follow below instruction to get product SKU
Get Product SKU from Product ID:
$productId = 897; // product ID
$productRepository = $objectManager->get('Magento\Catalog\Api\ProductRepositoryInterface');
$product = $productRepository->getById($productId);
$sku = $product->getSku(); // product SKU
Assign a Product to Multiple Categories:
/**
* Assign product to categories
*/
$categoryIds = ['10', '18', '38'];
$categoryLinkRepository = $objectManager->get('\Magento\Catalog\Api\CategoryLinkManagementInterface');
$categoryLinkRepository->assignProductToCategories($sku, $categoryIds);
Remove a Product from a Category:
/**
* Remove product from category
*/
$categoryId = 10;
$categoryLinkRepository = $objectManager->get('\Magento\Catalog\Model\CategoryLinkRepository');
$categoryLinkRepository->deleteByIds($categoryId, $sku);
Hope this will helps you!