Автозаполнение alt изображений на странице записей

Автозаполнение алт изображений на странице записей

 

add_action('init', function() {
    if (isset($_GET['update_alts_now']) && current_user_can('manage_options')) {
        
        $args = array(
            'post_type'      => 'post',
            'posts_per_page' => -1,
            'post_status'    => 'publish'
        );

        $posts = get_posts($args);
        $total_updated = 0;

        foreach ($posts as $post) {
            $content = $post->post_content;
            if (empty($content) || strpos($content, '<img') === false) continue;

            $is_modified = false;
            // Дефолтное значение - заголовок статьи (если картинка выше всех h2-h4)
            $current_heading = trim(strip_tags($post->post_title)); 

            // Разбиваем контент на части по тегам h2-h4 и img
            $parts = preg_split('/(<h[2-4].*?>.*?<\/h[2-4]>|<img.*?>)/is', $content, -1, PREG_SPLIT_DELIM_CAPTURE);

            foreach ($parts as &$part) {
                // Если это подзаголовок - обновляем текущий текст для alt
                if (preg_match('/<h([2-4]).*?>(.*?)<\/h\1>/is', $part, $m)) {
                    $heading_text = trim(strip_tags($m[2]));
                    if (!empty($heading_text)) {
                        $current_heading = $heading_text;
                    }
                    continue;
                }

                // Если это картинка
                if (strpos($part, '<img') !== false) {
                    
                    // Пропускаем картинки внутри блоков товаров (product-card)
                    if (strpos($part, 'product-card') !== false || strpos($part, 'card__image') !== false) {
                        continue;
                    }

                    // Проверяем: если alt уже содержит текст - пропускаем
                    if (preg_match('/alt=["\']([^"\']+)["\']/i', $part, $alt_match)) {
                        if (!empty(trim($alt_match[1]))) {
                            continue; 
                        }
                    }

                    $safe_alt = esc_attr($current_heading);
                    
                    // Если есть пустой атрибут alt=""
                    if (preg_match('/alt=["\']\s*["\']/', $part)) {
                        $part = preg_replace('/alt=["\']\s*["\']/', 'alt="' . $safe_alt . '"', $part);
                        $is_modified = true;
                    } 
                    // Если атрибута alt вообще нет
                    elseif (strpos($part, 'alt=') === false) {
                        $part = str_replace('<img', '<img alt="' . $safe_alt . '"', $part);
                        $is_modified = true;
                    }
                }
            }
            unset($part);

            if ($is_modified) {
                $new_content = implode('', $parts);
                
                // Используем прямую работу с БД, чтобы избежать лишних хуков
                global $wpdb;
                $wpdb->update(
                    $wpdb->posts,
                    array('post_content' => $new_content),
                    array('ID' => $post->ID)
                );
                
                $total_updated++;
            }
        }

        die("Готово! Проверено записей: " . count($posts) . ". Обновлено контента в: $total_updated. Обязательно очистите кеш LiteSpeed!");
    }
});

 

перейти по ссылке

https://вашдомен.ru/?update_alts_now=1

 

 

 

 

Содержимое
Вам может быть интересно

Custom arrow counter Elementor

Описание товаров, генерация использую название

Let's work together!