WordPress 网站的团队开发

2024-05-16

我不是 WordPress 开发人员,但我正在尝试确定团队使用 WordPress 的最佳方式。对于 Rails 项目或大多数其他项目来说,在本地工作并在上游部署很容易,但我的理解是 WordPress 并没有让这变得那么容易。也许这是一个神话?

据我所知,URL 和文件路径存储在数据库中并不罕见,这似乎会使从 dev --> stg --> prd 部署 WP 项目变得困难(其中每个环境都有自己的 URL)以及可能不同的文件路径),更不用说单个开发人员拥有自己的开发环境,需要将其“合并”到统一的副本中进行部署。

我可以将所有开发人员沙箱配置为使用单个数据库,但同样,如果存储 URL 和文件路径,则不会获得任何结果。

这里有一系列较小的问题,但我越想这些,我就越意识到我真正需要的是关于如何构建 WordPress 网站的最佳开发的建议,该网站将被黑客攻击开发团队。 IDprefer我们用于其他项目的沙盒方法,但我不知道所有开发完成后是否/如何统一事物。


Warning:传入文字墙..

@Rob,当谈到团队合作时,WP 简直就是地狱;然而,通过一些工作(和一些符号链接魔法),您可以设置您的 WP 项目,以便您的主题或插件的工作文件可以与 WP 核心分开驻留。其中一些使用 WP 的内置机制,一些与 SVN 外部相关(提示)。我会让你用谷歌搜索一下,因为它超出了你的问题范围。

关于 WP GUID 的说明

WARNING:请勿更换导轨。 WP GUID 用于外部提要阅读器。提要阅读器使用 GUID 来确定内容是否是最新的。更改它基本上告诉那些读者提要中的每个条目都是新的(尤其是帖子)。这会给您不需要的遗留内容带来很多额外的开销。 GUID 是一项旧功能,很久以前就应该更改为 UUID。从技术上讲,您可以使用 guid 字段中的任何内容,但 WP 使用永久链接来填充该字段 - 遗留。

唯一可以接受更改 GUID 的是新的 wp 项目,其中内容是全新的。

回答你的问题:

WP 在其数据库的十几个位置存储对当前域的显式引用。跟踪和更改这些位置非常困难,您最不想做的就是对要导入生产的 *.sql 转储文件进行手动编辑。它只是带有不良开发实践的味道。

有几种方法可以解决这个问题,但如果您已经处于开发生命周期的后期,那么这意味着需要做一些工作。我将解决第一个案例。

案例一:项目启动

当您开始项目时,您可能会准备好开发沙箱和数据库。您现在可能已经安装了 WP,因此它对于所有意图和目的来说基本上都是干净的。

您要做的第一件事是更改配置文件的工作方式。大多数人都遵守标准wp-config.php文件(除了团队生产项目之外,实际上没有任何理由编辑它。)但是,您可以使用一些逻辑对其进行设置以包含特定于开发人员或特定于环境的配置文件。例如:

wp-config.php

switch( $current_environment )
{
 case 'jack.local'  : include( 'wp-config-jack.php' )  break; // Jack's sandbox
 case 'jill.local'  : include( 'wp-config-jill.php' ) break; // Jill's sandbox
 default : ...  break; // Staging & Production
}

您要做的下一件事是包含正常内容wp-config.php文件在一个wp-config-remote.php用于登台/生产的文件。接下来,编辑您的wp-config-remote.php文件,以便您可以在多个环境(暂存、生产)中使用 1 个配置文件。一个if(...) or switch(...)块就是您所需要的,例如

if( (strpos( $_SERVER[ "HTTP_HOST" ], "localhost" ) !== false) || (strpos( $_SERVER[ "HTTP_HOST" ], "local" ) !== false) )

(有更好的方法来写这个条件......这只是一个粗略的例子。)

配置特定于每个远程环境的所有 WP 设置。希望您能将其签入源代码控制存储库。

这基本上可以让您的团队拥有特定于其环境的配置设置,同时让您检查每个远程环境的设置once.

您要做的第二件事是建立一种机制来拦截和过滤特定于域的链接。此机制背后的目的是用令牌/占位符替换对当前域的任何引用。我在这里概述了执行此操作的技术:http://www.farfromfearless.com/2010/09/07/url-token-replacement-techniques-for-wordpress-3-0/ http://www.farfromfearless.com/2010/09/07/url-token-replacement-techniques-for-wordpress-3-0/

它基本上相当于创建一个过滤器,在内容提交到数据库之前以及内容呈现到页面之前对内容进行操作。该技术是透明的,因为它不会影响正常的编辑实践。您仍然可以在编辑器中创建内容,引用其他页面、帖子、图像等,并且它们在不同环境中编辑时会正常显示。

在最近的项目中,我将所有这些和其他一些 WP“规范化”功能包装到一个我设置并忘记的引导插件中。

案例2:项目进行中

现在,就您而言,您的开发生命周期已经走得更远了。替换这些域引用需要一些工作,但如果您按照我上面概述的步骤操作,您应该只需要执行一次。我上面提供的链接为您提供了完成该工作所需的 SQL。请务必注意,在多站点环境中,您需要对创建的每个“子站点”执行此操作。

更新数据库后,我建议执行以下步骤CASE 1所以您不必再次重复这些步骤。

奖励:同步内容

同步内容是一件痛苦的事情。我在最近的项目中所做的就是让客户在登台服务器上工作并将更改推广到生产上游。那么,您就可以将下游同步到您的沙箱。编写一个 shell 脚本,从临时数据库中转储特定内容表的副本,并将它们导入到沙箱数据库中(有效地替换内容表)。您应该能够看到域令牌替换技术的好处。

未签入源代码管理的图像,例如客户端图像应推送到公共位置,例如一个 S3 存储桶。有 WP 插件可以帮助您。这将节省大量跨环境同步资产的时间。

我希望这对您有所帮助 - 如果没有,总有 SilverStripe ;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WordPress 网站的团队开发 的相关文章

随机推荐

  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • 如何在 HandlerInterceptorAdapter 中添加 HttpServletRequest 标头?

    我正在尝试将授权标头添加到我的请求中 作为我们切换环境时的临时解决方法 我试图在扩展 HandlerInterceptorAdapter 的拦截器中处理它 我使用 MutableHttpServletRequest 类制作here http
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 如何在 iOS 上固定证书的公钥

    在提高我们正在开发的 iOS 应用程序的安全性时 我们发现需要对服务器的 SSL 证书 全部或部分 进行 PIN 操作以防止中间人攻击 尽管有多种方法可以做到这一点 但当您搜索此内容时 我只找到了固定整个证书的示例 这种做法会带来一个问题
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 在 UITableView 的部分标题文本下方添加一些边距

    我已经设计了标题文本的样式 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UITableViewCell let ce
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • 空手道 - 使用 Javascript 从 元素获取 URL

    使用空手道 我需要从标签 href 中提取 url 我直接在浏览器中使用 Javascript 尝试过 document querySelector a rel noopener href 它在浏览器中工作正常 我收到完整的 url 地址
  • 从对象中取出具有无效(NaN、空白等)值的键的最佳方法?

    我有一个供用户填写的简短搜索表单 将有多个搜索查询进入 MongoDB 该表单创建一个名为的变量searchParams可能看起来像这样 var searchParams city Springfield bedrooms 3 bathro
  • Azure 表存储 - CreateIfNotExistsAsync 上的 501 NotImplemented

    我正在使用我知道可以工作的存储帐户和帐户密钥 信用 我有一个使用完全相同的连接字符串的 blob 容器 可以正常工作 我正在有效地这样做 CloudStorageAccount Parse connectionString CreateCl
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • 运行一个特定的 Laravel 迁移(单个文件)

    我的项目中有 5 次迁移 我只想运行这些迁移之一 是否可以将单个文件的名称传递给php artisan migrate命令 您可以将迁移放入更多文件夹中并运行如下命令 php artisan migrate path app databas
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • 在从一个表中提取的循环内调用执行以执行宏

    我目前有以下情况 macro sqlloop event id lots of code mostly proc sql segments mend 生成一个输出表 名为export table2 我需要能够为另一个表 名为 vars 中的
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https
  • 在 Blackberry 4.2 JDE 上调用 atan 函数

    我需要从我的 Blackberry Java 应用程序计算反正切值 不幸的是 blackberry 4 2 api 没有 Math atan 函数 Blackberry JDE 4 6 版有此功能 但 4 2 版没有 有谁知道计算 atan
  • WordPress 网站的团队开发

    我不是 WordPress 开发人员 但我正在尝试确定团队使用 WordPress 的最佳方式 对于 Rails 项目或大多数其他项目来说 在本地工作并在上游部署很容易 但我的理解是 WordPress 并没有让这变得那么容易 也许这是一个