將 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 提供了在未來十年內構建和改進我們平台的技術基礎。 您是否正在考慮將現有的網上商店遷移到另一個平台? 你已經這樣做了嗎? 在評論中分享您的經驗。