适用于所有开发人员的WordPress多站点和单一数据库

时间:2018-01-29 21:30:55

标签: database wordpress workflow multisite

我正在为WordPress多站点设置规划开发团队工作流程。我们选择了多站点,因为我们希望限制更新/升级过程,因为我们的绝大多数客户都拥有与后端相同的网站结构/要求。对于前端,我们使用的是' vanilla'主题包含我们的css / js框架和主要设置,帖子类型,选项等,我们将基于我们的vanilla主题构建所有网站,并通过子主题为每个客户端扩展它。 我决定将所有内容保留在版本控制(Git)下,甚至是WordPress核心文件。

就我们当前的开发环境而言:我们使用的是集中式Web服务器而不是LAMP堆栈或VVV / Docker设置,每个开发人员都通过一个URL映射到他的本地仓库来访问他的项目。每个项目(站点)使用单独的vhost。因此,在处理projectA时,John的网址为http://john.projectA.dev,而Jack的网址为http://jack.projectA.dev

最初对所有开发人员使用相同的数据库似乎是“逻辑”和“#39;方式去确保数据的一致性,常见设置等,但我还没有达到目的。由于WordPress在wp_options表中存储siteurl和homeurl URL的方式,我找不到将John映射到他将通过URL工作的网站的方法,或者允许所有开发人员访问常见的多站点的wp-admin默认为用户的一个URL(即http://bob.wpmulisite.dev,其中Bob是最初设置多站点环境的开发人员。 我尝试通过在每个开发人员的自定义wp-configs中定义它们来覆盖url,但是在WP多站点中忽略了WP_HOME和WP_SITEURL并没有做到这一点。

我不喜欢必须使用数据库转储,更换转储中的网址并将其导回到每个用户的数据库中,因为我担心这个过程很快会导致问题并且会造成问题太多的合并,差异等等。但是,我可能是错的,我对任何建议都持开放态度。

我已经概述了上面的主要问题,如果你发现我不清楚我会乐于改写它。在这一点上,我不太确定你可能感兴趣的详细程度,所以请问我,我会深入挖掘。

2 个答案:

答案 0 :(得分:4)

好的,让我带你去旅行。

您的集中式开发环境听起来非常独特,但我认为我们可以使用它。我有一个类似的系统设置:我们有一个“staging”服务器,带有一个公共域/ ip供客户端查看,每个开发人员都有一个完整的副本,通过git在他们的本地机器上使用本地Apache服务器。我们将本地开发站点指向中央登台服务器数据库,以便内容/设置保持一致。我们使用http://example.local等自定义本地域访问我们的本地开发者网站,暂存网站为http://example.staging.com,实时网站为http://example.com

另外,wp-config.php中有.gitignore,因此我们可以在本地副本上自定义它。通常我们将暂存和实时版本保存为不同命名的文件,如wp-config-live.php,并将其符号链接到实时服务器上的wp-config.php等,这样我们也可以在我们的私有git仓库中保留配置设置。

现在,我们希望在example.local处理多站点的本地副本,并通过子文件夹(example.local/site2/)或我们在vhost设置中使用别名的其他自定义域访问其网络站点({{ 1}})在每台计算机上。此外,登台站点应该在服务器上没有任何超过example2.local的情况下工作。最重要的是,实时网站 还应该使用简单的git pull,而无需进行任何数据库编辑。我们如何实现这一目标?

首先,我们在所有live / staging / dev环境中的git pull应包含标准多站点设置:

wp-config

请注意,define( 'WP_ALLOW_MULTISITE', true ); define( 'MULTISITE', true ); define( 'SUBDOMAIN_INSTALL', false ); define( 'DOMAIN_CURRENT_SITE', 'example.com' ); define( 'PATH_CURRENT_SITE', '/' ); define( 'SITE_ID_CURRENT_SITE', 1 ); define( 'BLOG_ID_CURRENT_SITE', 1 ); live 域名!为了使整个系统工作,我们数据库中定义的域应该都是实时域,我们将使用以下内容处理每个staging / dev站点,也在DOMAIN_CURRENT_SITE中(仅限dev / staging configs,不在实时配置中):

wp-config

/** Set this to your local tld setup */ define( 'WP_HOME', 'http://example.local'); define( 'WP_SITEURL', 'http://example.local'); /** Include wp-content/sunrise.php */ define( 'SUNRISE', true ); /** This should be the TLD in the database */ define( 'WP_PROD_TLD', '.com' ); /** This should be the tld of your local copy */ define( 'WP_DEV_TLD', '.local'); WP_PROD_TLD是我们自己的自定义常量,我们将用它来检查是否需要更改域名(我知道您在设置中也使用子域名,但我会在尝试适合您的特定情况之前,想要描述一种稍微“标准”的方法)。 {MK}多站点内置WP_DEV_TLD常量,如果存在,则表示包含SUNRISE。这是我们的/wp-content/sunrise.php文件:

sunrise.php

请注意,<?php /** * File sunrise.php * * This allows us to copy the production multisite database to staging/dev and still use * it directly without altering domains */ /** * Filter /wp-includes/ms-load.php get_site_by_path to find production domains **/ function dev_get_site_by_path($_site, $_domain, $_path, $_segments, $_paths) { global $wpdb, $path; // Get our actual domain in the database (should be set to production domain) // The domain coming in should be the request domain $domain = str_replace( WP_DEV_TLD, WP_PROD_TLD, $_domain); // Search for a site matching the domain and first path segment $site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s and path = %s", $domain, $_paths[0] ) ); $current_path = $_paths[0]; if ($site === null) { // Specifically for the main blog - if a site is not found then load the main blog $site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s and path = %s", $domain, '/' ) ); $current_path = '/'; } // Set path to match the first segment $path = $current_path; return $site; } add_filter('pre_get_site_by_path', 'dev_get_site_by_path', 1, 5); add_filter('pre_get_network_by_path', 'dev_get_site_by_path', 1, 5); /** * Filter the site_url and home options for each site, and * filter /wp-includes/link-template.php::network_site_url() * and /wp-includes/link-template.php::network_home_url() * so that our network site link is correct in the admin menu */ function dev_network_url( $_url = '' ) { return str_replace( WP_PROD_TLD, WP_DEV_TLD, $_url ); } add_filter( 'network_site_url', 'dev_network_url' ); add_filter( 'network_home_url', 'dev_network_url' ); add_filter( 'option_siteurl', 'dev_network_url' ); add_filter( 'option_home', 'dev_network_url' ); 文件仅包含WP-CONFIG ON DEV / STAGING ,永远不会在实时服务器上!这会过滤网络“按路径分类”的请求,这意味着它会查看从客户端请求的域和路径,并匹配sunrise.php表中的域和路径。我们正在检查域名中的实时TLD(在本例中为wp_blogs),并将其替换为当前环境的TLD(我们的本地副本为.com,登台服务器为.local )。它还会过滤底部每个网站的.staging.comWP_HOME选项。

而且就是这样!正在为您的本地/临时站点设置正在翻译数据库中的实时域名!只要您使用子文件夹或在本地虚拟主机设置中设置了别名,就可以使用。

现在,对于您使用子域的情况,您可能需要对域进行更彻底的过滤,而不是仅替换TLD。也许您满足于WP_SITEURL数据库中的“规范”域,然后在您的multisite.dev文件中添加本地用户的子域而不是替换TLD,然后在数据库中替换直播域名准备好迁移后。

感谢“laubsterboy”让我开始寻求这个解决方案:https://www.laubsterboy.com/blog/2014/08/running-development-copy-wordpress-multisite-update/

答案 1 :(得分:0)

此建议适用于插件开发。不是“设计”或客户特定的主题开发:

如果您从头开始设置WordPress开发商店,我强烈建议您使用Codeception中的WordPress模块​​学习如何进行行为和测试驱动开发。它可以从不同的角度进行各种测试[验收,WPunit测试,功能测试等]。它可以轻松地在需要整个数据库转储,没有转储,URL替换,空白数据库等的测试之间切换,并且可以根据您的需要进行混合和匹配。

进行TDD的主要原则之一是测试应该至少相互依赖。您正在谈论的这些共享设置是什么?应尽可能减少这些。当你这样做时,你可以逐个列出它们,而不是将你的设置视为某种有机整体。

例如,假设您正在创建一个插件,无论出于何种原因需要特定类型的永久链接结构。实现这一点的一种方法是你所建议的:即拥有某种共享服务,开发人员可以访问他们可以获得所需永久链接结构的环境。所有猪都去吃的一种troth。

另一种方法是将此要求放入单元测试环境中,然后直接进入git repo。该需求随git中的代码一起分发。然后,当你正在开发时,除了你正在处理的要求之外,你的工作从绝对没有任何存在的角度出发。该模块从空白的WordPress安装开始。在这种情况下,除了我们正在做的事情之外,它将是完全空白的,这将是一个特定的永久链接结构。但它可以是任何东西:自定义帖子类型,特定数据集,整个数据库,客户端数据等等。

不要试图在设置范围内捕获所有这些设置,而是捕获您正在处理的设置并将其置于测试的前端和中心。因此,需要此特定永久链接的插件应该适用于任何其他设置。例如,插件应该适用于任何主题。既然您的需求已经内置到测试中,那么您的程序员正在使用哪种环境并不重要。这使您可以使用远程外包商,并为您的团队提供灵活性。如果有人想在笔记本电脑上使用Eclipse并且有人想在基于云的PHPstorm IDE上工作,那就无所谓了。他将代码中的项目和相关设置拉下来。这使得您的代码更加稳定,因为它的设计是从任何环境中开始工作。

以下是使用此结构设置插件的教程:https://wordpress-bdd.com/wp-codeception-tutorial/