Wie lösche ich ein Produkt in Magento-2 programmgesteuert?

7

Ich versuche, den folgenden Code zu verwenden, aber er funktioniert nicht.

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

Antworten:

7

Wenn Sie versuchen, ein Produkt aus fronend zu löschen, müssen Sie dafür einen Bereich zuweisen.

Fügen Sie Ihrer Klasse folgenden Code hinzu.

öffentliche Funktion __construct (
    ........
    \ Magento \ Catalog \ Model \ ProductRepository $ productRepository,
    \ Magento \ Framework \ Registry $ Registrierung
) {
    ......
    $ this-> productRepository = $ productRepository;
    $ this-> registry = $ registry;
}}

Der folgende Code dient zum Löschen des Produkts.

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

// mit Produkt-ID
$ product = $ this-> productRepository-> getById (1);
$ this-> productRepository-> delete ($ product);
Sohel Rana
quelle
4

Zunächst schlage ich vor, dass Sie versuchen, die direkte Verwendung des ObjectManager zu vermeiden

Zweitens denke ich, dass Sie den \Magento\Catalog\Api\ProductRepositoryInterfaceService contrat verwenden sollten , um ein Produkt zu löschen:

protected $_productRepositoryInterface;

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

Dann können Sie in Ihrem Code Folgendes tun:

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

Beachten Sie, dass Sie, wenn Sie die SKU Ihres Produkts haben, dies in einer Zeile tun können:

$this->_productRepositoryInterface->deleteById($productSku);
Raphael beim digitalen Pianismus
quelle
2

In der Tat können Sie Produkte im Frontend-Bereich nicht löschen.

Sie müssen die SecureArea-Registrierung erzwingen.

Wenn Sie jedoch die registerFunktion überprüfen , sehen Sie, dass Sie einen vorhandenen Schlüsselwert nicht überschreiben können. Sie müssen die Registrierung des Schlüssels aufheben, bevor Sie ihn registrieren können.

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

Lösung basierend auf anderen Beiträgen:

Konstrukteur :

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

Logik :

$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);
Franck Garnier
quelle
1

Bitte versuchen Sie das folgende Skript.

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

Klicken Sie hier für eine detaillierte Erklärung. http://www.pearlbells.co.uk/delete-magento-2-products-programmatic/

Liz Eipe C.
quelle
0

Versuchen Sie es mit dem folgenden Code

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();
Suresh Chikani
quelle
Diese Lösung funktioniert bei mir nicht. Dies ist derselbe Code, mit dem ich das Produkt gelöscht habe.
Ranjeet Singh
Fehler werden angezeigt?
Suresh Chikani
Kein spezifischer Fehler, ich fand, dass wir $ this-> registry-> register verwenden müssen ('isSecureArea', true);
Ranjeet Singh