WP All Import. Эпизод 5. Импорт товаров с использованием API поставщика
По правильному, тут проще использовать API напрямую, написать плагин и тд. Но иногда можно использовать WP All Import, как дополнительный костыль при импорте по API стороннего поставщика.
Важно! Это вполне конкретный пример. У вас могут быть другие исходные данные.
Итак. Существует некий поставщик, который предоставляtт файл выгрузки и API. Так как, в файле выгрузки нет всех необходимых данных, то будем их получать дополнительно.
к содержаниюШаг первый
Делаем стандартный импорт для полученного файла поставщика.
Указываем все данные, которые можно вытащить из файла.
Шаг второй
Теперь делаем запрос в API для получения токена перед основным импортом.
/**
* Получения токена из API
*
* @param int $import_id идентификатор импорта
*
* @throws \JsonException
*
* @sourcecode https://wpruse.ru/courses/plugin-serial-wp-all-import/wp-all-import-epizod-5/
* @author Artem Abramovich
*/
function art_before_xml_import( $import_id ) {
// Проверяем на ID импорта.
if ( (string) 21 === $import_id ) {
$url = 'http://api.brain.com.ua/auth';
$args = [
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => [],
'body' => [
'login' => '',
'password' => '',
],
'cookies' => [],
];
$key = 'products_auth';
$auth = get_transient( $key );
if ( false === $auth ) {
// Получаем HTML
$response = wp_remote_post( $url, $args );
// Проверим на ошибки
if ( is_wp_error( $response ) ) {
return;
}
// Получим тело
$auth = json_decode( wp_remote_retrieve_body( $response ), true, 512, JSON_THROW_ON_ERROR );
// Запишем полученный запрос в транзитную опцию на 24 часа
set_transient( $key, $auth['result'], DAY_IN_SECONDS, );
}
}
}
add_action( 'pmxi_before_xml_import', 'art_before_xml_import', 1, 1 );
functions.php
через дочернюю тему или например пустой плагин. Прежде чем, вносить какие либо изменения, сделайте бекап сайта.Способ аутентификации может быть разный, в данном случае используются пара логин-пароль.
к содержаниюШаг третий
Теперь можно получать нужные данные и записывать их при импорте. В качестве примера, запишем описание товара.
В Functions Editor добавляем функцию получения данных описания
/**
* Функция получения описания
*
* @param int $id Идентификатор продукта из прайса
*
* @return mixed
* @throws \JsonException
*
* @sourcecode https://wpruse.ru/courses/plugin-serial-wp-all-import/wp-all-import-epizod-5/
* @author Artem Abramovich
*/
function art_get_desc_remote( $id ) {
$auth = get_transient( 'products_auth' );
$source_url = 'http://api.brain.com.ua/product';
$url = sprintf(
"%s/%s/%s",
$source_url,
$id,
$auth
);
$response = wp_remote_get(
$url,
[
'timeout' => 120,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => [],
'cookies' => [],
'body' => null,
'compress' => false,
'decompress' => true,
'sslverify' => true,
'stream' => false,
'filename' => null,
]
);
$body = json_decode( wp_remote_retrieve_body( $response ), true, 512, JSON_THROW_ON_ERROR );
return $body['result']['description'];
}
Важно! В функцию необходимо передать ID товара из файла.
к содержаниюВыводы
Данный способ абсолютно наркоманский и не верный. Но он рабочий и когда не хватает скилов вполне может использоваться.