Каков наилучший способ удалить заказ Magento?


Краткий обзор

Я хотел бы удалить тестовые заказы из моего магазина Magento, потому что они влияют на статистику и отчеты о продажах. Будет ли следующий код удалять все записи от:

  • продажи/заказ_инвойс
  • продажи/заказ_инвойция_грид
  • продажа/отправка заказов
  • продажи/заказ_поставка_грид
  • продажи/заказ_кредитмемо
  • продажи/заказ_кредитмемо_грид
  • продажи/заказ_платеж_транзакция
  • продажа/заказ
  • продажи/заказ_грид

Фрагмент кода

$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('entity_id', (array) $orderIds);

foreach ($orders as $order) {
    // XXX - Possible cascade delete?
    $order->delete();
}

Или мне нужно будет удалить каждую из записей по отдельности?

Author: ash, 2014-04-22

4 answers

Как указано в комментариях, ваш скрипт должен хорошо работать для magento версии 1.4+.
В версии 1.4 объекты продаж были сопоставлены с плоскими таблицами, которые имеют ограничения, поэтому все должно хорошо каскадироваться.

Для версий до 1.4 все объекты, связанные с продажами (заказы, счета-фактуры, отгрузки и кредитные карточки), были подслушаны и хранились в одних и тех же таблицах. Так что ничего каскадного.
Для версии до 1.4 вы можете попробовать этот скрипт.
Это должно сработать на потом версии тоже, но я не думаю, что это необходимо.

$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('entity_id', (array) $orderIds);
foreach ($orders as $o) {
    //load order object - I know it's not ok to use load in a loop but it should be ok since it's a one time script
    $order = Mage::getModel('sales/order')->load($o->getId());

    $invoices = $order->getInvoiceCollection();
    foreach ($invoices as $invoice){
        //delete all invoice items
        $items = $invoice->getAllItems(); 
        foreach ($items as $item) {
            $item->delete();
        }
        //delete invoice
        $invoice->delete();
    }
    $creditnotes = $order->getCreditmemosCollection();
    foreach ($creditnotes as $creditnote){
        //delete all creditnote items
        $items = $creditnote->getAllItems(); 
        foreach ($items as $item) {
            $item->delete();
        }
        //delete credit note
        $creditnote->delete();
    }
    $shipments = $order->getShipmentsCollection();
    foreach ($shipments as $shipment){
        //delete all shipment items
        $items = $shipment->getAllItems(); 
        foreach ($items as $item) {
            $item->delete();
        }
        //delete shipment
        $shipment->delete();
    }
    //delete all order items
    $items = $order->getAllItems(); 
    foreach ($items as $item) {
        $item->delete();
    }
    //delete payment - not sure about this one
    $order->getPayment()->delete();
    //delete quote - this can be skipped
    if ($order->getQuote()) {
        foreach ($order->getQuote()->getAllItems() as $item) {
            $item->delete();
        }
        $order->getQuote()->delete();
    }
    //delete order
    $order->delete();
}
 5
Author: Marius, 2014-05-29 08:22:49

Есть несколько способов удалить заказы в Magento

1. Удаляйте заказы один за другим

Для этого сначала вам нужно войти в свой phpMyAdmin (используйте полный доступ). Здесь вам нужно выполнить некоторые запросы, например, следующие:

set @increment_id='200000111';
select @order_id:=entity_id from prefix_sales_order_entity where increment_id=@increment_id;
delete from prefix_sales_order_entity where entity_id=@order_id or parent_id=@order_id;
delete from prefix_sales_order where increment_id=@increment_id;

Пожалуйста, не забудьте заменить "идентификатор заказа" в приведенном выше примере идентификатором заказа, который вы хотите удалить. Аналогично "префиксу", вы можете заменить его на тот, который вы выбрали в своем магазине. Кроме того, вам также необходимо обратить внимание на ОСТАЛЬНАЯ часть базы данных.

2. Удалить все заказы

Шаг 1: Войдите в phpMyAdmin

Шаг 2: Запустите SQL-запрос

Вот запросы, которые вам нужно добавить в свою базу данных, чтобы удалить все заказы:

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE `sales_order`;
TRUNCATE `sales_order_datetime`;
TRUNCATE `sales_order_decimal`;
TRUNCATE `sales_order_entity`;
TRUNCATE `sales_order_entity_datetime`;
TRUNCATE `sales_order_entity_decimal`;
TRUNCATE `sales_order_entity_int`;
TRUNCATE `sales_order_entity_text`;
TRUNCATE `sales_order_entity_varchar`;
TRUNCATE `sales_order_int`;
TRUNCATE `sales_order_text`;
TRUNCATE `sales_order_varchar`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sendfriend_log`;
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
TRUNCATE `tag_summary`;
TRUNCATE `wishlist`;
TRUNCATE `log_quote`;
TRUNCATE `report_event`;

ALTER TABLE `sales_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1;
ALTER TABLE `tag` AUTO_INCREMENT=1;
ALTER TABLE `tag_relation` AUTO_INCREMENT=1;
ALTER TABLE `tag_summary` AUTO_INCREMENT=1;
ALTER TABLE `wishlist` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
ALTER TABLE `report_event` AUTO_INCREMENT=1;

-- позволяет сбросить клиентов

TRUNCATE `customer_address_entity`;
TRUNCATE `customer_address_entity_datetime`;
TRUNCATE `customer_address_entity_decimal`;
TRUNCATE `customer_address_entity_int`;
TRUNCATE `customer_address_entity_text`;
TRUNCATE `customer_address_entity_varchar`;
TRUNCATE `customer_entity`;
TRUNCATE `customer_entity_datetime`;
TRUNCATE `customer_entity_decimal`;
TRUNCATE `customer_entity_int`;
TRUNCATE `customer_entity_text`;
TRUNCATE `customer_entity_varchar`;
TRUNCATE `log_customer`;
TRUNCATE `log_visitor`;
TRUNCATE `log_visitor_info`;

ALTER TABLE `customer_address_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;

-- Теперь давайте сбросим все счетчики идентификаторов

TRUNCATE `eav_entity_store`;
ALTER TABLE `eav_entity_store` AUTO_INCREMENT=1;

SET FOREIGN_KEY_CHECKS=1;

По завершении все заказы удаляются с вашего сайта!

3. Написать сценарий

Путем создания файла с уровнем точно таким же, как index.php, ты может быстро удалить ненужное с помощью идентификатора заказа.

load($orderId);

$invoices = $order->getInvoiceCollection();
foreach ($invoices as $invoice){
$invoice->delete();
}

$creditnotes = $order->getCreditmemosCollection();
foreach ($creditnotes as $creditnote){
$creditnote->delete();
}

$shipments = $order->getShipmentsCollection();
foreach ($shipments as $shipment){
$shipment->delete();
}

$order->delete();
?>

Теперь заказ полностью удален из вашей системы.

4. Используйте расширения

Одним из лучших и быстрых способов удаления нежелательных заказов является использование расширения Magento. Существует множество расширений, поддерживающих эту функцию, которые вы можете увидеть на Magento Connect.

Например, следующее расширение:

Https://www.magentocommerce.com/magento-connect/delete-order-invoice-shipment-credit-memo.html

Это помогает удалять заказы и связанные с ними данные, такие как счет-фактура, кредит-ноты, отгрузка. Кроме того, он также может удалять ненужные отгрузки, счета-фактуры и кредитные авизо отдельно

 1
Author: Jameslj, 2016-07-12 02:52:18
  if (version_compare(phpversion(), '5.2.0', '<')===true) {
      echo  '<div style="font:12px/1.35em arial, helvetica, sans-serif;"><div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"><h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.2.0 or newer. <a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a> Magento using PHP-CGI as a work-around.</p></div>';
      exit;
  }

  error_reporting(E_ALL | E_STRICT);
  ini_set('display_errors', 1);

  $mageFilename = 'app/Mage.php';

  if (!file_exists($mageFilename)) {
      echo $mageFilename." was not found";
      exit;
  }

  require_once $mageFilename;

  Mage::app();

  $executionPath = null;

  /*
  * determine Magento Edition
  */
  if (file_exists('LICENSE_EE.txt')) {
      $edition = 'EE';
  }elseif (file_exists('LICENSE_PRO.html')) {
      $edition = 'PE';
  } else {
      $edition = 'CE';    
  }

  if(($edition=='EE' && version_compare(Mage::getVersion(), '1.11.0.0.', '<')===true)
          || ($edition=='PE' && version_compare(Mage::getVersion(), '1.11.0.0.', '<')===true)
          || ($edition=='CE' && version_compare(Mage::getVersion(), '1.6.0.0.', '<')===true)
    ){
    $executionPath = 'old'; 
  } else {
    $executionPath = 'new';  
  }

  $xpathEntity = 'global/models/sales_entity/entities//table';

  if ($executionPath == 'old') {
      $xpathResource = 'global/models/sales_mysql4/entities//table';
  } else {
      $xpathResource = 'global/models/sales_resource/entities//table';
  }

  $salesEntitiesConf = array_merge(
      Mage::getSingleton('core/config')->init()->getXpath($xpathEntity), 
      Mage::getSingleton('core/config')->init()->getXpath($xpathResource)
  );

  $resource = Mage::getSingleton('core/resource');
  $connection = $resource->getConnection('core_write');


  /*
  * If you want delete System/Order Statuses (Status and State) you
  * should comments below lines (46-51)
  */
  $skipTables = array (
          $resource->getTableName('sales_order_status'),
          $resource->getTableName('sales_order_status_state'),
          $resource->getTableName('sales_order_status_label')
      );
  $salesEntitiesConf = array_diff($salesEntitiesConf, $skipTables);


  /*

  Multiple RDBMS Support in Magento CE 1.6+ / EE 1.11+
      http://www.magentocommerce.com/images/uploads/RDBMS_Guide2.pdf

  2.2. Adapters:

  ... The new Varien_DB_Adapter_Interface was added to sign a contract that all 
  developed adapters must execute in order to get Magento working on an actual 
  database. The interface describes the list of methods and constants that can be used by resource models...

  Used below in the loop:

  * If $executionPath == 'old'
      * Varien_Db_Adapter_Pdo_Mysql::showTableStatus()
      * Varien_Db_Adapter_Pdo_Mysql::truncate()  
  * Else
      * Varien_Db_Adapter_Interface::isTableExists()
      * Varien_Db_Adapter_Interface::truncateTable()

  */

  while ($table = current($salesEntitiesConf) ){
      $table = $resource->getTableName($table);

      if ($executionPath == 'old') {
          $isTableExists = $connection->showTableStatus($table);
      } else {
          $isTableExists = $connection->isTableExists($table);
      }
      if ($isTableExists) {
          try {
              if ($executionPath == 'old') {
                  $connection->truncate($table);
              } else {
                  $connection->truncateTable($table);
              }

              printf('Successfully truncated the <i style="color:green;">%s</i> table.<br />', $table);
          } catch(Exception $e) {
              printf('Error <i style="color:red;">%s</i> occurred truncating the <i style="color:red;">%s</i> table.<br />', $e->getMessage(), $table);
          }
      }

      next($salesEntitiesConf);
  }

  exit('All done...');
  /**
  * @author Dejan Radic <[email protected]>
  */

  if (version_compare(phpversion(), '5.2.0', '<')===true) {
      echo  '<div style="font:12px/1.35em arial, helvetica, sans-serif;"><div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"><h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.2.0 or newer. <a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a> Magento using PHP-CGI as a work-around.</p></div>';
      exit;
  }

  error_reporting(E_ALL | E_STRICT);
  ini_set('display_errors', 1);

  $mageFilename = 'app/Mage.php';

  if (!file_exists($mageFilename)) {
      echo $mageFilename." was not found";
      exit;
  }

  require_once $mageFilename;

  Mage::app();

  $executionPath = null;

  /*
  * determine Magento Edition
  */
  if (file_exists('LICENSE_EE.txt')) {
      $edition = 'EE';
  }elseif (file_exists('LICENSE_PRO.html')) {
      $edition = 'PE';
  } else {
      $edition = 'CE';    
  }

  if(($edition=='EE' && version_compare(Mage::getVersion(), '1.11.0.0.', '<')===true)
          || ($edition=='PE' && version_compare(Mage::getVersion(), '1.11.0.0.', '<')===true)
          || ($edition=='CE' && version_compare(Mage::getVersion(), '1.6.0.0.', '<')===true)
    ){
    $executionPath = 'old'; 
  } else {
    $executionPath = 'new';  
  }

  $xpathEntity = 'global/models/sales_entity/entities//table';

  if ($executionPath == 'old') {
      $xpathResource = 'global/models/sales_mysql4/entities//table';
  } else {
      $xpathResource = 'global/models/sales_resource/entities//table';
  }

  $salesEntitiesConf = array_merge(
      Mage::getSingleton('core/config')->init()->getXpath($xpathEntity), 
      Mage::getSingleton('core/config')->init()->getXpath($xpathResource)
  );

  $resource = Mage::getSingleton('core/resource');
  $connection = $resource->getConnection('core_write');


  /*
  * If you want delete System/Order Statuses (Status and State) you
  * should comments below lines (46-51)
  */
  $skipTables = array (
          $resource->getTableName('sales_order_status'),
          $resource->getTableName('sales_order_status_state'),
          $resource->getTableName('sales_order_status_label')
      );
  $salesEntitiesConf = array_diff($salesEntitiesConf, $skipTables);


  /*

  Multiple RDBMS Support in Magento CE 1.6+ / EE 1.11+
      http://www.magentocommerce.com/images/uploads/RDBMS_Guide2.pdf

  2.2. Adapters:

  ... The new Varien_DB_Adapter_Interface was added to sign a contract that all 
  developed adapters must execute in order to get Magento working on an actual 
  database. The interface describes the list of methods and constants that can be used by resource models...

  Used below in the loop:

  * If $executionPath == 'old'
      * Varien_Db_Adapter_Pdo_Mysql::showTableStatus()
      * Varien_Db_Adapter_Pdo_Mysql::truncate()  
  * Else
      * Varien_Db_Adapter_Interface::isTableExists()
      * Varien_Db_Adapter_Interface::truncateTable()

  */

  while ($table = current($salesEntitiesConf) ){
      $table = $resource->getTableName($table);

      if ($executionPath == 'old') {
          $isTableExists = $connection->showTableStatus($table);
      } else {
          $isTableExists = $connection->isTableExists($table);
      }
      if ($isTableExists) {
          try {
              if ($executionPath == 'old') {
                  $connection->truncate($table);
              } else {
                  $connection->truncateTable($table);
              }

              printf('Successfully truncated the <i style="color:green;">%s</i> table.<br />', $table);
          } catch(Exception $e) {
              printf('Error <i style="color:red;">%s</i> occurred truncating the <i style="color:red;">%s</i> table.<br />', $e->getMessage(), $table);
          }
      }

      next($salesEntitiesConf);
  }

  exit('All done...');

Я не выполнил это решение. Я взял ссылку из этого поста: https://www.codecanal.com/delete-test-orders-in-magento-programmatically/

Поэтому сделайте резервную копию, прежде чем вносить какие-либо изменения.

 1
Author: Shown Marsh, 2018-10-11 06:32:39

Попробуйте это (вы можете использовать внешний скрипт для запуска приведенного ниже фрагмента кода. Magento CE 1.8)

    // Test orders collection.
    $collection = Mage::getModel('sales/order')->getCollection();
                    ->addFieldToFilter('entity_id', (array) $orderIds);

    // Retrieve the write connection.
    $writeConnection = Mage::getSingleton('core/resource')->getConnection('core_write');

    foreach($collection as $order) {
        $orderIncrementId = $order->getIncrementId();
        $query = "SET @orderId = '".$orderIncrementId."';
                SET FOREIGN_KEY_CHECKS = 1;
                DELETE FROM sales_flat_quote
                WHERE reserved_order_id = @orderId;
                DELETE FROM sales_flat_order
                WHERE increment_id = @orderId;
                ";

        // Execute the query.
        $writeConnection->query($query);
    }

ПРИМЕЧАНИЕ: Этот код не соответствует стандартам, так как он использует прямые SQL-запросы. Но он будет делать то, что вы хотите

 0
Author: Sukeshini, 2014-04-24 08:48:33