Tôi đang cố gắng sử dụng mã dưới đây nhưng nó không hoạt động,
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\Product');
$product->load($productID)->delete();
Tôi đang cố gắng sử dụng mã dưới đây nhưng nó không hoạt động,
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\Product');
$product->load($productID)->delete();
Câu trả lời:
Nếu bạn cố gắng xóa sản phẩm từ fronend thì bạn cần chỉ định khu vực cho điều đó.
Thêm mã sau vào lớp của bạn.
chức năng công cộng __construct ( ........ \ Magento \ Catalog \ Model \ ProductRep repository $ sản phẩmRep repository, \ Magento \ Framework \ Registry $ đăng ký ) { ...... $ this-> sản phẩmRep repository = $ sản phẩmRep repository; $ this-> registry = $ registry; }
Mã sau là để xóa sản phẩm.
$ this-> registry-> đăng ký ('isSecureArea', đúng); // sử dụng sku $ this-> sản phẩm Lưu trữ-> xóaById ('Z62676'); // sử dụng id sản phẩm $ sản phẩm = $ this-> sản phẩm Lưu trữ-> getById (1); $ this-> sản phẩm Lưu trữ-> xóa ($ sản phẩm);
Đầu tiên, tôi khuyên bạn nên cố gắng tránh sử dụng ObjectManager trực tiếp
Thứ hai, tôi cho rằng bạn nên sử dụng \Magento\Catalog\Api\ProductRepositoryInterface
dịch vụ contrat để xóa sản phẩm:
protected $_productRepositoryInterface;
public function __construct(
...
\Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryInterface,
...
) {
...
$this->_productRepositoryInterface = $productRepositoryInterface;
...
}
Sau đó, trong mã của bạn, bạn có thể làm:
$product = $this->_productRepositoryInterface->getById($productID);
$this->_productRepositoryInterface->delete($product);
Lưu ý rằng nếu bạn có sku của sản phẩm, bạn có thể thực hiện trong một dòng:
$this->_productRepositoryInterface->deleteById($productSku);
Thật vậy, bạn không thể xóa sản phẩm trên khu vực lối vào.
Bạn cần phải đăng ký SecureArea.
Nhưng nếu bạn kiểm tra register
chức năng, bạn sẽ thấy rằng bạn không thể ghi đè giá trị khóa tồn tại. Bạn cần hủy đăng ký khóa trước khi đăng ký.
/**
* 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;
}
Giải pháp dựa trên các bài viết khác:
Constructor :
public function __construct(
........
\Magento\Catalog\Model\ProductRepository $productRepository,
\Magento\Framework\Registry $registry
) {
......
$this->productRepository = $productRepository;
$this->registry = $registry;
}
Hợp lý :
$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);
Vui lòng thử đoạn script sau.
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;
}
}
}
Nhấn vào đây để giải thích chi tiết. http://www.pearlbells.co.uk/delete-magento-2-products-programmatically/
Hãy thử mã dưới đây
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('Magento\Catalog\Model\Product');
$product->load($productID)->delete();