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.