Как удалить все товары и опции

Сделал импорт нескольких тысяч товаров из внешнего файла. Хочу все переделать и перезалить товары. Пытаюсь удалить товары стандартным способом, как ресурсы. Товары и каталоги удаляются (т.е. становятся красными), но очистить их не получается. Модх просто не реагирует.

Оптимальным кажется вариант удаления товаров через phpMyAdmin. Вопрос в том какие таблицы нужно почистить, чтобы потом ничего не поломалось.
Алексей П
Алексей П
30 ноября 2016, 17:16
modx.pro
6 135

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

Fi1osof
01 декабря 2016, 16:53
Лучше все-таки удалять средствами самого MODX, так как как правило нужные зависимости прописаны и связанные объекты удаляются автоматом. В phpMyAdmin вы можете просто пропустить связанные объекты.
Ваша проблема сейчас связана с тем, что MODX просто не может получить весь объем документов из-за нехватки времени и/или памяти.
Сделайте так: в консоли пропишите такой код:

ini_set("max_execution_time", 0);
ignore_user_abort(true);

$q = $modx->newQuery("modResource", array(
	"deleted"	=> 1,
));

print "<br />Документов на удаление: " . $modx->getCount("modResource", $q);

$q->limit(10);

foreach($modx->getIterator("modResource", $q) as $doc){
	$doc->remove();
}

print "<br />Удалено";
Выполняйте, пока не будут удалены все документы. Лимит сами скорректируйте исходя из того, как быстро будет выполняться скрипт.

Не забывайте предварительно сделать бэкап базы данных.
Алексей П
04 ноября 2017, 23:57
Немного доработанная версия. Чтобы не запускать скрипт по несколько раз. Оставлю здесь для себя. Может еще кому-то пригодится.
Перед использованием нужно заменить параметр parent.

<?php
$step = 10;
$offset = isset($_SESSION['galgenoffset']) && $_SESSION['galgenoffset'] ? $_SESSION['galgenoffset'] : 0;
$modx->setLogLevel(MODX_LOG_LEVEL_ERROR);
$q = $modx->newQuery('modResource', array('parent' => 6007));
$total = $modx->getCount("modResource", $q);
$q->limit($step,$offset);
foreach($modx->getIterator("modResource", $q) as $doc){
	$doc->remove();
}

$_SESSION['galgenoffset'] = $offset + $step;
if ($_SESSION['galgenoffset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['galgenoffset']);
} else {
  $sucsess = round($_SESSION['galgenoffset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
$current = $_SESSION['galgenoffset'] ?
           $_SESSION['galgenoffset'] :
           ($sucsess == 100 ? $total : 0);
print "\n";
print $sucsess.'% ('.$current.')'."\n\n";
    Андрей Степаненко
    05 февраля 2019, 17:55
    msPre удаляет/уничтожает то количество которое влезет на страницу.
    Тестировался на 100к товаров. Удаляет 1000 товаров за 20 минут.
    Можно выборочно отметить нужные товаров в нужных категориях.
      Юрий
      14 апреля 2021, 13:49
      Добрый день, Андрей!
      Скажи пакет удаляет товары вместе с файлами картинок и записи подчищает или стандартным образом?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6