Pull to refresh

Собираем CSV-файл для импорта custom-постов в товары WooCoommerc’а

Reading time3 min
Views1.9K

Переделываем тут один старый WordPress-сайт в новый Интернет-магазин на WooCommerce. На старом сайте много товаров в виде custom’ных постов с заказом через простую форму Contact Form 7. А надо сделать всё красиво с WooCommerce. Писать граббер прямо с сайта нет желания, импортировать прямо из БД тоже возня лишняя, решили собрать все товары со старого сайта в формате CSV, чтобы потом его загрузить в родной импорт товаров WooCommerce.

<?php

if ($_GET['product_export']) {

	add_action('init', function() {


		// товары на старом сайте - это посты с типом: tovary
		$_products = get_posts(array(
			'numberposts' => -1,
			'post_type' => 'tovary',
		));

		if (is_array($_products) and count($_products)) {
			foreach ($_products as $_product) {

				$line['ID'] = $_product->ID;
				$line['Имя'] = $_product->post_title;
				$line['Изображение'] = get_the_post_thumbnail_url($_product->ID, 'full');
				$line['Описание'] = $_product->post_content;

				$_meta = get_metadata('post', $_product->ID);

				if (is_array($_meta['mwpf_technical']) and count($_meta['mwpf_technical']) and count($_meta['mwpf_technical'][0])) {

					
					//$line['meta'] = var_export(	$_meta, true ); // раскоментить если нужно будет посмотреть что там =)

					$_price = (int) str_replace(' ', '', $_meta['mwpf_action_one'][0]); 
					$line['Базовая цена'] = $_price ? $_price : ''; // чтобы цена не была 0 в WooCommerce для товаров без цены на старом сайте

					// там мы собираем нужные нам мета-поля ( произвольные поля WordPress для записей )
					$line['Мета: mwpf_file'] = $_meta['mwpf_file'][0];
					$line['Мета: mwpf_file_name'] = $_meta['mwpf_file_name'][0];


					// а так пришлось собирать атрибуты из HTML-таблицы записанной в мета-поле товара
					preg_match_all('|<td>(.*?)</td><td>(.*?)</td></tr>|is', $_meta['mwpf_technical'][0], $buff);

					//$line['dfsd'] = '<pre>'. strip_tags(var_export( $buff, true)) . '</pre>'; // проверка

					// этот код вам не понадобится, но вдруг у вас будет похожая ситуация

					if ( is_array($buff[1]) and count($buff[1]) ) {
						foreach ($buff[1] as $key => $_value) {
							$_name = trim(strip_tags($_value));
							if ($_name == '') continue;
							if (is_numeric($_name)) continue;
							$__value = trim(strip_tags($buff[2][$key]));
							if ( $__value == '+')
								$__value = 'да';
							$atts[$line['ID']][$_name] = $__value;
							$atts_names[$_name] = $_name;
						}
					}

					if ( is_array($atts_names) and count($atts_names) ) {
						foreach($atts_names as $_name) {
							if (isset($atts[$line['ID']][$_name])) {
								$line[$_name] = $atts[$line['ID']][$_name];
							} else {
								$line[$_name] = '';
							}
						}
					}

					//$line['Атрибуты'] = var_export($buff, true); // проверка
				}

				$headers = array_merge( (array) $headers, array_combine(array_keys($line), array_keys($line)) );

				$lines[] = $line;
			}
		}

		if (is_array($lines) and count($lines)) {

			// собираем таблицу для просмотра на странице, чтобы понимать правильно ли мы всё сделали:

			echo '<table border="1">';
			echo '<tr>';
			foreach ( $headers as $_name ) {
				echo '<th>' . $_name . '</th>';
			}
			echo '</tr>';

			foreach ($lines as $_line) {
				echo '<tr>';
				foreach ($headers as $_name) {
					echo '<td>' . $_line[$_name] . '</td>';
				}
				echo '</tr>';
			}

			echo '</table>';



			// а теперь начинаем собирать данные для CSV-файла:
			$line = array();
			foreach ( $headers as $_name ) {
				if (isset($atts_names[$_name])) {
					$i++;
					$line[] = "Имя атрибута $i";
					$line[] = "Значение(-я) аттрибута(-ов) $i";
					$line[] = "Видимость атрибута $i";
					$line[] = "Глобальный атрибут $i";
				} else {
					$line[] = $_name;
				}
			}
			$data[] = $line;

			foreach ($lines as $_line) {
				$line = array();
				foreach ($headers as $_name) {
					if (isset($atts_names[$_name])) {
						$line[] = $_name;
						$line[] = $_line[$_name];
						$line[] = 1;
						$line[] = 1;
					} else {
						$line[] = $_line[$_name];
					}
				}
				$data[] = $line;
			}

			// записываем все наши данные в CSV-файл
			@unlink(__DIR__.'/export.csv');
			$fp = fopen(__DIR__.'/export.csv', 'w');
			foreach ($data as $_fields) {
			    fputcsv($fp,  $_fields);
			}
			fclose($fp);

			// выводим ссылку на CSV-файл
			echo '<hr><a href="' . get_template_directory_uri() . '/export.csv">Скачать CSV</a>';

		}

		exit();
	});
}

Не торопитесь охать и ахать от безумного кода. Задача была быстро и просто перенести товары со старого сайт на новый в WooCommerce.

Там много лишнего кода, который может вам не пригодится. С другой стороны возможно у вас такая ситуация и Вам нужно быстрое решение.

Код был написан прямо в functions.php активной темы и вызван через ваш_сайт/product_export?=1. В итоге перед вами будет таблица данных и ссылка на корректный CSV-файл, готовый для импорта в WooCommerce.

Кстати WooCommerce фотографии прямо грузит по ссылкам со старого сайта, что удобно, а если здесь:

$line['Изображение'] = get_the_post_thumbnail_url($_product->ID, 'full');

можно указать несколько ссылок ко всем изображениям товара, тогда WooCommerce в процессе импорта загрузит их все: по первой ссылке будет главное фото товара, остальные пойдут в галерею.

К примеру если вы собрали URL-адреса к изображениям товара в массив $images

if (is_array($images) and count($images)) {
	$line['Изображение'] = implode(',', $images);
}
Tags:
Hubs:
Total votes 5: ↑0 and ↓5-5
Comments2

Articles