В режиме Preview плагин WP All Import изолирует окружение и не всегда передает путь к исходному файлу через стандартные функции, из-за чего кэш категорий остается пустым. Кроме того, для больших YML-файлов (у вас 37 480 записей) парсинг всего файла при вызове функции может сбоить.
Самое надежное и производительное решение — заранее сформировать карту категорий в отдельный временный JSON-файл в папке загрузок WP All Import.
Шаг 1. Напишите код функции в Code Snippets php код
Вставьте этот код, который автоматически создаст компактную карту id => дерево категорий прямо в папке uploads/wpallimport:
function get_yml_category_path($category_id) {
static $map = null;if ($map === null) {
$upload_dir = wp_upload_dir();
$cache_file = $upload_dir[‘basedir’] . ‘/wpallimport_cat_map.json’;// 1. Проверяем кэш
if (file_exists($cache_file) && (time() — filemtime($cache_file) < 86400)) {
$map = json_decode(file_get_contents($cache_file), true);
}// 2. Если кэша нет — парсим категории из рабочего XML
if (empty($map)) {
$map = [];
$raw_cats = [];// Ищем исходный XML-файл в uploads/wpallimport
$import_dir = $upload_dir[‘basedir’] . ‘/wpallimport/uploads’;
$files = glob($import_dir . ‘/*/*.xml’);// Если не нашли в подпапках, ищем последний измененный XML в uploads
if (empty($files)) {
$files = glob($upload_dir[‘basedir’] . ‘/wpallimport/*.xml’);
}if (!empty($files)) {
// Берем самый свежий файл
usort($files, function($a, $b) {
return filemtime($b) — filemtime($a);
});
$source_file = $files[0];// Читаем блок
$handle = @fopen($source_file, ‘r’);
$categories_chunk = »;
if ($handle) {
while (($line = fgets($handle)) !== false) {
$categories_chunk .= $line;
if (strpos($line, ») !== false) {
break;
}
}
fclose($handle);
}if (preg_match(‘/(.*?)<\/categories>/s’, $categories_chunk, $matches)) {
$xml = simplexml_load_string(» . $matches[1] . »);
if ($xml) {
foreach ($xml->category as $cat) {
$id = (string)$cat[‘id’];
$raw_cats[$id] = [
‘name’ => trim((string)$cat),
‘parentId’ => isset($cat[‘parentId’]) ? (string)$cat[‘parentId’] : null,
];
}
}
}
}// Выстраиваем полные цепочки для каждого ID
foreach ($raw_cats as $id => $data) {
$chain = [];
$curr = $id;
$limit = 0;
while ($curr && isset($raw_cats[$curr]) && $limit < 10) { $c_name = $raw_cats[$curr][‘name’]; if ($c_name !== ‘Все товары’) { array_unshift($chain, $c_name); } $curr = $raw_cats[$curr][‘parentId’]; $limit++; } $map[$id] = implode(‘ > ‘, $chain);
}// Сохраняем в кэш
if (!empty($map)) {
@file_put_contents($cache_file, json_encode($map, JSON_UNESCAPED_UNICODE));
}
}
}$target_id = trim((string)$category_id);
return isset($map[$target_id]) ? $map[$target_id] : »;
}
Шаг 2. Корректировка разделителя в шаблоне
Так как функция возвращает путь с пробелами вокруг знака > (Бытовая техника > Климатическая техника > Обогреватели > Конвекторы):
В блоке Taxonomies, Categories, Tags в поле Separated by укажите:
[get_yml_category_path({categoryId[1]})]
Нажмите Save Functions в редакторе функций.
Нажмите Preview под полем иерархии — теперь цепочка отобразится в окне предпросмотра.
