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();
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:
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);
Primeiro, sugiro que você evite usar o ObjectManager diretamente
Segundo, acho que você deve usar o \Magento\Catalog\Api\ProductRepositoryInterface
contrato 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);
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 register
funçã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);
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/
Experimente o código abaixo
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();