問題描述
我在一個盒子上進行開發,另一個用於生產。現在我只是轉儲數據庫,然後找到一個替換為 URL 更改; 然後複製文件並導入新的 SQL 。
有更好的方法嗎?
最佳解決方案
@ Insanity5902:WordPress 網站從一個框架部署到另一個框架已經是 PITA,從第一天開始使用 WordPress 。 (Truth-be-told 它是一個 PITA 與 Drupal 在 2 年前,我開始使用 WordPress,所以問題肯定不是專門用 WordPress 。)
它讓我感到困擾,每次我需要移動一個網站時,我都不得不花費很多時間重複工作,這樣我就不會像我喜歡的那樣頻繁地進行測試。所以大約 4-6 個月前,我開始從事一個插件來解決 webhost 遷移問題和 I mentioned my ideas on the WP Tavern forum 。
很快前進到今天,我已經有很多工作,我很方便地稱之為 「WP 遷移 Webhosts」 。即使插件仍然是非常多的測試版 (可能甚至是 alpha) 給你的問題,我想我已經準備好讓人們開始抨擊它。
設想的 use-case 是 1.) 首先,開發人員處理通過 FTP 上傳所有更改的主題和插件文件,2.) 然後將開發 MySQL 數據庫完整上傳到測試服務器,最後 3.) 然後運行插件遷移任何來自先前領域的新引用。 (我的插件不會嘗試解決新的數據庫字段或表與即時數據的合併; 這是一個更大的問題,我不知道如何解決。)
你可以從我的網站 download the plugin 解壓到你的插件目錄 (如果你不知道該怎麼做,那麼這個插件不適合你,因為它需要一個知道他們在做什麼來使用它) 。我會保持這個插件在線,直到我發佈到 WordPress.org 之後,你應該在那裏尋找它。
要使用它,您可以在 wp-config.php 中採用不同的方法,通過註釋四 (4) 定義 DB_NAME,DB_USER,DB_PASSWORD 和 DB_HOST,而不是註冊 webhosts 的默認值,然後註冊每個 webhost 本身的信息。以下是 wp-config.php 的這個部分可能是什麼樣的 (注意第一部分是不需要的代碼註釋掉,並且還注意到,我在本地機器上設置了我的主機文件,使用 non-routable .dev 頂級域名,使 day-to-day 開發變得更加輕鬆在 Mac VirtualHostX 使它變得輕而易舉):
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
//define('DB_NAME', 'wp30');
/** MySQL database username */
//define('DB_USER', 'wp30_anon');
/** MySQL database password */
//define('DB_PASSWORD', '12345');
/** MySQL hostname */
//define('DB_HOST', '127.0.0.1:3306');
require_once(ABSPATH . 'wp-content/plugins/wp-migrate-webhosts/wp-webhosts.php');
register_webhost_defaults(array(
'database' => 'example_db',
'user' => 'example_user',
'password' => '12345',
'host' => 'localhost',
'sitepath' => '', // '' if WordPress is installed in the root
));
register_webhost('dev',array(
'name' => 'Example Local Development',
'host' => '127.0.0.1:3306',
'domain' => 'example.dev',
'rootdir' => '/Users/mikeschinkel/Sites/example/trunk',
));
register_webhost('test',array(
'name' => 'Example Test Server',
'rootdir' => '/home/example/public_html/test',
'domain' => 'test.example.com',
));
register_webhost('stage',array(
'name' => 'Example Staging Server',
'rootdir' => '/home/example/public_html/stage',
'domain' => 'stage.example.com',
));
register_webhost('live',array(
'name' => 'Example Live Site',
'rootdir' => '/home/example/public_html/',
'password' => '%asd59kar12*fr',
'domain' => 'www.example.com',
));
require_once(ABSPATH . 'wp-content/plugins/wp-migrate-webhosts/set-webhost.php');
希望這是 (大部分) 自我解釋。我試圖使代碼儘可能乾淨,但不幸的是,它需要這兩個隱藏的 require_once()線之前和之後的 webhost 註冊碼,因為我沒有辦法”hook” WordPress 之前 wp-config.php 被調用。
一旦您更新了 wp-config.php,您可以使用 URL 快捷方式 wp-migrate-webhosts 進入管理界面,如下所示:
以上內容將帶您進入如下所示的管理屏幕,它具有相當的描述文本,並允許您在選擇要遷移的域後單擊鼠標,從任何其他 Webhost 域遷移 (注意:此示例顯示正在進行) 從測試/舞台/即時服務器到本地開發,但請放心,它可以遷移到任何位置,這意味着該插件將非常適合現有的即時站點,並迅速使本地開發環境工作! ):
如果不清楚”migration” 在此上下文意味着更新當前數據庫中的所有引用以適合當前定義的 Webhost(並且”current” 通過檢查 $_SERVER['SERVER_NAME']進行嗅探) 。
插件的優點是它實現了一些基本的遷移,但是任何人都可以掛接它並執行自己的遷移。例如,如果您添加了一個庫數據庫中存儲圖像完整路徑的庫插件,您可以將 migrate_webhosts 操作掛起,該操作將從 「web」 和 「到」webhost 傳遞每個作為元數據的數組,您將允許使用 SQL 或任何適用的 WordPress API 函數執行數據庫中所需的任何操作,以進行遷移。是的,我們任何人都可以做這個沒有插件,但沒有插件我發現編寫所需的代碼是更多的努力,而不是值得。使用插件,只需更容易地編寫這些小鈎子即可完成。
您還可能發現我的遷移失敗,我沒有測試的邊案例,也許你可以幫助我改進插件?任何想要通過我的 Gmail 帳户發送電子郵件的人 (我的別名是”mikeschinkel.”)
此外,該插件被設計為接受 user-define webhost 元數據,除了它被識別為 database,user,password,password,host,host,domain 等。一個完美的例子可能是 googlemaps_apikey,您可以在其中存儲不同的 API 密鑰, Google Map 的插件需要正確運行 (誰在使用 Google Maps 插件之間誰沒有將應用程序部署到即時服務器,並忘記將代碼更改為正確的 API 密鑰?來吧,老實説:) 使用此插件,您的 register_webhost() 數組中的 googlemaps_apikey 元素和小型自定義 migrate_webhosts 鈎子可以有效地消除這一點!
那就是這個。我在 WordPress 答案的 Exchange 上啓動這個插件,因為 @ Insanity5902 的問題觸發了它。讓我知道這是否有幫助,如果適用,或通過電子郵件,如果沒有。
美國如果你決定使用這個記住它是 alpha / beta,這意味着它會改變,所以如果你想現在使用它,然後使用發佈的版本一旦被許多手毆打,為一些小手術做好準備。
P.P.S. 我的目標是什麼?我很高興看到它遷移到 WordPress 核心,以便每個人都可以訪問它。但在此之前,甚至可以認為很多人都有興趣使用它來確保它實際上解決了更多的問題,那麼它可能會創建。所以如果你喜歡這個想法,那麼一定要使用它,並幫助我獲得動力,最終有希望納入 WordPress 核心。
次佳解決方案
如果可能,我在 wp-config.php 中設置 WP_HOME 和 WP_SITEURL 。這與數據庫轉儲和導入相結合,是我熟悉的最簡單的所有解決方案。
http://codex.wordpress.org/Changing_The_Site_URL#Edit_wp-config.php
第三種解決方案
我最喜歡的黑客向/etc/hosts 添加一個設置,使生產域指向您的開發框,就在您的機器上。要部署到生產您 rsync 所有的文件,並推動數據庫。
這個戰略的風險是明確的; 您可能會將開發環境與生產環境混淆。
這仍然是一個容易修復。
第四種方案
當我幾個月後遷移到 WP 時,我想要類似的東西,所以我寫了一個非常簡單的 shell 腳本,它使用 rsync 和 mysqldump 在 ssh 上:
http://snarfed.org/sync_wordpress
它不是複雜的或基於網絡的,但我很高興。
第五種方案
WP Engine 是一項新的服務,提供 「One-Click 分期」:
WPEngine has an exclusive feature called 「staging.」 Here』s how it works: Before you make a scary change to your blog, click the 「snapshot」 button. We make a complete copy of your blog and set it up in a separate, safe area. You can play with anything you want; nothing』s live. Only when you』re ready to make it live do you touch your main site.
看起來是一個非常簡單的方法來快速從開發轉向生產,尤其是已經有活的網站。
第六種方案
複製器插件:這是一個我一直在工作的插件。它目前處於測試階段,但它可以為大多數網站完成工作。現在它的目標是更小的 WordPress 安裝。 http://wordpress.org/extend/plugins/duplicator/
資源:插件的其他資源可以在這裏找到:http://lifeinthegrid.com/duplicator/
社區:請告知我們您的成功或任何可能遇到的問題!為了更輕鬆地管理各種線程,請將問題發佈到 WordPress.org 插件論壇。請不要將插件中的任何記錄數據發佈到在線論壇。記錄數據可以提交給我們的支持站點。
第七種方案
您可以看一下來自 iThemes 的產品,稱為 BackUpBuddy 。我只用了兩次,每次都有兩個或兩個,但總體來説看起來很有希望。
第八種方案
我個人對我的 Github 項目 (稱為 Autopress) 來處理這個問題。我還沒有一個完美的解決方案,但我越來越近了,特別是從 wpengine 的 wpstage 插件。
第九種方案
這看起來很有前途。我們正在處理一些腳本來處理遷移一些數據,例如 wp-options,更改數據庫中的路徑,通過媒體複製。
我的問題是,現場不斷發展,另一方面正在發展。我們工作的一個網站每天有 20 個帖子,每天有超過 3,000 個評論。這是太多的數據可以通過 phpmyadmin 或通過命令行移動。此外,移動數據總是導致 UTF 問題出於某些原因。
此外,現在看起來菜單選項存儲在數據庫中,我還有更多的處理方法。
我檢查所有的代碼到 SVN,並通過 FTP 從服務器 (Beanstalk) 部署代碼。這不會對我進行 DB 的更改,或者激活新的插件。
我現在的計劃是在我正在開發的時候創建一個清單文件,以便對現場網站進行所有的更改。
例如,該文件將具有人類可讀行
它會包括激活的插件,wp-options 移動,圖像移動,頁面移動。然後我的插件將檢測清單文件,並對分段站點進行所有更改。
一旦我測試了,並確定我得到了所有的東西,我可以肯定它會在生產中工作。
這個插件仍然是一個想法,但是我已經為它編寫了一些代碼。
另外,如果要更改 DB 中的 URL,可以使用以下 SQL 。
只需用舊域名替換 $old$和新的 $new$
update wp_postmeta set meta_value = replace(meta_value, '$old$' , '$new$') ;
update wp_posts set post_content = replace(post_content, '$old$' , '$new$') ;
update wp_options set option_value = replace(option_value, '$old$' , '$new$') ;
第十種方案
兩個具有類似目標的 Google Summer of Code 項目:
- Automatic Migration(GSoC 2010)
- WordPress Move(proposal)(GSoC 2011)
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。
