問題描述
我在我們的開發機器上在 WordPress 中創建了一個網站。在我們使用的主題中,有許多小工具區域可以在 (側邊欄和首頁) 中顯示文本。我在所有這些區域中使用了簡單的文本小工具來顯示我們的顯示信息。
當我將網站遷移到生產時,我使用 WP-DB-Backup 插件來獲取數據庫的快照。然後我編輯生成的.sql 文件,以更新所有文件路徑和 URL 引用來指向我們的生產站點。
創建數據庫,網站,並將所有文件複製到生產站點後,我從 mysql 命令提示符運行.sql 文件,將數據導入到新的數據庫。
但是,當我去生產現場時,有些文字顯示出來,其中一些沒有。當我查看網站的小工具部分時,文本小工具在一些小工具區域中丟失。文本窗口小工具在 「非活動窗口小工具」 區域中甚至不可見,它們根本就不存在。
我甚至嘗試使用 BackWPup 插件來重複該過程,注意到當它將數據庫轉儲出來時,SQL 語法不同。
為什麼在導入期間丟失文本小工具數據?
最佳解決方案
這是你的問題所在:
I then edited the resulting .sql file
to update all of the file paths and
URL references to point to our
production site.
你不能這樣做 WordPress 存儲許多選項作為 「序列化數據」,其中包含字符串內容和它們的長度。因此,當您修改 URL 和長度更改時,序列化數據將不再正確,PHP 會拒絕它。
長期的問題是,基本上你錯了。如果您正在設置一個將其數據遷移的開發站點,那麼它應該具有與生產站點完全相同的 URL 。您可以手動編輯您的 HOSTS 文件,以使該生產域 (例如 example.com) 具有不同的 IP 地址 (如 127.0.0.1),因此”production” URL 將成為開發站點。然後,您可以使用該生產 URL 創建數據和鏈接以及其他所有內容,並且遷移數據時,不得更改任何內容。
但是在短期內,不要在 SQL 文件上使用簡單的文本搜索/替換。正如你所發現的那樣,這會打破事情。
而我猶豫建議它,有一種辦法來改變 WordPress 核心代碼來處理這些破碎的序列化。您必須修改 wp-includes / functions.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]); }
這不是一個可行的長期解決方案。它應該只能用來讓你和現在工作。從長遠來看,您需要修復您的開發過程,以便您不必開始這樣的網址。
次佳解決方案
為了處理這個問題我一直使用 WordPress 序列化搜索& 更換此處提供的工具。沒有任何問題,它的工作完全正常。我一直在使用這個很長一段時間,我的所有網站遷移要求。這真的照顧了將開發數據庫遷移到生產的問題。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/
第三種解決方案
奧託的答案是 spot-on 。我也發現了這個難題。
但是,我設法使用 http://spectacu.la/search-and-replace-for-wordpress-databases/的酷腳本來解決這個問題
要遷移您的 wordpress 和新的 URL /域名,請執行以下操作:
- 使用現有 wordpress 的 DB 轉儲 (例如使用 phpmyadmin)
- 恢復轉儲 as-is(不需要修改) 到您的新位置
- 將腳本從 spectacu.la 解壓縮到您的 wordpress 主文件夾 (它不是插件…)
- 通過將瀏覽器指向您的新站點來運行腳本,例如 http://new-website.url/searchreplacedb.php
- 不要忘記從你的新 wordpress 家中刪除腳本
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。