Как удалить продукт в Magento-2 программно?
Я пытаюсь использовать приведенный ниже код, но он не работает,
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\Product');
$product->load($productID)->delete();
5 answers
Если вы попытаетесь удалить продукт из внешнего интерфейса, вам необходимо назначить область для этого.
Добавьте следующий код в свой класс.
public function __construct( ........ \Magento\Catalog\Model\ProductRepository $productRepository, \Magento\Framework\Registry $registry ) { ...... $this->productRepository = $productRepository; $this->registry = $registry; }
Следующий код предназначен для удаления продукта.
$this->registry->register('isSecureArea', true); // using sku $this->productRepository->deleteById('Z62676'); // using product id $product = $this->productRepository->getById(1); $this->productRepository->delete($product);
Во-первых, я предлагаю вам попробовать избегать прямого использования ObjectManager
Во-вторых, я считаю, что вам следует использовать \Magento\Catalog\Api\ProductRepositoryInterface
сервис контраст для удаления продукта:
protected $_productRepositoryInterface;
public function __construct(
...
\Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryInterface,
...
) {
...
$this->_productRepositoryInterface = $productRepositoryInterface;
...
}
Затем в своем коде вы можете сделать:
$product = $this->_productRepositoryInterface->getById($productID);
$this->_productRepositoryInterface->delete($product);
Обратите внимание, что если у вас есть артикул вашего продукта, вы можете сделать это в одной строке:
$this->_productRepositoryInterface->deleteById($productSku);
Действительно, вы не можете удалить продукт в области интерфейса.
Вам необходимо принудительно запустить реестр SecureArea.
Но если вы проверите функцию register
, вы увидите, что вы не можете переопределить существующее значение ключа. Вам необходимо отменить регистрацию ключа, прежде чем регистрировать его.
/**
* Register a new variable
*
* @param string $key
* @param mixed $value
* @param bool $graceful
* @return void
* @throws \RuntimeException
*/
public function register($key, $value, $graceful = false)
{
if (isset($this->_registry[$key])) {
if ($graceful) {
return;
}
throw new \RuntimeException('Registry key "' . $key . '" already exists');
}
$this->_registry[$key] = $value;
}
Решение, основанное на других сообщениях :
Конструктор:
public function __construct(
........
\Magento\Catalog\Model\ProductRepository $productRepository,
\Magento\Framework\Registry $registry
) {
......
$this->productRepository = $productRepository;
$this->registry = $registry;
}
Логика:
$this->registry->unregister('isSecureArea');
$this->registry->register('isSecureArea', true);
// using sku
$this->productRepository->deleteById('Z62676');
// using product id
$product = $this->productRepository->getById(1);
$this->productRepository->delete($product);
Пожалуйста, попробуйте следующий сценарий.
function deleteAllProducts($objectManager) {
$objectManager->get('Magento\Framework\Registry')->register('isSecureArea', true);
$productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\CollectionFactory');
$collection = $productCollection->create()->addAttributeToSelect('*')->load();
$app_state = $objectManager->get('\Magento\Framework\App\State');
$app_state->setAreaCode('frontend');
foreach ($collection as $product){
try {
echo 'Deleted '.$product->getName().PHP_EOL;
$product->delete();
} catch (Exception $e) {
echo 'Failed to remove product '.$product->getName() .PHP_EOL;
echo $e->getMessage() . "\n" .PHP_EOL;
}
}
}
Нажмите здесь для подробного объяснения. http://www.pearlbells.co.uk/delete-magento-2-products-programmatically/
Попробуйте использовать код ниже
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();