回答:
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);
まず、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);
実際、フロントエンド領域で製品を削除することはできません。
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);
次のスクリプトを試してください。
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/
以下のコードを試してください
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();