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

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

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

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

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/


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.