将 Yoast.com 的网店从 EDD 迁移到 WooCommerce
已发表: 2018-02-27在 Yoast,我们优化网站性能的各个方面。 我们的目标是通过使网站更易于使用、更易于浏览、更快和更可靠来使网络变得更美好。
2017 年 9 月,我们将我们的网店从 Easy Digital Downloads (EDD) 迁移到 WooCommerce——这是我们销售 yoast.com 上所有工具、产品和内容的地方。 在这篇文章中,我将解释我们为什么这样做,我们构建了什么,以及将来对我们和我们的用户有什么好处。 WooCommerce 为我们提供了未来几年的技术基础。
为什么改变?
Yoast.com 正在经历令人难以置信的增长,这主要得益于两个主要因素——我们的插件的受欢迎程度,以及我们 SEO 博客的不断扩大的受众。 然而,这两个元素的结合使 yoast.com 成为一个具有挑战性的管理网站。
从历史上看,该站点是从简单的 WordPress 安装演变而来的。 Yoast 创始人 Joost de Valk 添加了 Easy Digital Downloads (EDD),以促进销售高级插件。 我们还使用 EDD 为世界上所有高级安装提供更新。
多年来,我们进行了越来越多的调整,以确保 EDD 仍能满足我们的需求。 例如,让我们的客户能够以欧元或美元支付是一项巨大的努力。 由于我们想在未来添加其他货币,我们需要找到不同的解决方案。
当我们研究其他选项时,我们考虑了几个需求:
- 能够支持多币种购买。
- 能够支持定期付款。
- 构建集成的成本和平台的可维护性。
- 能够支持用户帐户。
- 创建一个SEO平台。
- 考虑到未来的兼容性,因为我们希望拥有一个在 5 到 10 年内仍然可以运行的网站。
为了实现上述所有目标,我们必须制定一个计划。
构思
2017 年 1 月,我们安排了与我们的建筑师团队的会议:Joost、Omar、Jip 和我自己。 我们讨论了我们的需求是什么以及我们如何才能最好地满足这些需求。
我们的第一个结论是我们不想离开 WordPress。 尽管我们现在有其他平台的插件,但我们是 WordPress 的粉丝并且非常关心它的使命。 WordPress 是我们的根基所在,它作为 CMS 对我们来说非常有效。
为什么选择 WooCommerce?
然后我们考虑了我们想要使用的电子商务平台。 我们问自己最好的 WordPress 电子商务解决方案是什么,得出的结论是它是 WooCommerce。 但是,与 EDD 一样,WooCommerce 不支持多种货币。 所以我们需要一个解决方案。
我非常喜欢一切都是混音的想法。 我们受到为每种语言使用不同站点的想法的启发,MultilingualPress 插件很好地执行了这一想法。 所以我们重新混合它:为了避免编写大量自定义代码,我们决定使用多站点安装。
因此,WooCommerce 不需要管理不同的货币。 在美元网站上,WooCommerce 以美元做所有事情。 在欧元网站上,WooCommerce 用欧元做所有事情。 这也使得添加新货币相对容易。 我们只需添加一个新站点并复制设置。 与 MultilingualPress 相结合,将来这也将使我们能够支持不同的语言。
WooCommerce 最终非常适合 yoast.com,原因如下:
- 一个很好的数据模型。
- 一个庞大的生态系统。
- 内置 REST API 和 Webhook 支持。
- 将我们的插件与 WooCommerce 结合使用的可能性。
- WooCommerce 解决了电子商务领域。 我们不想在电子商务领域花费太多时间。 SEO是我们的专长,所以我们要专注于SEO。
- WooCommerce 有一个充满活力的社区,我们可以参与其中。
电子商务:SKU、历史记录和退款
我想专注于电子商务领域。 这里要考虑的一个方面是 SKU。 每个产品都有一个 SKU——一个唯一的标识符。 SKU 可能听起来像是多余的东西。 为什么我在数据库中有 ID 时需要 SKU? 但随后你意识到每家公司的每个财务部门都已经有了这个系统。 SKU 不是自动递增的——您需要一种以明确的方式跟踪产品的方法。 名字不适合这个。 因此,在 yoast.com 上,SKU 现在与我们的财务部门用于跟踪产品的编号相同。
另一个要求是要有每次购买的历史记录。 WooCommerce 默认执行此操作。 一旦订单完成,就是这样。 所有数据都是不可变的。 如果客户更改其姓名、地址或电子邮件,则新信息仅用于新订单。 对于开发人员来说,这可能听起来很奇怪,但它实际上是一种优势。 您也不希望您的银行在事后更改交易——一旦完成,它们就完成了。 任何突变都是新的交易。
在退款方面,拥有历史记录是最大的不同。 在旧设置中,退款的订单将从我们的出口中消失,这将改变当月的收入。 在 WooCommerce 中,每笔退款都有自己的日期和金额。 所以一个月完成一次,就真的完成了。
在 WooCommerce 中,每笔退款都有自己的日期和金额。 所以一个月完成一次,就真的完成了。
将 Yoast.com 迁移到 WooCommerce 的技术细节
移民
我们有很多历史数据,这意味着我们必须迁移大量订单。 我们选择了一个名为 pandas 的工具,该工具旨在处理大型数据集,是一次迁移所有数据集的好选择。 如果我们计划进行另一次迁移,我们可能会朝着不同的方向前进——我们将在几个月内慢慢格式化历史数据。 这将大大减少实际移动当天要迁移的数据量。
有一个主要的痛点使这个过程比它需要的更复杂。 由于所有数据都保存在数据库中的一个元值中,因此需要对其进行反序列化。 Python 没有有效且正确的方法来进行 PHP 反序列化,因此我们最终使用 PHP 来反序列化这些数据。
聚合数据
您可能已经注意到我们现在有两个站点。 但是我们仍然希望对一个位置的所有数据有一个概览。 这是我们构建 MyYoast 的原因之一。 我们收到的所有订单都会同步到 MyYoast。 这意味着 MyYoast 无所不知。
WooCommerce 有一个同步所有订单的系统:webhooks。 webhook 最大的缺点,一般来说,如果接收系统宕机,webhook 就收不到了。 查看 webhooks 的代码时,您会发现以下代码段:
“`
/*
* 让其他插件拦截一些消息队列的传递,如rabbit/zeromq
*/
返回apply_filters('woocommerce_webhook_should_deliver',$should_deliver,$this,$arg);
“`
我们考虑使用评论中建议的消息队列,但我们采用了更简单的方法。
Ruby on Rails 社区有一个 delay_job 项目。 我们找到了一个适合我们需求的 PHP 端口。 延迟作业就像它的名字所暗示的那样:它安排一个稍后执行的作业。 这意味着永远不会失去工作。 如果作业失败,它将再重试四次。 之后,该作业可用于调试出错的地方。 这为我们提供了一个非常强大的设置。
我们将 WooCommerce 配置为尝试将 webhook 发送到我们的自定义虚拟 URL:`http://my-yoast-job.url`。 这确保我们可以从代码中捕获这些请求。 我们有一个负责调度作业的`Scheduler` 类。 它捕获 webhook 请求并将其转换为作业。
我们有几个处理工作的类,一个用于 yoast.com 的每个基本构建块。 然后这些作业由后台的工作人员处理。 这个过程很快,因此客户会立即在 MyYoast 中看到他们的产品。
WordPress 作为应用程序
如果您从未阅读过The Twelve-Factor App ,我强烈建议您阅读。 它为 Web 应用程序开发提出了一个非常健壮的框架。 这如何转化为 WordPress 上下文? 比你想象的要好。
WordPress 有一些独特的功能使其更难设置。 但是您可以解决这些问题以获得强大的 WordPress 安装。 如果你只做其中之一,它应该是依赖因素。 开始使用作曲家! 它就在这里,并且有效。 Rarst 很好地概述了如何使用 Composer 进行 WordPress 开发。 自动更新不是复杂 Web 应用程序的选项。 所以你需要一个不同的解决方案,而 Composer 做得很好。
表现
我们一开始没有使用对象缓存。 结果证明这是个坏主意。 如果您使用 WooCommerce 处理大量销售,则需要对象缓存。 没有它,订单模型需要在与该订单有关的每个请求上完全重新实例化。 这是非常昂贵的,因为在许多页面上都需要订单模型。 至少,所有结帐页面都需要访问订单。
我们还在 WooCommerce 本身上创建了一些拉取请求,以在不缓存的情况下提高性能。 其中之一是修改缓存货币。 在修改之前,每次任何一段代码只需要一种货币时,都会转换所有货币。 考虑到每家商店只以一种货币运营,这是非常低效的。
我们不能简单地在 WooCommerce 内部解决的一件事是搜索订单和订阅。 这样做会导致查询可能会导致我们的整个网站崩溃——该查询包含许多对 post meta 的搜索,而且这些搜索需要很长时间。 我们通过在 MyYoast 之上构建自己的搜索功能来解决这个问题。
如果 WooCommerce 使用自定义表格,元搜索问题也将得到解决,幸运的是,这已经在 WooCommerce 技术路线图上。 这个问题也让我们思考了我们自己的插件。 我们可以减少 Yoast SEO 创建的元键的数量吗? 因此,我们也将自定义表格的创建添加到我们自己的技术路线图中。
WordPress 插件和 WooCommerce 扩展的当前列表
为了全面了解我们在哪里登陆,这里是我们目前使用的与我们网站作为商店功能相关的插件列表。 完整列表包含 55 个活动插件。
- CMB2:用于为帖子类型添加更多自定义字段。
- CMB2 字段类型:用于将多个帖子作为元值附加。
- CMB2 帖子搜索字段:用于搜索要附加为元值的单个帖子。
- Google Authenticator:在我们的登录中添加 2FA。
- Google Authenticator,按用户提示:这样所有 Yoast 员工都可以使用 2FA,但客户不必这样做。
- MailChimp for WordPress 和 MailChimp for WordPress – Premium:用于将订单连接到 MailChimp。
- 成员:用于管理不同角色的权限,例如支持工程师。
- MultilingualPress:用于管理多站点中的不同站点。
- MyYoast 自定义登录:设置登录屏幕的样式。
- WordPress 的 New Relic 报告:我们使用 NewRelic 来跟踪我们的表现。
- 邮戳:用于可靠地发送电子邮件。
- Romance Admin配色方案:每个人的生活都需要一点粉红色!
- WooCommerce:您可能会猜到,在 yoast.com 上处理订单!
- Yoast SEO:WooCommerce:增加 WooCommerce 和 Yoast SEO 之间的兼容性。
- Yoast SEO Premium:用于重定向、内部链接建议和多个关键字。
WordPress 插件和 WooCommerce 扩展的当前列表
- WooCommerce – 基于国家/地区的付款:用于向来自不同国家/地区的客户展示不同的付款方式。
- WooCommerce AdyenCw:用于将 Adyen 支付网关添加到 WooCommerce。
- WooCommerce 优惠券链接:用于创建自动应用特定优惠券的链接。
- WooCommerce 动态定价:用于为批量购买提供折扣。
- WooCommerce 电子邮件定制器:用于设置 WooCommerce 发送的电子邮件的样式。
- WooCommerce 欧盟增值税号:用于收集欧洲客户的增值税号并使用 VIES 服务验证该号码。
- WooCommerce 赠送产品:用于赠送产品。
- WooCommerce PayPal Express Checkout Gateway:用于将 PayPal 支付网关添加到 WooCommerce 并支持 WooCommerce 订阅。
- WooCommerce 产品捆绑包:用于在我们的商店中创建捆绑包。
- WooCommerce 订阅:用于跟踪插件支持和更新的剩余时间。
要点和结果
我们于 2017 年 8 月 29 日推出了这个新平台。在接下来的几周里,我们大大提高了网站的性能。 我们已经实现了我们想要达到的所有目标。 自迁移以来,我们还开始构建许多其他东西。 我们的支持团队现在可以更轻松地退款和转移帐户。 我们已将 Yoast 学院迁移到多站点。 我们在 2018 年有一系列激动人心的计划,包括:
- 添加一家我们以英镑出售的商店。 由于我们过去的选择和我们转向 WooCommerce,我们可以在一天内完成,几乎不需要额外的代码。 为我们的销售团队添加销售仪表板。
- 为我们的销售团队添加销售仪表板。
- 为我们的高级插件添加 Composer 支持。
WooCommerce 为 Yoast 提供了在未来十年内构建和改进我们平台的技术基础。 您是否正在考虑将现有的网上商店迁移到另一个平台? 你已经这样做了吗? 在评论中分享您的经验。