Làm cách nào để xóa một sản phẩm trong Magento-2 theo chương trình?


7

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:


7

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

4

Đầ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\ProductRepositoryInterfacedị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);

2

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

1

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/


0

Hãy thử mã dưới đây

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

Giải pháp này không hiệu quả với tôi, Đây là mã giống như những gì tôi đang sử dụng để xóa sản phẩm.
Ranjeet Singh

Bất kỳ lỗi nào được hiển thị?
Suresh Chikani

Không có bất kỳ lỗi cụ thể nào, tôi thấy rằng chúng ta cần sử dụng $ this-> registry-> register ('isSecureArea', true);
Ranjeet Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.