Переделываем тут один старый 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);
}
<?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);
}
Собираем CSV-файл для импорта custom-постов в товары WooCoommerc’а
Переделываем тут один старый WordPress-сайт в новый Интернет-магазин на WooCommerce. На старом сайте много товаров в виде custom’ных постов с заказом через простую форму Contact Form 7. А надо сделать...
habr.com