/ Плагины / Экспорт товаров YML

Экспорт товаров YML

HIT

27.01.2019

2164

Самый адекватный и стабильный плагин для формирования файла YML — Market Exporter (1000 установок). Но приходится довольствоваться настройками по-умолчанию, т.к. при сохранении настроек происходит ошибка. Плагин выгружает только товары в наличии, что продиктовано условиями ЯндексМаркета, но это можно изменить.

Выгружаем все файлы, даже которых нет в наличии

Данные решения относятся к версии плагина 1.0.5. Не уверен что в более поздней версии это не изменено. Пользуюсь данной версией, т.к. на некоторых проектах она работает более стабильно.

Изменяем в файле плагина market-exporter/admin/class-market-exporter-wc.php

'value' => 'instock', на 'value' => array( 'instock','outofstock' ), 

Товары со статусом на Маркете «Под заказ»

За этот статус отвечает параметр available, который принимает значения true или false (под заказ).

Делаем вышеупомянутое изменение и также изменяем эту строку в выводе Support for backorders.

Товарам которые должны быть под заказ — делаем статус наличия — Нет в наличие. Статус backorder — будет делать их в наличие.

Выборка категорий

В последней версии плагина появилась возможность выгружать выборочные категории. Для этого во вкладке Настройки в поле Включать следующие категории нужно выбрать необходимые категории. Важный момент: если мы хотим загрузить всю категорию с подкатегориями, то нужно включать каждую подкатегорию в выборку. Если этого не сделать товары из всех подкатегорий выгрузятся, но информации о их категории не будет и Яндекс Маркет посчитает это ошибкой.

Параметр sales_notes для каждого товара

У Market Exporter есть общий параметр sales_notes (заполняется в настройках), но можно настроить и динамически для каждого товара. Нужно создать поле с названием me_sales_notes и заполнять его там где требуется. У товаров с незаполненным me_sales_notes будет подставляться общий sales_notes.

Готовое поле:

add_action( 'woocommerce_product_options_general_product_data', 'woo_add_sales_notes_fields' );
function woo_add_sales_notes_fields() {
	global $woocommerce, $post;
	echo '<div class="options_group">'; 
	woocommerce_wp_text_input( // Add Text field in woocommerce 
		array( 
			'id' => 'me_sales_notes', 
			'label' => __( 'Инфа для Яндекс Маркет', 'woocommerce' ), 
			'placeholder' => 'sales_notes', 
			'desc_tip' => 'true', 
			'description' => __( 'Введите текст', 'woocommerce' ) 
		) 
	); 
	echo '</div>';
}

add_action( 'woocommerce_process_product_meta', 'woo_add_sales_notes_fields_save' );
function woo_add_sales_notes_fields_save( $post_id ){
	$woocommerce_text_field = $_POST['me_sales_notes']; // Text Field
	if( !empty( $woocommerce_text_field ) )
	update_post_meta( $post_id, 'me_sales_notes', esc_attr( $woocommerce_text_field ) );
}
Если плагин Market Exporter не обновляет фид по расписанию — это может быть связано с блокировкой редактирования php-файлов админки

YML for Yandex Market

Недавно обнаружил этот плагин (1000 установок), и просто просмотрев настройки хочу сказать что плагин достойный. Есть все необходимые функции по генерации YML фида. Плагин активно поддерживается.

Vendor из произвольной таксономии

По умолчанию параметр vendor должен браться из назначенного атрибута. Изменим это на термин произвольной таксономии. Например, если на сайте установлен плагин Perfect WooCommerce Brands.

Необходимо изменить в файле market-exporter/includes/class-generator.php (строка 467)

// Vendor.
if ( isset( $this->settings['offer']['vendor'] ) && 'disabled' !== $this->settings['offer']['vendor'] ) {
	$vendor = $product->get_attribute( 'pa_' . $this->settings['offer']['vendor'] );
	if ( $vendor ) {
		$yml .= $this->add_child( 'vendor', wp_strip_all_tags( $vendor ) );
	}
}

на

// Vendor (из таксономии pwb-brand)
if ( isset( $this->settings['offer']['vendor'] ) && 'disabled' !== $this->settings['offer']['vendor'] ) {
	$vendor = wp_get_object_terms($product->get_id(), 'pwb-brand');
	$vendor_first = reset($vendor);
	
	if ( $vendor_first ) {
		$yml .= $this->add_child( 'vendor', $vendor_first->name );
	}
}

pwb-brand — произвольная таксономия

$vendor_first = reset($vendor); — чтобы получить первый элемент

При обновлении плагина Market Exporter, данное изменение сотрется.

Ограничение выгрузки

Ограничиваем наличие товара, больше 1 шт (вставляем в файл /includes/class-generator.php строка 425)

if ( $offer->get_stock_quantity() <= 1 ) {
	continue;
}

Передаем только товары с изображением. Проверка на изображение бессмысленна, т.к. в отсутствии миниатюры выводится placeholder

$product->get_image();

А вот правильная проверка на ID вложенного изображения почему то стопорит генерацию фида

if ( $product->get_image_id() == "" ) {
	continue;
}

Правильное ограничение выгрузки

При этом фид формируется в разы быстрее

Эту и другие ограничения лучше прописывать выше в разделе где формируется изначальная выборка товаров (со строки 225).

Для того чтобы передавать товары только с загруженным изображением, нужно добавить параметр в $args meta_query

[
	'key'   => '_thumbnail_id',
],

Ограничение по количеству товаров (> 1)

[
	'key'   => '_stock',
	'value' => '1',
	'compare' => '>',
],

Выгрузка вариаций

Если выгружаются вариативные товары, то ЯМ может считать предложения задублированными за счет того что товары имеют одинаковые названия. Чтобы добавить в название различающий вариации параметр нужно доработать следующий код:

if ( ! $vendor_model_type ) {
	$yml .= $this->add_child( 'name', $this->clean( $offer->get_title() );
}

следующим образом

// Модифицированный заголовок

$fasovka = $offer->get_attribute( 'pa_fasovka' );
if ( $fasovka ) {
	$zagolovok = $this->clean( $offer->get_title() ).' ('.$fasovka.')';
} else {
	$zagolovok = $this->clean( $offer->get_title() );
}

if ( ! $vendor_model_type ) {
	$yml .= $this->add_child( 'name', $zagolovok );
}

pa_fasovka — атрибут по которому различаются вариации.

Доработка выгрузки с условиями от статуса наличия

sales_note в зависимости от статуса наличия

$stock_status = $product->get_stock_status();
if ($stock_status == 'instock') {
	$yml .= $this->add_child( 'sales_notes', 'Товар в наличии на складе.' );
} elseif ($stock_status == 'onbackorder') {
	$yml .= $this->add_child( 'sales_notes', 'Товар доступен под заказ. Срок поставки от 3 до 12 дней.' );
}

Параметр delivery-options для каждого товара в зависимости от статуса наличия. Добавляем в тот же файл market-exporter/includes/class-generator.php после кода // Delivery. (476)

// Индивидуальные настройки доставки для каждого товара

$stock_status = $product->get_stock_status();
if ($stock_status == 'instock') {
	$yml .= $this->add_child( 'delivery-options', '<option cost="1000" days="1-2"/>' );
} elseif ($stock_status == 'onbackorder') {
	$yml .= $this->add_child( 'delivery-options', '<option cost="1000" days="10-12"/>' );
}

Возможные ошибки

Не все товары выгружаются в фид

По крайней мере это происходит с вариативными товарами. Не выяснил из-за чего конкретно это происходит, но если обновить именно вариации товара а не сам товар (это не поможет), то товар попадает в фид.

Происходило это из-за того что у родительского товара в базе данных цены в полях _price (в зависимости от количества вариантов цен) не были прописаны. Почему то автоматически база не обновила этот момент. Обновить это массово я не смог.

Решил временно это так: скрыл в формировании выборки товаров выводить товары с ценой (строки 227-246):

$args = [
	'posts_per_page' => $per_page,
	'offset'         => $offset,
	'post_type'      => [ 'product' ],
	'post_status'    => 'publish',
	'meta_query'     => [
		/*[
			'key'     => '_price',
			'value'   => 0,
			'compare' => '>',
			'type'    => 'NUMERIC',
		],*/
		[
			'key'   => '_stock_status',
			'value' => 'instock',
		],
	],
	'orderby'        => 'ID',
	'order'          => 'DESC',
];

А ниже, когда уже перебираются все товары вместе с вариациями, наоборот сделал условие на наличие цены:

$custom_price = $offer->get_price();

if ( empty ($custom_price) ) {
	continue;
}

Важно это вставить после кода (строки 414-429):

// If variable product, get product id from $variations array.
$offer_id = ( ( $product->is_type( 'variable' ) ) ? $variations[ $variation_count ]['variation_id'] : $product->get_id() );
if ( $product->is_type( 'variable' ) ) {
	if ( ! $offer->is_in_stock() ) {
		continue;
	}

	// This has to work but we need to think of a way to save the initial offer variable.
	$offer = new WC_Product_Variation( $offer_id );
}
[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Экспорт товаров YML
Проблемы мультисайтовости
Рекомендации для васПроблемы мультисайтовостиOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.