2012-10-18 321 views
7

關於一個WordPress站點(http://www.example.com),我以前覆蓋在wp-config.phpWP_SITEURLWP_HOME值,像這樣的地方發展:覆蓋WP_SITEURL和WP_HOME爲WordPress多站點

define('WP_SITEURL', 'http://local-example/'); 
define('WP_HOME', 'http://local-example/'); 

這將讓我複製數據庫和站點文件到本地服務器,並根據需要進行修改,在本地安裝進行測試。

然後,需要將安裝轉換爲WordPress多站點,以便主站點和託管在子站點上的輔助站點(http://second.example.com)之間可以共享用戶,身份驗證,插件等。

上面的方法覆蓋在wp_options表中的值不再工作,但我不能確定正確的方法來設置在wp_blogs項的值,以及該wp_2_options表主要和子域。

更新我的HOSTS文件是一種解決方法,但它並不理想(我無法與實況網站等進行比較)。運行一個腳本來更改數據庫值是我嘗試過的另一個選項,但稍微麻煩一點,所以我的問題是MultiSite中是否有選項來覆蓋設置文件中的這些值,例如wp-config.php,如果是這樣它看起來像什麼。

回答

9


更新:額外的描述 全面更新的插件代碼可以在這裏找到:http://justinsilver.com/technology/wordpress/wordpress-plugins/wordpress-plugin-wp-server-migration/
我能拿出一個解決方案@ user916011的幫助。我需要能夠將 wp_options表複製到我的開發環境中,因爲它們包含所需的配置。爲了解決無法在MultiSite中設置WP_SITEURL和WP_HOME值的問題,我編寫了一個自定義過濾器來替換可用於網絡範圍內可用插件中包含的非多站點安裝的 _config_wp_siteurl()_config_wp_home()函數並在 wp-config.php中進行配置。然後,我可以將除 wp_sitewp_blogs之外的所有數據庫表 複製到本地數據庫。

我強烈建議Chris Murphy的URL Token Replacement Techniques for WordPress 3.0文章幫助處理內容中的URL。

此示例假設一個子域多站點安裝,域名爲example.com,兩個子域爲www.example.comsecond.example.com。本地開發網址分別爲www.example.localsecond.example.local

數據庫變更

更新在wp_site域值:

UPDATE wp_site SET domain = 'example.local' WHERE domain = 'example.com'; 

更新域值(收費)wp_blogs

UPDATE wp_blogs SET domain = 'www.example.local' WHERE domain = 'www.example.com'; 
UPDATE wp_blogs SET domain = 'second.example.local' WHERE domain = 'second.example.com'; 

插件代碼: 以下插件應該在網絡範圍內安裝。

<?php 
/* 
Plugin Name: MultiSite WP_HOME and WP_SITEURL 
Plugin URI: http://doublesharp.com/ 
Description: Allows wp_options values to be overwritten in wp-config.php for MultiSite 
Author: Justin Silver 
Version: 1.0 
Author URI: http://doublesharp.com 
License: GPL2 
*/ 

function _ms_config_wp_siteurl($url = '') { 
    if (is_multisite()): 
     global $blog_id, $current_site; 
     $cur_blog_id = defined('BLOG_ID_CURRENT_SITE')? BLOG_ID_CURRENT_SITE : 1; 
     $key = ($blog_id!=$cur_blog_id)? $blog_id.'_' : ''; 
     $constant = 'WP_'.$key.'SITEURL'; 
     if (defined($constant)) 
      return untrailingslashit(constant($constant)); 
    endif; 
    return $url; 
} 
add_filter('option_siteurl', '_ms_config_wp_siteurl'); 

function _ms_config_wp_home($url = '') { 
    if (is_multisite()): 
     global $blog_id; 
     $cur_blog_id = defined('BLOG_ID_CURRENT_SITE')? BLOG_ID_CURRENT_SITE : 1; 
     $key = ($blog_id!=$cur_blog_id)? $blog_id.'_' : ''; 
     $constant = 'WP_'.$key.'HOME'; 
     if (defined($constant)) 
      return untrailingslashit(constant($constant)); 
    endif; 
    return $url; 
} 
add_filter('option_home', '_ms_config_wp_home' ); 
?> 

配置的wp-config.php文件

添加新的常量wp-config.php。主站點應使用標準WP_HOMEWP_SITEURL和第三的網址應該使用WP_{$blog_id}_HOMEWP_{$blog_id}_SITEURL

define('WP_HOME',  'http://www.example.local'); 
define('WP_SITEURL', 'http://www.example.local'); 
define('WP_2_HOME', 'http://secondary.example.local'); 
define('WP_2_SITEURL', 'http://secondary.example.local'); 
+0

這是完美的。非常感謝。 – slifty

+0

沒問題,我最終擴大了一點,做了更多的東西,包括替換內容中的鏈接:http://justin.ag/technology/wordpress-plugins/wordpress-plugin-wp-server-migration/ meta hooks被註釋掉了,因爲我遇到了一些問題(可能與緩存有關),但我一直在我的多站點上使用它一段時間沒有問題。您需要定義一個「WP_DEVELOPMENT = true」常量來執行URL重寫,URL標記替換應該始終運行。 – doublesharp

+0

最後一個定義在嘗試插件和所有東西之後保存了我......但是我也必須重新訪問網絡WordPress的管理頁面並重新保存每個網站頁面。 – shaneonabike

1

你可以在functions.php的

update_option("siteurl","http://example.com"); 
update_option("home","http://example.com"); 
+0

這個解決方案的問題是,當我在本地運行站點時,其URL是'http:// local-example /',它不匹配到http://www.example的數據庫值。 com「在主要網站的情況下。因此,'functions.php'中的代碼都不會被執行,所以這些選項不會被更新。雞和雞蛋。 – doublesharp

1

使用update_option有一個類似的問題在這裏被問:Team Development of a Wordpress Site我爲提供了一個可能的解決方案。就你而言,你可能不想達到這個程度(儘管它會非常靈活);然而,你總是可以看到提及域替換技術的部分答案。

我已經概述了這裏的解決方案:URL Token Replacement Techniques...

+0

不錯,這實際上有很多很棒的信息,尤其是URL令牌替換。不幸的是,它並不完全有助於我的情況,因爲我需要覆蓋實際的數據庫值(從我可以看到的'wp-includes/ms-settings.php'中可以看出。 – doublesharp

+0

基本上,您處於案例2中解決方案我在另一篇文章中概述過,這是WP的一致性問題(儘管WP本身並不是這樣),不幸的是,這個問題並不容易解決 - 除非你想做一些代理魔法或者創建一些非常複雜的路由規則在'.htaccess'文件中我對WP MU/Multi-site的使用經驗是,在開始之前,你需要預先配置你的環境(使用我概述的方法),否則就是很多SQL查詢以取代你的數據庫中的值 – user916011

+0

技術上在案例2中,但該網站沒有生效,所以我可以做任何我需要的設置。問題不在於內容中的URL,它是'wp_options ['siteurl']'(主站點),'wp_site ['domain']'(MultiSite站點),'wp_blogs ['domain' ](主要的,第二個博客)和'wp_2_options ['siteurl']'(輔助站點)。以前我只需要擔心'wp_options ['siteurl']'並且可以覆蓋'wp-config.php'中的內容,但是我沒有看到如何在每次複製數據庫時不更新這些表值。暫時忽略內容網址。 – doublesharp

1

我有同樣的問題,並希望類似於定義WP_HOME & WP_SITEURL中的wp-config.php文件儘可能的解決方案。

我無法使用插件,因爲我正在與GIT同步,並且不希望在我的回購中插入該插件,我必須每次都添加該插件...我想它可以在網絡範圍內激活通過wp_sitemeta表......但它對我來說並不理想。

我想出了這個解決方案。

請務必不要同步wp_blogs,wp_site,wp_sitemeta。然後這個地方的代碼添加到您當地的wp-config.php文件下面$table_prefix

/* Update local database */ 
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(mysql_error()); 
mysql_select_db(DB_NAME); 

$result = mysql_query("SELECT * FROM `". $table_prefix ."blogs`") or die(mysql_error()); 
while($row = mysql_fetch_array($result)) 
{ 
    $id = (1 == $row['blog_id']) ? '' : $row['blog_id'] .'_'; 
    mysql_query("UPDATE `". $table_prefix . $id ."options` SET `option_value`='http://". $row['domain'] ."/' WHERE (`option_name`='siteurl' OR `option_name`='home')") or die(mysql_error()); 
} 

這將確保你的站點同步到本地wp_blogs表。

唯一的缺點是,當您添加新網站時,您需要手動將其複製到您的wp_blogs表中並更新其本地網址。

+1

我不敢相信我沒有這樣想過。這將在每次加載頁面時運行更新 - 您可以使用選項表中的值來確定是否需要運行更新,以防止出現這種情況,即使性能沒有那麼大。即使WordPress仍在使用mysql_ *擴展名,PDO或mysqli也可以用於將來的校對。 – doublesharp

+1

如果您希望能夠刷新整個數據庫,還有一個選擇是將blog_id => url映射存儲在'wp_config.php'中的一個數組中,並更新'blogs','sites'和'options'表使用它。 – doublesharp

+0

有絕對的選擇。這非常簡單。陣列也是一個不錯的選擇。我開始這樣做,但決定反對它。我不知道爲什麼現在...也許是因爲博客表已經在網站ID已經...它運行在每一頁的負載,但因爲我只在本地使用它,所以我不在乎。我會對它進行改進以適應現場環境,並且我傾向於在不使用它時對其進行評論。它並不像插件那麼強大。顯然,內容中的鏈接仍然保持不變,但我只想要簡單和便攜的內容。 – Jake