Какова структура поля "Рекомендуемое изображение" в БД?
При установке WP с примерно 1400 изображениями и плагином Media Tools 1.1 я запустил как "Импорт внешнего и установка рекомендуемого изображения", так и "Установка рекомендуемого изображения".
Но функция "рекомендуемые изображения" не работала, потому что она указала (в БД) неправильное имя файла для изображений: вместо указания на правильный файл она добавила "1" к его имени, в результате чего, например, 404 для "Protest-11-620x264.jpg ", когда это должно указывать на "Protest-1-620x264.jpg "
Мне нужно выполнить поиск и заменить в БД в поле _wp_attachment_metadata и удалить лишнюю "1" из имен файлов. Естественно, я буду использовать регулярное выражение , но как мне обработать содержимое поля? В каком из разделов данных есть изображение, которое следует использовать? Другими словами, что мне нужно искать, чтобы узнать, что имя файла является правильным для поиска и замены?
Например (обратите внимание на "Protest-11-620x264.jpg "в там)
_wp_attachment_metadata = a:5:{s:5:"width";i:800;s:6:"height";i:536;s:4:"file";s:22:"2013/11/Protest-11.jpg";s:5:"sizes";a:9:{s:9:"thumbnail";a:4:{s:4:"file";s:22:"Protest-11-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:22:"Protest-11-300x201.jpg";s:5:"width";i:300;s:6:"height";i:201;s:9:"mime-type";s:10:"image/jpeg";}s:6:"slider";a:4:{s:4:"file";s:22:"Protest-11-800x400.jpg";s:5:"width";i:800;s:6:"height";i:400;s:9:"mime-type";s:10:"image/jpeg";}s:7:"content";a:4:{s:4:"file";s:22:"Protest-11-620x264.jpg";s:5:"width";i:620;s:6:"height";i:264;s:9:"mime-type";s:10:"image/jpeg";}s:9:"spotlight";a:4:{s:4:"file";s:22:"Protest-11-580x326.jpg";s:5:"width";i:580;s:6:"height";i:326;s:9:"mime-type";s:10:"image/jpeg";}s:4:"loop";a:4:{s:4:"file";s:22:"Protest-11-174x131.jpg";s:5:"width";i:174;s:6:"height";i:131;s:9:"mime-type";s:10:"image/jpeg";}s:8:"carousel";a:4:{s:4:"file";s:21:"Protest-11-174x98.jpg";s:5:"width";i:174;s:6:"height";i:98;s:9:"mime-type";s:10:"image/jpeg";}s:8:"cp_large";a:4:{s:4:"file";s:22:"Protest-11-300x225.jpg";s:5:"width";i:300;s:6:"height";i:225;s:9:"mime-type";s:10:"image/jpeg";}s:8:"cp_small";a:4:{s:4:"file";s:20:"Protest-11-70x53.jpg";s:5:"width";i:70;s:6:"height";i:53;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:10:{s:8:"aperture";d:3.5;s:6:"credit";s:0:"";s:6:"camera";s:10:"NIKON D40X";s:7:"caption";s:0:"";s:17:"created_timestamp";i:1383833520;s:9:"copyright";s:0:"";s:12:"focal_length";s:2:"18";s:3:"iso";s:3:"200";s:13:"shutter_speed";s:7:"0.00125";s:5:"title";s:0:"";}}
3 answers
Вероятно, вам не следует запускать preg_replace
в метаданных для поля _wp_attachment_metadata
, поскольку данные сериализуются. Я бы рекомендовал вместо этого написать небольшой скрипт для циклического просмотра изображений, несериализации данных, обновления значения, сериализации и сохранения измененного массива. Вот пример функции, которая делает именно это:
function wpse_135525_fix_imagepaths() {
$images = get_posts(array(
'post_type' => 'attachment',
'post_mime_types' => 'image',
'posts_per_page' => -1,
// Extra filtering, e.g. by post_date etc.
));
foreach ($images as $image) {
$attachment_meta = get_post_meta($image->ID, '_wp_attachment_metadata', true);
if ($attachment_meta) {
$attachment_meta = unserialize($attachment_meta);
$filename = $attachment_meta['file'];
$filename = preg_replace('/(\d)\1/', '$1', $filename); // Replace any two repeating digits (44 => 4, 11 => 1 etc.)
$attachment_meta['file'] = $filename;
update_post_meta($image->ID, '_wp_attachment_metadata', serialize($attachment_meta));
}
}
}
Вероятно, вы захотите ограничить запрос post только обработкой вложений, созданных в течение определенного периода времени, и регулярное выражение должно нуждаться в некотором улучшении, чтобы не позволяйте ему заменять любые повторяющиеся цифры в первой части имен файлов и т.д.
Вы можете получить все идентификаторы показанных изображений, запросив таблицу "post_meta" для "_thumbnail_id" (как сказал Майло) в столбце "meta_key" и выбрав столбец "meta_value".
Затем замените свои значения в той же таблице "post_meta", где "post_id" - это значения, указанные выше, а "meta_key" - это "_wp_attached_file" и/или "_wp_attachment_metadata"
Надеюсь, это имеет смысл
У меня была та же проблема с 1100 изображениями:
Это полностью удалит текст из метаданных. Вы также можете заменить текст названием вашего сайта или чем-то еще, например "изображение Mysite".
UPDATE wp_postmeta SET meta_value =
REPLACE( meta_value, 'OLYMPUS DIGITAL CAMERA',
' ' )
WHERE meta_value LIKE '%OLYMPUS DIGITAL CAMERA%'
AND meta_key = '_wp_attachment_metadata';
Заменить конкретным текстом:
UPDATE wp_postmeta SET meta_value =
REPLACE( meta_value, 'OLYMPUS DIGITAL CAMERA', 'Mysitename Image ' )
WHERE meta_value LIKE '%OLYMPUS DIGITAL CAMERA%'
AND meta_key = '_wp_attachment_metadata';
Для определенного изображения или для проверки ограничения по meta_id или post_id, например
UPDATE wp_postmeta SET meta_value =
REPLACE( meta_value, 'OLYMPUS DIGITAL CAMERA', ' ' )
WHERE meta_value LIKE '%OLYMPUS DIGITAL CAMERA%'
AND meta_key = '_wp_attachment_metadata' AND meta_id =705412;
Редактировать: Основываясь на точке зрения Гайи, я должен упомянуть, что длина новой строки должна соответствовать длине старой строки, иначе метаданные могут перерыв.
И, просто чтобы добавить еще один момент, здесь есть скрипт, который я не использовал, но нашел при исследовании этой проблемы.
Http://davidcoveney.com/575/php-serialization-fix-for-wordpress-migrations/