Как массово изменить формат изображения в WordPress Wocommerce?
При добавлении товаров в woocommerce вручную иногда контент менеджеры вставляют не оптимизированные картинки, а иногда ну прям совсем уж большие ненужные PNG с прозрачным фоном которые занимают десятки мегабайт. Было решено сделать полу-автоматическую обработку изображений и изменение информации о этих изображений в базе.
- Первым делом делаем внутри скрипта подключение к базе данных и выбор нужных данных для последующей обработки изображений. В моем случае я выбрал только товары у которых изображения в формате PNG
- Ищем в базе все записи по соответствующим условиям и выбираем путь к файлу.
- Затем ищем этот файл физически на сервере, открываем его — преобразуем и сохраняем его в JPG, оригинал PNG решил удалять.
- После изменении этих файлов, нужно изменить значения в самой базе данных. В скрипте выводятся на экран запросы с перечнем ID прикрепленных файлов.
- Вставляем или вручную или можно прям в скрипте сделать выполнение запросов UPDATE — и картинки начинают корректно отображаться на сайте.
Набросок скрипта all_image_png_to_jpg_wordpress_wocommerce.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?php $link = mysqli_connect("host", "username", "password", "database", "port", "socket"); //mysqli_set_charset($link, "utf8mb4"); // Выбирайс все значения прикрепленных файлов только png именно к продуктам $sql = "SELECT * FROM `wp_posts` WHERE `post_type`='attachment' AND `post_mime_type`='image/png' AND `post_parent` IN (SELECT ID FROM `wp_posts` WHERE `post_type`='product')"; $result = $link->query($sql); echo "Vibor image png for product:<br>"; if ($result->num_rows > 0) { $i=1; $spisok_ids = ""; while ($row = $result->fetch_assoc()) { $url_image = preg_replace('#^.+://[^/]+#', '', $row['guid']); $url_image2 = str_replace('/wp-content', '', $url_image); echo $i." -|- ".$row['ID']." -|- ".$row['post_title']." -|- ".$row['post_type']." -|- ".$row['post_date']." -|- ".$row['guid']." |||| ".$url_image."-".$url_image2."<br>"; $filePath = dirname(__FILE__).$url_image2; $image = imagecreatefrompng($filePath); $bg = imagecreatetruecolor(imagesx($image), imagesy($image)); imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); imagealphablending($bg, TRUE); imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); //imagedestroy($image); $quality = 100; // 0 = low / smaller file, 100 = better / bigger file $newParh = dirname($filePath); $fileName = basename($filePath, "." . "png"); imagejpeg($bg, $newParh.DIRECTORY_SEPARATOR.$fileName.".jpg", $quality); //imagedestroy($bg); unlink($filePath); if ($i==1){ $spisok_ids .= $row['ID']; }else{ $spisok_ids .= ",".$row['ID']; } $i++; } echo "<hr>IDS-image png product: ".$spisok_ids; } echo "<hr>"; // Вывод генерированных запросов в базу для обновления картинок, можно вручную или внутри скрипта сделать выполнение. echo "UPDATE `wp_posts` SET `post_mime_type`='image/jpg', `guid`=REPLACE(`guid`, '.png', '.jpg') WHERE `post_type`='attachment' and `post_mime_type`='image/png' AND `id` IN ($spisok_ids);"; echo "<hr>"; echo "<hr>"; echo "UPDATE `wp_postmeta` SET `meta_value`=REPLACE(`meta_value`, '.png', '.jpg') WHERE `meta_key`='_wp_attachment_metadata' AND `post_id` IN ($spisok_ids);"; echo "<hr>"; echo "<hr>"; echo "UPDATE `wp_postmeta` SET `meta_value`=REPLACE(`meta_value`, '.png', '.jpg') WHERE `meta_key`='_wp_attached_file' AND `post_id` IN ($spisok_ids);"; echo "<hr>"; ?> |
После выполнения скрипта — все выбранные PNG преобразуются в JPG физически, старые файлы удаляются, база с информацией обновляется. И картинки становятся намного меньше, тем самым и сайт быстрей грузиться да и места меньше занимает.
