Проекти

Премахване на счупени изображения в WP с SQL и PHP

5 август 2025 г.

Накратко за проекта

В голям онлайн магазин, предлагащ масла и автомобилни консумативи, се появи сериозен проблем: десетки изображения, хоствани в /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 заявка:

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> таг.

Php
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 " Всички счупени изображения са премахнати.";
}

Стъпки за репродуциране

  1. Създайте файл remove-broken-images.php и поставете горния код.
  2. Качете го в root директорията на сайта или поставете функцията временно в functions.php.
  3. Заредете го през браузър или админ панела (ако е във functions.php, той ще се изпълни веднъж).
  4. След почистване, премахнете кода, за да предотвратите повторно изпълнение.

Резултат

Успешно бяха премахнати всички счупени изображения от съдържанието, без използване на външни плъгини. Сайтът беше забележимо по-бърз, визуално чист и SEO-фрейндли. Времето за ръчна редакция на всяка публикация бе сведено до нула. Подобрихме не само UX, но и crawlability от търсачките, което ще доведе до по-добро класиране в SERP.

Извод

Поддръжката на WordPress сайт на високо ниво не винаги означава инсталиране на още плъгини. Понякога, чист SQL и малко PHP вършат работа по-бързо, по-чисто и по-ефективно. С този подход постигнахме максимален резултат с минимален код – което е същината на добрата разработка.