Удалите "%” из строк в сериализованных массивах в wp_postmeta
Вопрос
В ходе конвертации блога с Blogger на WP и запуска скрипта для получения изображений с горячими ссылками для хостинга я получил несколько забавных названий изображений, таких как
act%252Bapandas-210x290.png
Эти имена изображений препятствуют отображению изображения на веб-странице, поскольку кодировка URL заканчивается в самом имени файла (не спрашивайте!).Я переименовал их на файловом сервере, без проблем, но имена также есть в метаданных вложения для каждой записи.
Как я могу удалить "%" из всех ссылок на изображения в таблице wp_postmeta?*Большинство из них встречаются в сериализованных массивах в meta_values для meta_keys _wp_attachment_metadata*.Мне не повезло найти плагин, и я не уверен, как создать чистое решение на SQL / PHP.
Вот пример сериализованной записи массива (дополнительно дополненной плагином Smush.it, тьфу):
a:7:{s:5:"width";s:3:"210";s:6:"height";s:3:"339";s:14:"hwstring_small";s:22:"height='96' width='59'";s:4:"file";s:27:"2011/02/act%252Bapandas.png";s:5:"sizes";a:6:{s:9:"thumbnail";a:4:{s:4:"file";s:27:"act%252Bapandas-210x290.png";s:5:"width";s:3:"210";s:6:"height";s:3:"290";s:10:"wp_smushit";s:271:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x290.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x290.png)";}s:14:"soft-thumbnail";a:4:{s:4:"file";s:27:"act%252Bapandas-179x290.png";s:5:"width";s:3:"179";s:6:"height";s:3:"290";s:10:"wp_smushit";s:271:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-179x290.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-179x290.png)";}s:14:"mini-thumbnail";a:4:{s:4:"file";s:25:"act%252Bapandas-60x60.png";s:5:"width";s:2:"60";s:6:"height";s:2:"60";s:10:"wp_smushit";s:267:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-60x60.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-60x60.png)";}s:5:"slide";a:4:{s:4:"file";s:27:"act%252Bapandas-210x290.png";s:5:"width";s:3:"210";s:6:"height";s:3:"290";s:10:"wp_smushit";s:271:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x290.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x290.png)";}s:10:"soft-slide";a:4:{s:4:"file";s:27:"act%252Bapandas-179x290.png";s:5:"width";s:3:"179";s:6:"height";s:3:"290";s:10:"wp_smushit";s:271:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-179x290.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-179x290.png)";}s:10:"mini-slide";a:4:{s:4:"file";s:27:"act%252Bapandas-210x145.png";s:5:"width";s:3:"210";s:6:"height";s:3:"145";s:10:"wp_smushit";s:271:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x145.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas-210x145.png)";}}s:10:"image_meta";a:10:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";}s:10:"wp_smushit";s:255:"Smush.it error: Could not get the image while processing http://new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas.png (/home/xxxxxxxxx/new.xxxxx.com/wp-content/uploads/2011/02/act%252Bapandas.png)";}
Проблема заключается в изменении или удалении символа "%" И обновлении массива, чтобы он сообщал правильное количество символов (т. Е. s: 13 будет указывать yoursite.com равно 13 символам []) Я также открыт для использования php-решения!Все, что может помочь мне исправить этот беспорядок.
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
Смотрите мой ответ ниже.
Решение
Общая идея состояла бы в том, чтобы перебирать все вложения, чтобы извлекать, изменять и записывать обратно их мету.
Что-то вроде этого (тщательно протестируйте перед использованием на чем-либо важном):
$posts = get_posts(array(
'post_type' => 'attachment',
'numberposts' => -1,
));
foreach( $posts as $post ) {
// retrieve data, unserialized automatically
$meta = get_post_meta($post->ID,'_wp_attachment_metadata', true);
// do stuff with $meta array
// write it back
update_post_meta($post->ID, '_wp_attachment_metadata', $meta);
}
Другие советы
$posts = get_posts(array(
'post_type' => 'attachment',
'numberposts' => -1,
));
// Recursive String Replace - recursive_array_replace(mixed, mixed, array);
function recursive_array_replace($find, $replace, $array){
if (!is_array($array)) {
return str_replace($find, $replace, $array);
}
$newArray = array();
foreach ($array as $key => $value) {
$newArray[$key] = recursive_array_replace($find, $replace, $value);
}
return $newArray;
}
foreach ($posts as $post) {
// retrieve data, unserialized automatically
$meta = get_post_meta($post->ID, '_wp_attachment_metadata', true);
// see if file name has "%" in it
if (strpos($meta[file], "%")) {
//recursively scrub "%"
$meta = recursive_array_replace('%', '', $meta);
}
// write it back
update_post_meta($post->ID, '_wp_attachment_metadata', $meta);
}