Чому імпорт моєї бази даних втрачає дані текстового віджета?


46

Я створив сайт у WordPress на нашій машині розвитку. У темі, яку ми використовуємо, є численні зони віджетів для відображення тексту (у бічній панелі та на головній сторінці). Я використовував прості текстові віджети у всіх цих зонах для розміщення відображуваної інформації.

Коли я мігрував сайт на виробництво, я використовував плагін WP-DB-Backup, щоб зробити знімок бази даних. Потім я відредагував отриманий файл .sql, щоб оновити всі шляхи до файлів та посилання на URL, щоб вказати на наш виробничий сайт.

Після створення бази даних, веб-сайту та копіювання всіх файлів на виробничий сайт я запускаю файл .sql з командного рядка mysql для імпорту даних у нову базу даних.

Однак, коли я заходжу на виробничий майданчик, частина тексту з’являється, а частина - ні. Коли я переглядаю розділ віджетів на сайті, текстові віджети відсутні у деяких зонах віджетів. Текстові віджети навіть не видно в зоні "Неактивний віджет", їх просто немає.

Я навіть намагався повторити процес, використовуючи плагін BackWPup, помічаючи, що синтаксис SQL відрізняється, коли він викидає базу даних.

Чому я втрачаю дані текстових віджетів під час імпорту?


Я займався копанням по дорозі, і єдине, про що я можу придумати, - це те, що інформація віджетів зберігається в таблиці wp_options, яка виглядає дивно кодувати деякі його дані. Я ще не зміг спробувати це з іншою темою, щоб зрозуміти, чи пов’язана вона з темою.
Діллі-О

Відповіді:


44

Ось де ваша проблема:

Потім я відредагував отриманий файл .sql, щоб оновити всі шляхи до файлів та посилання на URL, щоб вказати на наш виробничий сайт.

Ви не можете цього зробити. WordPress зберігає багато варіантів як "серіалізовані дані", що містить як рядовий вміст речей, так і їх довжину . Отже, коли ви змінюєте URL-адресу і змінюється довжина, то серіалізовані дані більше не є правильними, і PHP відкидає її.

Довгострокова проблема полягає в тому, що, в основному, ви робите це неправильно. Якщо ви налаштовуєте веб-сайт для розробки, який буде переміщувати його дані, він повинен мати точно таку ж URL-адресу, що і для вашого виробничого сайту. Ви можете вручну відредагувати свій файл HOSTS, щоб вказати цьому виробничому домену (наприклад, example.com) іншу IP-адресу (наприклад, 127.0.0.1), і таким чином URL-адреса "виробництва" стане сайтом розробки лише для вас. Тоді ви можете створити свої дані та посилання та все інше, використовуючи цю виробничу URL-адресу, і коли ви переміщуєте дані, нічого про них не потрібно змінювати.

Однак у короткостроковому періоді не використовуйте простий пошук / заміну тексту у файлі SQL. Як ви виявили, це руйнує речі.

І хоча я не вагаюся запропонувати це, є спосіб змінити основний код WordPress для обробки цих порушених серіалізацій. Ви повинні змінити файл wp-include / функции.php і змінити функцію Maybe_unserialize () на цю:

function maybe_unserialize( $original ) {
    if ( is_serialized( $original ) ) {
        $fixed = preg_replace_callback(
            '!(?<=^|;)s:(\d+)(?=:"(.*?)";(?:}|a:|s:|b:|i:|o:|N;))!s',
            'serialize_fix_callback',
            $original );
        return @unserialize( $fixed );
    }
    return $original;
}
function serialize_fix_callback($match) { return 's:' . strlen($match[2]); }  

Це НЕ є життєздатним довгостроковим рішенням. Це потрібно використовувати лише для того, щоб ви вже зараз працювали та працювали. У кінцевому рахунку вам потрібно виправити процес розробки так, що вам не доведеться робити подібні розробки URL-адрес для початку.


@ Відмінна відповідь. Швидке запитання, чи змінити не серіалізовану таблицю крапки / тексту, наприклад wp_posts поза MySql, будь-який із серіалізованих даних у wp_post_meta чи wp_options? У мене була така ж проблема з текстовим віджетом, але я не торкнувся wp_options, я змінив лише wp_posts.
Chris_O

Нічого собі, я ніколи не розумів, що це відбувається з даними, але це має повний сенс! Дуже дякую!
Діллі-О

4
Ще одне вирішення, яке використовують деякі люди, - це зробити так, щоб їх система розвитку мала доменне ім’я "example.dev" замість "example.com". Таким чином, довжина не змінюється для рядків, коли вони переміщують їх у виробництво. Я віддаю перевагу методу файлів HOSTS.
Отто

3
2016 і wordrepss досі зберігають серіалізовані дані в базі даних. most famous worst codeприз не повинен шукати більше.
Ejaz

1
СПАСИБІ!!! Хороший момент і чудовий хакер. Узагалі я отримую цей хак, щоб повернути всі дані, а після цього просто оновити існуючі налаштування знову і коли вилучите цей код, ідеально працювати.
Івіджан Стефан Стипіч

10

Щоб вирішити цю проблему, я завжди використовую тут інструмент для пошуку та заміни серіалізованих WordPress . Це прекрасно працює з вирішенням будь-яких питань. Я давно використовую це для всіх міграційних вимог мого сайту. Це дійсно вирішує проблеми із переміщенням бази даних розвитку у виробництво.

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/


1
Так, використовую цей сценарій роками і настійно рекомендую його
davemac

Працював для мене більшу частину часу. Але на цьому тижні , коли я замінив http://localhost/Me/site_nameна http://site.dev(від одного локального хоста на інший) , використовуючи V 3.0.0 я втрачаю віджетів і меню позиції як не дивно. Тому, можливо, це питання пов'язане і з довжиною рядка.
rhand

Я використовував .., але ніколи ще не стикався з цією ситуацією. Чи можете ви завантажити старішу версію цього сценарію та спробувати ще раз. Спробуйте замінити localhost/Me/site_nameна site.dev.
Субхараджан

URL змінився (тепер https замість http): interconnectit.com/products/…
Корьонік

Чудовий сценарій. Я копіював базу даних MySQL з PHPMyAdmin зі старої на нову - без зміни URL-адрес -, а потім перейшов у папку нового веб-сайту, де були нові файли WP (поряд із належним wp-config.php, із нові облікові дані БД), додав сценарій, і він подбав про все. Серіалізовані дані оновлюються за звичайними URL-адресами. Легко і швидко! Настійно рекомендується. Важливо: не забудьте видалити скрипт після його використання, оскільки він має доступ до ваших даних БД!
Арахіс

7

Відповідь Отто точкова. Я також виявив це важким шляхом.

Однак мені вдалося вирішити це за допомогою класного сценарію на веб-сторінці http://spectacu.la/search-and-replace-for-wordpress-databases/

Щоб перемістити Wordpress та нове URL / доменне ім’я, виконайте наступне:

  1. Візьміть дамп БД (наприклад, використовуючи phpmyadmin) наявного wordpress
  2. Відновіть дамп як є (не потребує змін) до нового місця розташування
  3. Розпакуйте скрипт з specu.la в домашню папку wordpress (це не плагін ...)
  4. Запустіть скрипт на новому веб-сайті, вказавши на нього свій браузер, наприклад http: //new-website.url/searchreplacedb.php
  5. Не забудьте видалити скрипт із нового будинку WordPress

1
Я знаю, що це щось старе, але де я повинен вказати нове ім'я бази даних, якщо я відновляю дамп таким, яким він є? я не можу принаймні поставити нове ім’я бази даних на другий крок? Дякую за цю інформацію
andresmijares

Я не впевнений, що повністю розумію ваше запитання. Відновлення бази даних можна виконати за допомогою таких інструментів, як phpmyadmin, і ви можете дати їй нове ім’я або скористатися старим ім'ям. Сценарій, про який я згадував, просто змінює текст всередині бази даних після того, як він уже відновлений.
Йоав Анер

Привіт Yoav, дякую за відповідь, я маю на увазі, коли я експортую БД, я зазвичай змінюю ім’я бази даних на нове та змінює посилання на домен. Сказав це, на етапі номер другого ур ви кажете відновити дамп як - це без модифікацій, я просто хотів дізнатися, чи це буквально, або я повинен хоча б змінити ім'я бази даних. Я знаю, що це може бути підступне питання, я просто розгублений, ще раз дякую за відповідь ур
andresmijares

Я не знаю, як ви скидаєте свою базу даних, але якщо ви використовуєте phpmyadmin 'export' інструмент, то не має значення, яке ім’я бази даних це. Ви можете використовувати експорт та імпортувати його назад до будь-якої іншої бази даних. Як правило, щодо точки 2, я думаю, що це нормально, щоб змінити ім'я бази даних.
Йоав Анер

2

ОП виявився надмірним, коли робив пошук та заміну файлу експорту бази даних, і в результаті зміни випадків "wp_" в межах деяких серіалізованих даних. Рішення полягає в тому, щоб бути більш неохайним у пошуку та заміні, включивши backtick у звичайний вираз, а потім оновити вручну решту ключів у базі даних після імпорту.

Якщо ви мігруєте та змінюєте префікс, і вам подобається більш ручний підхід, виконайте наступне (це стосується лише проблем, пов'язаних з ОЗ, і не стосується оновлення URL-адреси сайту)

  1. Створіть резервну копію та перемістіть файл SQL для експорту вашої бази даних у нове середовище (мій приклад передбачає ім'я файлу backup_YYYY-MM-DD.sql)
  2. Зробіть масу пошуку та заміни у файлі SQL, щоб змінити імена таблиць, щоб використовувати ваш новий префікс (PRIOR до імпорту файлу SQL!). Одним із способів зробити це буде використання одноколірного Perl типу: perl -p -i.bak -e "s /` wp_ / `myprefix_ / g" backup_YYYY-MM-DD.sql
  3. Імпортуйте свої дані SQL в базу даних
  4. Оновіть будь-які ключі в межах _options, що містять префікс, жорстко кодований: оновіть набір myprefix_options option_name = concat ('myprefix _', substr (ім'я опції, 4)), де option_name типу 'wp_%'
  5. Оновіть будь-які ключі в _user_meta, які містять жорстко кодований префікс: оновіть набір myprefix_usermeta meta_key = concat ('myprefix _', substr (meta_key, 4)), де meta_key, як 'wp_%'

0

Я використовував плагін WP Migrate , відьма замінює патчі http та папки. Під час імпорту у мене виникла одна проблема, але вирішено поставити наступні рядки у верхній частині генерованого sql:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Я також спробував за допомогою інструмента "Пошук і заміна" (v2.1), який відповів @Yoav, але він все ще порушує мої серіалізовані дані.


Привіт Рікардо, ласкаво просимо до відповідей WordPress! Область, яку ви розмістили, зарезервована для відповідей на оригінальне запитання. Незважаючи на те, що ваше запитання пов'язане, слід опублікувати його як окреме запитання. Ви отримаєте набагато більше шансів відповісти саме так.
Chris_O
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.