Como excluir um produto no Magento-2 programaticamente?


7

Estou tentando usar o código abaixo, mas ele não está funcionando,

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$product = $objectManager->create('\Magento\Catalog\Model\Product');
$product->load($productID)->delete();

Respostas:


7

Se você tentar excluir o produto da frente, precisará atribuir uma área para isso.

Adicione o seguinte código à sua turma.

função pública __construct (
    ........
    \ Magento \ Catalog \ Model \ ProductRepository $ productRepository,
    Registro \ Magento \ Framework \ Registry $
) {
    ......
    $ this-> productRepository = $ productRepository;
    $ this-> registry = $ registry;
}

O código a seguir é para excluir o produto.

$ this-> registry-> register ('isSecureArea', true);
// usando sku
$ this-> productRepository-> deleteById ('Z62676');

// usando o ID do produto
$ product = $ this-> productRepository-> getById (1);
$ this-> productRepository-> delete ($ product);

4

Primeiro, sugiro que você evite usar o ObjectManager diretamente

Segundo, acho que você deve usar o \Magento\Catalog\Api\ProductRepositoryInterfacecontrato de serviço para excluir um produto:

protected $_productRepositoryInterface;

public function __construct(
     ...
     \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryInterface, 
     ...
) {
    ...
    $this->_productRepositoryInterface = $productRepositoryInterface;
    ...
}

Então, no seu código, você pode fazer:

$product = $this->_productRepositoryInterface->getById($productID);
$this->_productRepositoryInterface->delete($product);

Observe que se você tiver o sku do seu produto, poderá fazê-lo em uma linha:

$this->_productRepositoryInterface->deleteById($productSku);

2

Na verdade, você não pode excluir o produto na área de front-end.

Você precisa forçar o registro SecureArea.

Mas se você verificar a registerfunção, verá que não pode substituir um valor de chave existente. Você precisa cancelar o registro da chave antes de registrá-la.

/**
 * 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;
}

Solução baseada em outras postagens:

Construtor:

public function __construct(
    ........
    \Magento\Catalog\Model\ProductRepository $productRepository,
    \Magento\Framework\Registry $registry
) {
    ......
    $this->productRepository = $productRepository;
    $this->registry = $registry;
}

Lógica:

$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);

1

Por favor, tente o seguinte script.

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;
    }   
}      
}

Clique aqui para obter uma explicação detalhada. http://www.pearlbells.co.uk/delete-magento-2-products-programmatically/


0

Experimente o código abaixo

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();

Esta solução não está funcionando para mim. É o mesmo código que eu estava usando para excluir o produto.
Ranjeet Singh 25/10

Algum erro é exibido?
Suresh Chikani

Não há nenhum erro específico, achei que precisamos usar $ this-> registry-> register ('isSecureArea', true);
Ranjeet Singh 25/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.