Как вывести кастомные таксономии в CSV экспорте / импорте Woocommerce?

Есть кастомные таксономии, привязанные к $product. На странице товара, например, выводятся без проблем — просто по $post->ID. Но никак не удается отправить их данные в CSV экспортёр Woocommerce. Перебрал уйму вариантов — либо выдаёт нули, либо пустые значения, либо экспортёр повисает. Например, функция ниже отправляет именно пустые:

function add_export_data_publishers( $post ) {
	if (is_admin()) {
		$publishers = get_the_terms($post->ID, 'publisher');
		if ( is_array($publishers) ) {
			$publisher_names = array();
			foreach ($publishers as $publisher) {
				$publisher_names[] = $publisher->name;
			}       
			return $publisher_names;
		}
	}
}
add_filter( 'woocommerce_product_export_product_column_publisher', 'add_export_data_publishers', 10, 2 );

Своими глазами видел, что это возможно сделать, но как — устал искать. Третий день с этим мучаюсь, может, кто-то знает?

Заметки к вопросу:
campusboy 4 года назад

Фильтр всегда должен возвращать значение. Что за CSV экспортёр у тебя?

campusboy 4 года назад

Если речь о дефолтном импортере, то вот накидал статейку https://wp-kama.ru/plugin/woocommerce/adding-custom-export-columns

Moor 4 года назад

Да, дефолтный импорт-экспорт. Добавить колонки не проблема, а вот кастомные таксономии туда впихнуть не смог — не нашел, как их вообще вытащить без $post. А в импорте-экспорте, как я понял, WC вообще не видит ничего, что за пределами $product.

Я уже плюнул и вместо кастомных такосономий отправил данные в глобальные атрибуты, в принципе тоже работает. Но в статье я обнаружил то, на что раньше не обращал внимания — кусок про export_type. Надо будет поэкспериментировать, что будет, если туда пихнуть _post_

campusboy 4 года назад

Но ведь товар, это и есть пост, только тип поста у него product. ID продукта = ID поста соответственно, а если на руках есть ID поста, то берем get_the_terms() и получаем прикрепленные к товару термины своей таксономии. Не вижу проблем.

Moor 4 года назад

Я их тоже не видел, пока не начал пробовать. Я, правда, PHP изучаю на ходу наощупь smile В общем, вот так выглядел вариант с get_the_terms(), и он не работал. Там же мне в комментарии справедливо заметили, что у класса WC_Product нет метода get_the_terms().

campusboy 4 года назад

Если взять тот пример по ссылке (Шаг 2, Вариант 1), то код доработать совсем не много:

add_filter( 'woocommerce_product_export_row_data', 'add_data_to_wc_export', 10, 2 );

/**
 * @param array      $row
 * @param WC_Product $product
 *
 * @return array
 */
function add_data_to_wc_export( $row, $product ) {
	$terms = get_the_terms( $product->get_id(), 'materials' );

	if ( $terms && is_array( $terms ) ) {
		$term_names = wp_list_pluck( $terms, 'name' );

		$row['key_my_field'] = implode( ', ', $term_names );
	}

	return $row;
}

Тут я предположил, что зарегистрирована таксономия materials, где товару указывались материалы, из которых он сделал. И в поле надо сохранять через запятую все эти материалы, если они указаны.

Moor 4 года назад

Ну да, так оно и должно было работать. Я пилил по примеру на гитхабе WC, но там были то ли атрибуты, то ли тэги в примере. Спасибо, буду разбираться.