Intereting Posts
Несколько плагинов, использующих те же проблемы класса OAuth Загрузите файлы мультимедиа в Amazon S3 При добавлении страницы WordPress в меню она преобразуется в пользовательскую ссылку Как скрыть W3 Total Cache от не админов? Как создать собственную функцию изображения обрезков для плагина WordPress Как использовать функцию checked () для проверки непустого var Как проверить, является ли текущая страница родительским элементом или дочерним элементом в данном меню Измените текст 20seventeen_edit_link () Как определить, $ query_var isset? Пользовательский навигатор Nav Walker отображает текущие пункты меню детей или братьев и сестер без детей что делает мою тему совместимой с несколькими? WP_Comment_Query разбиение на страницы, вникание в неизвестное Автозагрузчик не находит классы из моего плагина Экспорт сообщений в csv с данными из пользовательских полей ACF Как можно отключить правила активации или деактивации темы?

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

На 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/