Какова структура поля «Лучшее изображение» в БД?

На WP-установке с примерно 1400 изображениями и плагином Media Tools 1.1 я запускал как «Импорт внешних, так и набор избранных изображений» и «Установить избранное изображение».

Но функциональность функциональных изображений не работала, потому что она обозначала (в БД) неправильное имя файла для изображений: вместо того, чтобы указывать на правильный файл, он добавлял «1» к его имени, вызывая, например, 404 для " Protest-11-620×264.jpg ", когда он должен указывать на" Protest-1-620×264.jpg "

Мне нужно выполнить поиск и заменить в БД на поле _wp_attachment_metadata и удалить лишние «1» из имен файлов. Естественно, я буду использовать регулярное выражение , но как обрабатывать содержимое поля? На каком из разделов данных будет отображаться изображение? Другими словами, что мне нужно, чтобы узнать имя файла, является правильным для поиска и замены?

Например (обратите внимание на «Protest-11-620×264.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:"";}} 

Solutions Collecting From Web of "Какова структура поля «Лучшее изображение» в БД?"

Вероятно, вы не должны запускать 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, eg 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_meta для «_thumbnail_id» (как сказал Мило) в столбце «meta_key» и выбрав столбец «meta_value».

Затем замените свои значения в той же таблице post_meta, где «post_id» – это те, что указаны выше, а «meta_key» – «_wp_attached_file» и / или «_wp_attachment_metadata»,

Надеюсь, что имеет смысл

У меня была та же проблема с 1100 изображениями:

Это полностью удалит текст из метаданных. Вы также можете заменить текст своим именем сайта или чем-то другим, например «Mysite image».

  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; 

edit: Основываясь на точке Гайи, я должен упомянуть, что длина новой строки должна соответствовать длине старой строки, или метаданные могут сломаться.

И, чтобы добавить еще один момент, здесь есть сценарий, который я не использовал, но нашел, исследуя эту проблему.

http://davidcoveney.com/575/php-serialization-fix-for-wordpress-migrations/