
Накратко за проекта
В голям онлайн магазин, предлагащ масла и автомобилни консумативи, се появи сериозен проблем: десетки изображения, хоствани в /uploads/
, бяха изтрити при миграция на съдържание. Резултатът – стотици счупени <img>
тагове в страници, продукти и блог постове, влошаващи UX, SEO и цялостното възприятие за качество. Задачата: да се изчисти цялото съдържание от липсващи изображения, без да се използват тежки плъгини, за да се запази производителността.
Ключови подобрения
- Пълно премахване на всички счупени изображения от съдържанието на над 700 страници и продукта, без ръчна намеса.
- Без използване на плъгини: Всичко бе постигнато с
SQL
иPHP
, което гарантира чист и стабилен код. - Възстановяване на UX и Core Web Vitals чрез намаляване на 404 грешки и ненужно зареждане на липсващи ресурси.
Използвани технологии
- WordPress + WooCommerce – базова структура на сайта и съдържанието.
- MySQL – за директна намеса в базата данни чрез SQL заявки.
- PHP – за обхождане на публикации и динамично премахване на счупени изображения.
Предизвикателства
Най-голямото предизвикателство беше да се открият изображенията, които сочат към несъществуващи файлове, разпръснати из post_content
и postmeta
, често в сериализирани данни от Elementor и други билдъри. Използването на плъгин като „Better Search Replace“ даде добри dry-run резултати, но за пълна автоматизация и контрол бе нужно програмен подход.
Решение с SQL заявка
Когато имаме известен URL към счупено изображение, можем директно да го премахнем от всички публикации чрез следната SQL заявка:
UPDATE wp_posts
SET post_content = REPLACE(post_content, 'https://example.com/wp-content/uploads/2023/09/thumbs/car.png', '')
WHERE post_content LIKE '%thumbs/car.png%';
Тази заявка почиства всички срещания на конкретния линк в съдържанието на публикации, продукти и страници. Повтаря се за всеки счупен линк. Таблицата wp_posts
може да има различен префикс в зависимост от инсталацията.
Динамично решение с PHP
За пълна автоматизация, особено когато не знаем точните линкове, разработих скрипт, който обхожда всички публикации и проверява всяко изображение дали връща 404. Ако е така – премахва целия <img>
таг.
function remove_broken_images_from_posts() {
global $wpdb;
$posts = $wpdb->get_results("
SELECT ID, post_content FROM {$wpdb->prefix}posts
WHERE post_type IN ('post', 'page', 'product')
AND post_status = 'publish'
");
foreach ($posts as $post) {
$original_content = $post->post_content;
$updated_content = $original_content;
preg_match_all('/<img[^>]+src=["\']([^"\']+)["\']/i', $original_content, $matches);
$image_urls = $matches[1] ?? [];
foreach ($image_urls as $img_url) {
$headers = @get_headers($img_url);
if (!$headers || strpos($headers[0], '404') !== false) {
$updated_content = str_replace($matches[0][array_search($img_url, $image_urls)], '', $updated_content);
}
}
if ($original_content !== $updated_content) {
$wpdb->update(
$wpdb->prefix . 'posts',
['post_content' => $updated_content],
['ID' => $post->ID]
);
echo "Почистен пост ID: {$post->ID}<br>";
}
}
echo " Всички счупени изображения са премахнати.";
}
Стъпки за репродуциране
- Създайте файл
remove-broken-images.php
и поставете горния код. - Качете го в root директорията на сайта или поставете функцията временно в
functions.php
. - Заредете го през браузър или админ панела (ако е във functions.php, той ще се изпълни веднъж).
- След почистване, премахнете кода, за да предотвратите повторно изпълнение.
Резултат
Успешно бяха премахнати всички счупени изображения от съдържанието, без използване на външни плъгини. Сайтът беше забележимо по-бърз, визуално чист и SEO-фрейндли. Времето за ръчна редакция на всяка публикация бе сведено до нула. Подобрихме не само UX, но и crawlability от търсачките, което ще доведе до по-добро класиране в SERP.
Извод
Поддръжката на WordPress сайт на високо ниво не винаги означава инсталиране на още плъгини. Понякога, чист SQL и малко PHP вършат работа по-бързо, по-чисто и по-ефективно. С този подход постигнахме максимален резултат с минимален код – което е същината на добрата разработка.