Какова структура поля "Рекомендуемое изображение" в БД?


При установке 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:"";}}  
Author: Pieter Goosen, 2014-02-22

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 только обработкой вложений, созданных в течение определенного периода времени, и регулярное выражение должно нуждаться в некотором улучшении, чтобы не позволяйте ему заменять любые повторяющиеся цифры в первой части имен файлов и т.д.

 3
Author: Simon, 2014-03-10 10:41:11

Вы можете получить все идентификаторы показанных изображений, запросив таблицу "post_meta" для "_thumbnail_id" (как сказал Майло) в столбце "meta_key" и выбрав столбец "meta_value".

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

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

 1
Author: K Themes, 2014-03-04 19:58:24

У меня была та же проблема с 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/

 0
Author: ssaltman, 2016-03-18 11:04:49