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>'; ?>