覆盖WordPress Multisite的WP_SITEURL和WP_HOME

时间:2012-10-18 15:23:30

标签: configuration development-environment wordpress

为了在WordPress网站(http://www.example.com)上进行本地开发,我之前覆盖了WP_SITEURL中的WP_HOMEwp-config.php值,如下所示:

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

这样我就可以将数据库和站点文件复制到本地服务器,并根据需要进行修改,在本地安装上进行测试。

然后有必要将安装转换为WordPress多站点,以便可以在主站点和托管在子域(http://second.example.com)上的辅助站点之间共享用户,身份验证,插件等。 / p>

上面覆盖wp_options表中的值的方法不再有效,但我不确定为wp_blogs中的条目以及{{1}设置值的正确方法}表用于主域和子域。

更新我的wp_2_options文件在某种程度上是一种解决方法,但它并不理想(我无法与实时网站进行比较等)。运行脚本来更改数据库值是我尝试过的另一个选项,但稍微麻烦一点,所以我的问题是MultiSite中是否有一个选项可以覆盖设置文件中的这些值,例如HOSTS ,如果是这样的话。

5 个答案:

答案 0 :(得分:10)


更新: 完整更新的插件代码及其他说明可在此处找到: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文章来帮助您处理内容中的网址。

此示例假定子域名为多站点安装,域名为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');

答案 1 :(得分:1)

您可以在functions.php中使用update_option

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

答案 2 :(得分:1)

这里有一个类似的问题:Team Development of a Wordpress Site我提供了一个可能的解决方案。在你的情况下,你可能不想达到这个程度(尽管它会非常灵活);但是,您可以随时查看提及域替换技术的答案部分。

我在这里概述了这个解决方案:URL Token Replacement Techniques...

答案 3 :(得分:1)

我遇到了同样的问题,想要一个类似于定义WP_HOME&amp;的解决方案。 wp-config.php中的WP_SITEURL尽可能。

我无法使用插件,因为我正在与GIT同步,并且不希望在我的仓库中安装该插件而且我每次都要添加插件...我想它可以通过网络激活wp_sitemeta表...但它对我来说并不理想。

我提出了这个解决方案。

请务必不要同步wp_blogs,wp_site,wp_sitemeta。然后将此代码添加到$table_prefix下面的本地wp-config.php:

/* 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表中并更新其本地网址。

答案 4 :(得分:0)

这个问题太老了,无法回答,但最近我遇到了类似的情况,我必须将我的 wp 站点从临时站点迁移到生产环境,这很痛苦,因为它有 5 个子站点。

摸索了一整天后,我找到了一个简单而有用的解决方案。

当然必须在 wp-config.php 中进行更改。

除此之外,您必须按照以下步骤操作。

使用以下命令生成数据库转储。

mysqldump -u [user name] –p [password] [options] [database_name] [tablename] > [FileName]

然后在任何编辑器中打开该文件。

查找旧域并将其替换为新域。

现在使用您创建的转储恢复数据库。

mysql -u [user name] -p [password] [database name] < [file anme]