Cкрипт, который заменит заглушку миниатюры записи WordPress на картинки из текста

Cкрипт, который заменит заглушку миниатюры записи WordPress на картинки из текста

Создайте файл fix-thumbnails-now.php в корневой папке сайта (там же, где wp-config.php).

Вставьте в него этот код:

<?php
set_time_limit(300);
ini_set('memory_limit', '512M');
require_once('wp-load.php');

echo '<h2>Замена миниатюр на картинки из текста</h2>';

$placeholder_id = 0;
$args = array(
    'post_type' => 'attachment',
    'post_status' => 'inherit',
    'name' => 'nofona',
    'posts_per_page' => 1,
    'fields' => 'ids'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    $placeholder_id = $query->posts[0];
    echo '<p>Найдена заглушка nofona.png (ID: ' . $placeholder_id . '). Меняем только её.</p>';
}

$batch_size = 100;
$paged = isset($_GET['paged']) ? (int)$_GET['paged'] : 1;

$query_args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => $batch_size,
    'paged' => $paged,
);

if ($placeholder_id > 0) {
    $query_args['meta_query'] = array(
        array(
            'key' => '_thumbnail_id',
            'value' => $placeholder_id,
            'compare' => '='
        )
    );
}

$posts = get_posts($query_args);
$total_found = count($posts);

if ($total_found == 0) {
    echo '<h3 style="color:green;">ГОТОВО! Больше записей для обработки не найдено.</h3>';
    echo '<p><a href="/">Вернуться на сайт</a> и проверить результат.</p>';
    echo '<p><strong>Важно: удалите этот файл (fix-thumbnails-now.php) с сервера.</strong></p>';
    exit;
}

echo '<p>Обработка партии ' . $paged . ' (найдено ' . $total_found . ' записей)...</p>';

$success = 0;
$fail = 0;

foreach ($posts as $post) {
    $post_id = $post->ID;
    $content = $post->post_content;
    
    if (preg_match('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches)) {
        $image_url = trim($matches[1]);
        
        if (strpos($image_url, '/') === 0) {
            $image_url = home_url($image_url);
        }
        
        $attachment_id = attachment_url_to_postid($image_url);
        
        if (!$attachment_id) {
            $image_data = @file_get_contents($image_url);
            if ($image_data) {
                $filename = sanitize_file_name(basename(parse_url($image_url, PHP_URL_PATH)));
                $upload_dir = wp_upload_dir();
                $filename = wp_unique_filename($upload_dir['path'], $filename);
                $upload = wp_upload_bits($filename, null, $image_data);
                
                if (!$upload['error']) {
                    $wp_filetype = wp_check_filetype($upload['file'], null);
                    $attachment = array(
                        'post_mime_type' => $wp_filetype['type'],
                        'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
                        'post_content' => '',
                        'post_status' => 'inherit'
                    );
                    $attachment_id = wp_insert_attachment($attachment, $upload['file'], $post_id);
                    if (!is_wp_error($attachment_id)) {
                        require_once(ABSPATH . 'wp-admin/includes/image.php');
                        $attach_data = wp_generate_attachment_metadata($attachment_id, $upload['file']);
                        wp_update_attachment_metadata($attachment_id, $attach_data);
                    }
                }
            }
        }
        
        if ($attachment_id) {
            set_post_thumbnail($post_id, $attachment_id);
            $success++;
        } else {
            $fail++;
        }
    } else {
        $fail++;
    }
}

echo '<p>Обработано: ' . $success . ' успешно, ' . $fail . ' ошибок.</p>';

$next_page = $paged + 1;
echo '<p><a href="?paged=' . $next_page . '" style="display:inline-block; padding:10px 20px; background:#0073aa; color:#fff; text-decoration:none; border-radius:3px;">Обработать следующую партию</a></p>';
?>

Откройте в браузере: https://xa4.ru/fix-thumbnails-now.php

Нажимайте кнопку “Обработать следующую партию”, пока не появится зеленая надпись “ГОТОВО”.

После завершения обязательно удалите файл fix-thumbnails-now.php с сервера.

Вот обновленный скрипт с автоматическим переходом на следующую партию (через 3 сек)

<?php
set_time_limit(300);
ini_set('memory_limit', '512M');
require_once('wp-load.php');

echo '<h2>Замена миниатюр на картинки из текста</h2>';

$placeholder_id = 0;
$args = array(
    'post_type' => 'attachment',
    'post_status' => 'inherit',
    'name' => 'nofona',
    'posts_per_page' => 1,
    'fields' => 'ids'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    $placeholder_id = $query->posts[0];
    echo '<p>Найдена заглушка nofona.png (ID: ' . $placeholder_id . '). Меняем только её.</p>';
}

$batch_size = 100;
$paged = isset($_GET['paged']) ? (int)$_GET['paged'] : 1;

$query_args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => $batch_size,
    'paged' => $paged,
);

if ($placeholder_id > 0) {
    $query_args['meta_query'] = array(
        array(
            'key' => '_thumbnail_id',
            'value' => $placeholder_id,
            'compare' => '='
        )
    );
}

$posts = get_posts($query_args);
$total_found = count($posts);

if ($total_found == 0) {
    echo '<h3 style="color:green;">ГОТОВО! Больше записей для обработки не найдено.</h3>';
    echo '<p><a href="/">Вернуться на сайт</a> и проверить результат.</p>';
    echo '<p><strong>Важно: удалите этот файл (fix-thumbnails-now.php) с сервера.</strong></p>';
    exit;
}

echo '<p>Обработка партии ' . $paged . ' (найдено ' . $total_found . ' записей)...</p>';

$success = 0;
$fail = 0;

foreach ($posts as $post) {
    $post_id = $post->ID;
    $content = $post->post_content;
    
    if (preg_match('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches)) {
        $image_url = trim($matches[1]);
        
        if (strpos($image_url, '/') === 0) {
            $image_url = home_url($image_url);
        }
        
        $attachment_id = attachment_url_to_postid($image_url);
        
        if (!$attachment_id) {
            $image_data = @file_get_contents($image_url);
            if ($image_data) {
                $filename = sanitize_file_name(basename(parse_url($image_url, PHP_URL_PATH)));
                $upload_dir = wp_upload_dir();
                $filename = wp_unique_filename($upload_dir['path'], $filename);
                $upload = wp_upload_bits($filename, null, $image_data);
                
                if (!$upload['error']) {
                    $wp_filetype = wp_check_filetype($upload['file'], null);
                    $attachment = array(
                        'post_mime_type' => $wp_filetype['type'],
                        'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
                        'post_content' => '',
                        'post_status' => 'inherit'
                    );
                    $attachment_id = wp_insert_attachment($attachment, $upload['file'], $post_id);
                    if (!is_wp_error($attachment_id)) {
                        require_once(ABSPATH . 'wp-admin/includes/image.php');
                        $attach_data = wp_generate_attachment_metadata($attachment_id, $upload['file']);
                        wp_update_attachment_metadata($attachment_id, $attach_data);
                    }
                }
            }
        }
        
        if ($attachment_id) {
            set_post_thumbnail($post_id, $attachment_id);
            $success++;
        } else {
            $fail++;
        }
    } else {
        $fail++;
    }
}

echo '<p>Обработано: ' . $success . ' успешно, ' . $fail . ' ошибок.</p>';

$next_page = $paged + 1;
echo '<p>Автоматический переход к следующей партии через 3 секунды...</p>';
echo '<p><a href="?paged=' . $next_page . '" id="next-link">Или нажмите здесь для немедленного перехода</a></p>';

// JavaScript для автоматического перехода
echo '<script>
setTimeout(function() {
    window.location.href = "?paged=' . $next_page . '";
}, 3000);
</script>';
?>

guest
Закрыть меню