問題描述

我在我們的開發機器上在 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 /域名,請執行以下操作:

  1. 使用現有 wordpress 的 DB 轉儲 (例如使用 phpmyadmin)
  2. 恢復轉儲 as-is(不需要修改) 到您的新位置
  3. 將指令碼從 spectacu.la 解壓縮到您的 wordpress 主資料夾 (它不是外掛…)
  4. 透過將瀏覽器指向您的新站點來執行指令碼,例如 http://new-website.url/searchreplacedb.php
  5. 不要忘記從你的新 wordpress 家中刪除指令碼

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。