プログラムでMagento-2の製品を削除する方法は?


7

以下のコードを使用しようとしていますが、機能しません。

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

回答:


7

fronendから製品を削除しようとする場合は、そのための領域を割り当てる必要があります。

次のコードをクラスに追加します。

パブリック関数__construct(
    ........
    \ Magento \ Catalog \ Model \ ProductRepository $ productRepository、
    \ Magento \ Framework \ Registry $ registry
){
    ……
    $ this-> productRepository = $ productRepository;
    $ this-> registry = $ registry;
}

次のコードは製品を削除するためのものです。

$ this-> registry-> register( 'isSecureArea'、true);
// skuを使用
$ this-> productRepository-> deleteById( 'Z62676');

//製品IDを使用
$ product = $ this-> productRepository-> getById(1);
$ this-> productRepository-> delete($ product);

4

まず、ObjectManagerを直接使用ないことをお勧めします

第二に、私はあなたが製品を削除するために\Magento\Catalog\Api\ProductRepositoryInterfaceサービスのコントラスト使用するべきであると思います:

protected $_productRepositoryInterface;

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

次に、コードで次のことができます:

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

製品のSKUがある場合は、1行で実行できます。

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

2

実際、フロントエンド領域で製品を削除することはできません。

SecureAreaレジストリを強制する必要があります。

ただし、register関数を確認すると、既存のキー値を上書きできないことがわかります。登録する前に、キーの登録解除する必要があります。

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

他の投稿に基づくソリューション:

コンストラクタ:

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

ロジック:

$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

次のスクリプトを試してください。

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

詳細な説明はこちらをクリックしてください。http://www.pearlbells.co.uk/delete-magento-2-products-programmatically/


0

以下のコードを試してください

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

このソリューションは私のために働いていません、これは私が製品を削除するために使用していたものと同じコードです。
Ranjeet Singh

エラーは表示されますか?
Suresh Chikani 16年

特定のエラーではなく、$ this-> registry-> register( 'isSecureArea'、true);を使用する必要があることがわかりました。
Ranjeet Singh 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.