⬇️ WP All Import. Небольшой кейс.
В последнее время, частенько попадаются импорты с битыми ссылками на картинки, например есть 5 картинок, а из них 3 битые и не грузятся.
Картинки - это самый медленный элемент импорта. Процесс больно замороченный. Сначала грузится картинка по линку во временные файлы, потом сделать массу проверок на тип и тд. Потом загрузить в медиабиблиотеку, проверить на дубликаты, и в финале еще миниатюр нарезать.
В общем, очень долго.
А если еще и ссылки битые, то время импорта увеличивается на порядки. Примерно замерял: 50 товаров с нормальными ссылками заезжает за 1 минуту, те же товары с битыми уже 40 минут...
Какое решение? Первое что приходит в голову - как то отсортировать передаваемые ссылки перед загрузкой. Но фиг там. Ожидаемо от WPAI, никаких фильтров не нашел. Хотя может и плохо искал. Но что то делать надо.
Нет фильтров, будем фильтровать настройки. Написал функцию, которая фильтрует передаваемую строку с линками
/**
* Удаление битых ссылок на изображения.
*
*
@param string $url_option
*
*
@return string
*/
function sanitize_images_url( string $url_option ): string {
if ( ! $url_option ) {
return '';
}
$urls = parse_strings( $url_option );
if ( empty( $urls ) ) {
return '';
}
$urls = array_unique( $urls );
$urls = array_filter($urls, function($url) {
return str_starts_with($url, '
http://') || str_starts_with($url, '
https://');
});
$valid_urls = [];
foreach ( $urls as $url ) {
if ( ! check_url_fast( $url ) ) {
continue;
}
$valid_urls[] = $url;
}
return implode( ',', $valid_urls );
}
/**
* Парсинг строки с разделителями
*
*
@param $string
*
*
@return array
*/
function parse_strings( $string ): array {
if ( empty( $string ) ) {
return [];
}
if ( strpos( $string, ',' ) !== false ) {
$items = str_getcsv( $string, ',', '"' );
} else {
$items = explode( ' ', $string );
}
$items = array_filter( array_map( 'trim', $items ) );
re