Автозаполнение алт изображений на странице записей
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