Как удалить продукт в Magento-2 программно?


Я пытаюсь использовать приведенный ниже код, но он не работает,

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$product = $objectManager->create('\Magento\Catalog\Model\Product');
$product->load($productID)->delete();
Author: Raphael at Digital Pianism, 2016-10-03

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);
 7
Author: Sohel Rana, 2016-10-03 07:41:39

Во-первых, я предлагаю вам попробовать избегать прямого использования 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);
 4
Author: Raphael at Digital Pianism, 2017-04-13 12:55:05

Действительно, вы не можете удалить продукт в области интерфейса.

Вам необходимо принудительно запустить реестр 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);
 3
Author: Franck Garnier, 2016-11-08 16:04:29

Пожалуйста, попробуйте следующий сценарий.

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/

 1
Author: Liz Eipe C, 2017-08-12 19:02:59

Попробуйте использовать код ниже

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();
 0
Author: Suresh Chikani, 2016-10-03 07:23:12