Удалите «%» из строк в сериализованных массивах в базе данных MySQL - PullRequest
0 голосов
/ 28 марта 2011

В процессе преобразования блога из Blogger в WP и запуска скрипта для захвата изображений с горячей ссылкой для хостинга я получил несколько забавных имен изображений, таких как

act% 252Bapandas-210x290.png

Эти имена изображений не позволяют отображать изображение на веб-странице из-за того, что кодировка URL заканчивается в самом имени файла (не спрашивайте!).Я переименовал их на файловом сервере, без сомнения, но имена также есть в метаданных вложения для каждого сообщения.

Как я могу удалить "%" из всех ссылок на изображения в таблице wp_postmeta?Большинство из них встречаются в сериализованных массивах в meta_value s для meta_key s _wp_attachment_metadata.Мне не повезло найти плагин, и я не уверен, как создать чистое SQL-решение.

РЕДАКТИРОВАТЬ:

Как сказали комментаторы, проблема заключается в том, что изменение или удаление символа "%" И обновление массива, чтобы он сообщал правильное количество символов (т. Е. S: 13 будет означать, что yoursite.com равен 13 символам []) Я такжеоткрыть для использования решения PHP !Что бы ни помогло мне исправить этот беспорядок.

ПОСЛЕДОВАТЕЛЬНОСТЬ И РЕШЕНИЕ

Я на самом деле не формулировал этот вопрос с точки зрения проблемы WordPress, я назвал его проблемой SQL,Я присудил свой ответ соответственно.Но я смог решить проблему изначально (с помощью Rarst @. Вот как я решил проблему, используя встроенные функции WordPress внутри цикла:

$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);

    // loop through array to do any search and replaces

    // write it back
    update_post_meta($post->ID, '_wp_attachment_metadata', $meta); }

Эти функцииавтоматически определять тип данных, которые вы извлекаете или записываете и (не) сериализуете их, если это необходимо. Это выполняется внутренним использованием функций Maybe_serialize () и Maybe_unserialize ().

Ответы [ 5 ]

3 голосов
/ 28 марта 2011

Я уверен, что это невозможно сделать с чистым SQL из-за сложности структуры сериализованного массива.

0 голосов
/ 01 апреля 2011

Вот как я решил проблему, используя встроенные функции WordPress внутри цикла:

$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);

    // loop through array to do any search and replaces

    // write it back
    update_post_meta($post->ID, '_wp_attachment_metadata', $meta); }
0 голосов
/ 28 марта 2011

Чтобы избавиться от знаков% в столбце, вы должны сделать что-то вроде:

UPDATE table_name
SET field_name = replace(field_name, '[%]', '')
0 голосов
/ 28 марта 2011

Если вы просто хотите избавиться от%, это просто - просто замените '%' на что-то другое с помощью функции REPLACE.

Однако я подозреваю, что вы этого не хотите. Это не ясно в вашем вопросе, но я подозреваю, что вы захотите декодировать , что% xxx также вернётся к правильному символу. В этом случае вы можете сначала извлечь часть строки «xxx» (которая должна быть в шестнадцатеричном формате), присоединить перед ней «0x» и привести ее обратно к числу, а затем преобразовать это число в строку. Затем вы используете SUBSTRING, чтобы сшить ваши текстовые данные, с удаленным «%» и заменой новой строки на месте.

РЕДАКТИРОВАТЬ: НЕ ДЕЛАЙТЕ ЭТОГО: ЭТО МОЖЕТ ПРЕРЫВАТЬ СЕРИАЛИЗОВАННЫЙ Массив (СМ. КОММЕНТАРИЙ НИЖЕ)

Я держу этот (неправильный) ответ только для того, чтобы люди знали о его подводных камнях.

0 голосов
/ 28 марта 2011

Попробуйте этот запрос: (замените FIELD_NAMES именами полей, вводя их как отдельные запросы)

update wp_postmeta set FIELD_NAME = replace(FIELD_NAME, '%', '');

ПРИМЕЧАНИЕ: Вы можете изменить '' и сделать его пробелом или чем угодно (оставив его, поскольку он заменяет% без пробела и ничего больше).

РЕДАКТИРОВАТЬ : Неважно, прочитайте комментарий Стивена Чанга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...