WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров
В этом эпизоде разберем, как импортировать простые и вариативные товары одновременно, как отключить проверку на кодировку в WP All Import и решение других мелких проблем
Алгоритм импорта товаров
- Импорт категорий
- Импорт товаров и созданием карты категорий
Импорт категорий
Указываем название категории
Записываем ID текущей категории в произвольные поля
Заполняем ID родительской рубрики через функцию my_get_cat_slug
Код для правильного заведения категорий
/**
* Сравнение ID категорий при импорте
*
* @param $old_id
* @param $id
*
* @return string
*/
function my_get_cat_slug( $old_id, $id = true ) {
$terms = get_terms(
[
'taxonomy' => [ 'product_cat' ],
'hide_empty' => false,
'meta_query' => [
[
'key' => 'product_category_import_id',
'value' => $old_id,
'compare' => '=',
],
],
]
);
if ( true === $id ) {
return $terms[0]->term_id;
}
return $terms[0]->slug;
}
Важно!
В настройках импорта, количество получаемых записей для итерации ставим 1
к содержаниюИмпорт товаров
Можно использовать карту категорий, что довольно долго и нудно. А можно использовать функцию выше и указать при настройке импорта товаров
Важный момент!
Все вышеуказанное работает, только если в исходном файле у товара одна категория, если больше, то такое уже работать не будет.
Импорт если несколько категорий у товара
Алгоритм все тот же:
- Заводим категории
- Потом товары
Но функцию придется использовать уже другую:
/**
* Сравнение категорий товаров
*
* @param string $category_ids
* @param string $id
*
* @return string
*
* @author Artem Abramovich
* @verphp 7.4
*/
function my_get_cat_slug( $category_ids, $id = '' ) {
$category_ids = array_map( 'trim', explode( ',', $category_ids ) );
$category_ids_in_site = [];
foreach ( $category_ids as $category_id ) {
$term = get_terms( [
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => [
[
'key' => 'product_category_import_id',
'value' => (int) $category_id,
'compare' => '=',
],
],
]
);
if ( ! empty( $term ) ) {
if ( $id ) {
$category_ids_in_site[] = $term[0]->term_id;
} else {
$category_ids_in_site[] = $term[0]->slug;
}
}
}
return implode( ',', $category_ids_in_site );
}
Функция довольно универсальная. Так что будет работать и с 1-ой категорией.
Теперь при импорте товаров, в настройках категорий указываем так
[my_get_cat_slug({./*[starts-with(local-name(), 'categoryId')]})]
Строка {./*[starts-with(local-name(), 'categoryId')]}
собирает все узлы с названием categoryId
, таким образом получаем строку во всеми категориями из товара.
Альтернативный вариант распределения товаров по категориям
При импорте можно вообще ничего не указывать, pmxi_saved_post
и тоже товары будут раскидываться по категориям
add_action( 'pmxi_saved_post', 'set_category_product', 100, 3 );
/**
* Присваивание категорий товарам
*
* @param int $post_id ID созданного товара
* @param object $xml_node Объект узла
*
* @author Artem Abramovich
* @verphp 7.4
*/
function set_category_product( $post_id, $xml_node ) {
// Ограничиваем работу сниппета нужным импортом
$import_id = ( $_GET['id'] ?? ( $_GET['import_id'] ?? 'new' ) );
// Если ID импорте на совпадает, то прерываем процесс
if ( '41' !== $import_id ) {
return;
}
$category_ids = $xml_node->categoryId;
$category_ids_in_site = [];
foreach ( $category_ids as $category_id ) {
$term = get_terms( [
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => [
[
'key' => 'product_category_import_id',
'value' => (int) $category_id,
'compare' => '=',
],
],
]
);
if ( ! empty( $term ) ) {
$category_ids_in_site[] = $term[0]->term_id;
}
}
wp_set_post_terms( $post_id, $category_ids_in_site, 'product_cat' );
_wc_term_recount($category_ids_in_site, get_taxonomy('product_tag'), true, false);
}
к содержанию