Как можно быстро удалить несколько десятков тысяч товаров?

Нужно перезалить товары магазина, а для этого нужно очистить предыдущие товары в категориях от существующих, но при попытке удалить категорию вместе с товарами ничего не происходит и через batcher по 20 товаров несколько десятков тысяч нет смысла удалять.
Можно ли быстро удалить все товары на сайте без переустановки modx?
Марк
26 ноября 2019, 12:06
modx.pro
2
995
0

Комментарии: 9

Андрей
26 ноября 2019, 12:40
0
Скриптом через Console.
    Антон Тарасов
    26 ноября 2019, 12:44
    1
    +1
    Можно удалить по шаблону… или просто все товары без разбора. Например, вот — по шаблону:
    $template = 1; 
    $resources = $modx->getCollection('modResource', array('template'=>$template));
    foreach($resources as $resource) {  
        $resource->remove();
    }
    Это если подчистую удалять.
      Марк
      26 ноября 2019, 17:41
      0
      Запустил скрипт в консоли вставив айди шаблона и получил
      Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes) in /home/login/www/core/xpdo/om/xpdoobject.class.php on line 2390
      
      Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 28672 bytes) in Unknown on line 0
        Наумов Алексей
        26 ноября 2019, 17:52
        +1
        getCollection загружает сразу все в память, не прокатит, действительно памяти не хватит.
        Удаляйте или по 1 (getObject) в цикле, или если это долго, то можно getCollection, но за один раз штук по 50.
          Николай
          26 ноября 2019, 18:34
          0
          getIterator работает также как и getCollection, но не загружает все объекты в память, а только по одному когда в цикле перебор идёт. Память жрёт существенно меньше.
            Марк
            26 ноября 2019, 18:52
            0
            Спасибо, просмотрю
            Марк
            26 ноября 2019, 18:51
            0
            $template = 8;
            $q = $modx->newQuery('modResource', array('template'=>$template));
            $q->limit(100);
            $resources = $modx->getCollection('modResource', $q);
            foreach($resources as $resource) {  
                $resource->remove();
            }
            Так, верно?
              Марк
              26 ноября 2019, 18:58
              0
              Не кидайтесь пожалуйста тапками, в php я новичок :(
                Николай
                26 ноября 2019, 19:33
                0
                Можно вот так:
                $resources = $modx->getIterator('modResource', [
                    'template' => 8
                ]);
                
                foreach ($resources as $resource) {
                    $resource->remove();
                    echo "Ресурс {$resource->pagetitle}({$resource->id}) удалён\r\n";
                }
                Запускать лучше в modalConsole, это компонент такой.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9