WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров

В этом эпизоде разберем, как импортировать простые и вариативные товары одновременно, как отключить проверку на кодировку в WP All Import и решение других мелких проблем

Алгоритм импорта товаров

  1. Импорт категорий
  2. Импорт товаров и созданием карты категорий

Импорт категорий

Указываем название категории

WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 1 • Финты WordPress

Записываем ID текущей категории в произвольные поля

WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 2 • Финты WordPress

Заполняем ID родительской рубрики через функцию my_get_cat_slug

WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 3 • Финты WordPress
к содержанию

Код для правильного заведения категорий

/**
 * Сравнение 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

WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 4 • Финты WordPress
к содержанию

Импорт товаров

Можно использовать карту категорий, что довольно долго и нудно. А можно использовать функцию выше и указать при настройке импорта товаров

WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 5 • Финты WordPress
к содержанию

Важный момент!

Все вышеуказанное работает, только если в исходном файле у товара одна категория, если больше, то такое уже работать не будет.

Импорт если несколько категорий у товара

Алгоритм все тот же:

  • Заводим категории
  • Потом товары

Но функцию придется использовать уже другую:

/**
 * Сравнение категорий товаров
 *
 * @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')]})]
WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров • 6 • Финты WordPress

Строка {./*[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);

}
к содержанию

Исходники файлов

5 2 голоса
Рейтинг статьи

Подписаться
Уведомить о
guest
11 комментарев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
11
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x