=== ZipTrading XLSX Catalog ===
Contributors: ziptrading
Requires at least: 6.0
Requires PHP: 5.6
Stable tag: 0.3.10

Экспорт и импорт каталога ZipTrading в XLSX.



= 0.3.10 =
* Исправлена ложная ошибка сопоставления, из-за которой при запуске импорта фокус переходил на автоматически определённую характеристику с повторяющимся названием.
* Для XLSX нашего экспортёра точный технический ключ столбца теперь берётся из скрытого листа _meta отдельно для каждого листа и позиции колонки, а не определяется только по видимому заголовку.
* Разные характеристики с одинаковым названием (например две разные «Ширина») корректно остаются разными полями и больше не блокируют запуск импорта как дубликат.
* Для стороннего XLSX без точной карты _meta повторное неоднозначное авто-сопоставление теперь оставляется на ручной выбор вместо ошибочного назначения одного поля дважды.


= 0.3.9 =
* Панель вкладок сопоставления ограничена шириной карточки и больше не растягивает страницу при большом количестве листов.
* Если листов много, вкладки прокручиваются горизонтально внутри собственной строки.
* Длинные названия листов аккуратно сокращаются визуально, полное название остаётся в title.
* Во время первичной проверки большого XLSX кнопка показывает состояние «Проверяем XLSX…» с вращающейся иконкой и блокируется от повторного запуска.
* Первичная проверка выполняется без перекрытия кнопки модальным окном; модальное окно используется для ошибки и фактического импорта.

= 0.3.8 =
* Для многолистового XLSX сопоставление столбцов разделено по вкладкам с реальными названиями листов.
* Каждый лист показывает собственный полный набор столбцов; одинаковые заголовки из разных листов больше не схлопываются в одну строку.
* Сопоставление хранится отдельно для каждого листа, поэтому WordPress ID и остальные поля могут корректно повторяться на каждом листе.
* Ручной выбор для одинакового заголовка автоматически переносится на другие листы, пока конкретный лист не был переопределён вручную.
* Вкладки листов закрепляются у верхней границы окна при прокрутке и используют штатный стиль nav-tab WordPress.
* Для XLSX с одним товарным листом панель вкладок не показывается.


== 0.3.5 ==
* Отступ закреплённого бокового блока «Импорт товаров» уменьшен со 100px до 50px.

== 0.3.4 ==
* Исправлена фиксация бокового блока «Импорт товаров»: sticky перенесён с внутренней карточки на сам sidebar-grid item, поэтому блок реально удерживается при прокрутке.
* Отступ закреплённого блока от верхней границы окна — 100 px.
* При переходе интерфейса в одноколоночный режим sticky отключается.

== 0.3.3 ==
* Поле выбора XLSX на странице импорта заменено на современную drag&drop-зону с подсветкой при переносе файла, кликом для выбора и отображением имени/размера выбранного файла.
* Боковой блок «Импорт товаров» закреплён при прокрутке с отступом 100 px от верхней границы окна.
* Перед блоком «Дампы БД перед импортом» добавлен отдельный вертикальный отступ.

== 0.3.2 ==
* Перед фактическим импортом автоматически создаётся полный дамп текущей базы данных.
* Ни один товар не изменяется, пока дамп не завершён и не проверен SHA-256.
* Дампы хранятся постоянно в защищённом каталоге и отображаются внизу раздела «Импорт».
* Для дампов доступны скачивание, восстановление, одиночное удаление и массовое удаление через чекбоксы.
* Восстановление БД выполняется пакетами через AJAX, чтобы не упираться в PHP timeout.
* Частично созданные незавершённые дампы не попадают в историю и очищаются автоматически.

== 0.3.1 ==
* Перед импортом добавлен обязательный этап проверки и сопоставления столбцов XLSX.
* Известные названия столбцов определяются автоматически; неизвестные требуют ручного выбора поля или явного «Не импортировать».
* Импорт нельзя запустить, пока каждый неизвестный столбец не обработан и не сопоставлен ровно один столбец WordPress ID.
* Выпадающий список содержит основные поля WordPress, весь блок «Данные товара», категории, бренд, изображения, галерею, сертификаты, файлы, связанные товары, SEO и все характеристики из справочника сайта.
* Подтверждённая карта столбцов является единственным источником сопоставления при импорте; изменённый заголовок больше не подхватывается молча по позиции.

== 0.3.0 ==
* Реализован раздел «Импорт» для XLSX-файлов каталога.
* Главный идентификатор строки — WordPress ID. Если товар с таким ID существует, обновляется именно он.
* Если WordPress ID свободен, новый товар создаётся с тем же ID через штатный import_id WordPress. Если ID занят записью другого типа, чужая запись не изменяется и товар получает новый ID.
* Если WordPress ID пустой, создаётся новый товар с автоматическим ID.
* Импортируются только колонки, присутствующие в XLSX; пустая ячейка очищает соответствующее поле. Отсутствующие колонки не затрагивают данные товара.
* Поддержаны название, slug, статус, HTML-описания, артикулы, цены, наличие, бренд, категории, SEO, фотографии, файлы, сертификаты и технические характеристики.
* Категории и бренд сначала определяются по ID, затем по slug/названию; отсутствующая иерархия категорий может быть восстановлена из полного пути.
* Фотографии и сертификаты привязываются к уже существующим вложениям WordPress по URL без повторной загрузки файлов.
* Импорт выполняется пакетами с прогрессом и безопасным прерыванием.
* Повторяющиеся WordPress ID на нескольких листах импортируются один раз.
* XLSX с формулами, макросами, ActiveX, OLE/вложениями или внешними Excel-связями отклоняется: импорт работает только с обычными значениями.


== 0.2.7 ==
* В боковой блок добавлена настройка «Пустые столбцы: Выгружать / Нет».
* По умолчанию выбрано «Нет»: полностью пустые выбранные поля и характеристики не создают столбцы XLSX.
* При выборе «Выгружать» выбранные поля и применимые характеристики создаются даже если у всех экспортируемых товаров значение пустое.
* Для полностью пустых выбранных групп «Фотографии», «Файлы» и «Сертификаты» в режиме «Выгружать» создаётся минимальная пустая колонка (для файлов — URL и название).
* Настройка сохраняется в скрытом листе _meta для будущего импорта.

== 0.2.6 ==
* В боковом блоке экспорта добавлен выбор режима: «По листам» или «Одним листом».
* Режим «По листам» сохраняет текущую логику: каждая основная категория экспортируется на отдельный лист с её названием.
* Режим «Одним листом» объединяет все выбранные категории и товары без категории в один лист «Все товары», без дублирования товара между основными категориями.
* В объединённом листе поле «Основная категория» содержит фактическую основную категорию товара, а не название общего листа.
* Боковой блок остаётся закреплённым при прокрутке формы.
* Кнопка запуска переименована в «Запустить экспорт».

== 0.2.5 ==
* Исправлено именование листов XLSX: каждый лист теперь называется по основной категории первого уровня, а не «Категория», «Категория (2)» и т. д.
* Исправлена ошибочная очистка запрещённых Excel-символов в названиях листов.
* Длинные русские названия безопасно сокращаются до лимита Excel в 31 Unicode-символ без повреждения кириллицы.

== 0.2.4 ==
* Прямые ссылки на XLSX всегда формируются через HTTPS на домене сайта, даже если старые WordPress options siteurl/home содержат http://.
* В папке экспортов автоматически создаются серверные правила для MIME application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, Content-Disposition: attachment и X-Content-Type-Options: nosniff.
* Каждый готовый XLSX перед публикацией проходит строгую проверку: разрешены только листы, стили и свойства документа; формулы, макросы, ActiveX, OLE, внешние Excel-связи, вложения и внешние relationship запрещены.
* Удалена ненужная инструкция пересчёта workbook: экспорт содержит только обычные значения, без формул.

== 0.2.1 ==
* Готовый XLSX теперь копируется из временного задания в постоянную папку wp-content/uploads/ziptrading-xlsx-exports/.
* Кнопка «Скачать XLSX» получает прямой URL на физический .xlsx-файл и атрибут download; admin-post.php больше не используется для новых выгрузок.
* В разделе «Экспорт» добавлен список до 50 ранее созданных XLSX с датой, размером и повторной кнопкой скачивания.
* Постоянные XLSX не удаляются очисткой временных заданий.
* Добавлено автоматическое восстановление готовых XLSX из временных job-папок версии 0.2.0, если файл ещё сохранился на сервере.
* Старые admin-post ссылки оставлены как совместимость: при наличии временного файла он переносится в постоянное хранилище и выполняется редирект на прямой URL.

== 0.2.0 ==
* Исправлен критический сбой прогресса 0.1.2: добавлен отсутствовавший форматтер plain_number().
* Экспорт переведён на единый снимок данных: WordPress-данные каждого товара читаются один раз, затем XLSX собирается из временного JSONL-снимка.
* Добавлен выбор отдельных полей вместо крупных групп.
* Добавлен отдельный выбор характеристик с автоматической фильтрацией по выбранным категориям; общие и наследуемые параметры учитываются.
* В XLSX по-прежнему попадают только реально заполненные характеристики.
* Добавлен выбор статусов товаров.
* Добавлен экспорт товаров без категории на отдельный лист «Без категории».
* Счётчики категорий учитывают товары во вложенных категориях.
* В категории и бренд добавлены технические ID/slug для будущего обратного импорта.
* Расширен скрытый лист _meta до format_version=2: карта полей, характеристик, категорий, листов и выбранных настроек.
* Прерывание стало безопасным: создаётся cancel-флаг, временная папка не удаляется во время активного шага.
* После сетевой ошибки можно повторить последний шаг без запуска экспорта заново.
* Финальная подготовка листов разбита на отдельные пакетные шаги.
* Временные данные перенесены из публичной uploads-папки в системный временный каталог с дополнительной защитой от HTTP-доступа.
* Исправлен вывод прогресса: числа показываются как «1 920 / 2 847» без &nbsp;.
* Пока экспорт выполняется, показывается только кнопка «Прервать».

== 0.1.2 ==
* Первая версия пакетного XLSX-экспорта.


== 0.2.4 ==
* В разделе «Созданные XLSX» добавлено штатное массовое удаление через WordPress bulk actions и чекбоксы.
* Добавлено выборочное удаление отдельного XLSX через стандартную строковую ссылку «Удалить».
* После удаления показываются стандартные WordPress notices с результатом операции.
* Для таблицы истории используются стандартные классы wp-list-table/widefat/striped, без нового кастомного дизайна.


= 0.2.4 =
* История XLSX: отдельный столбец «Действия» с кнопками «Скачать» и «Удалить».
* Кнопка «Массово удалить (N)» появляется справа только при выборе файлов.
* Исправлено реальное удаление: временная копия завершённого экспорта больше не восстанавливает удалённый XLSX.

= 0.3.7 =
* Боковой блок «Экспорт товаров в XLSX» использует тот же sticky-контейнер, что и импорт: фиксируется при прокрутке с отступом 50px.
* Дополнительные стили не дублируются — экспорт переиспользует существующий класс sticky-сетки импорта.
