profile

WordPress 開發日常

如何自行託管 WordPress 外掛 / 佈景主題更新

Published 10 months ago • 1 min read

一陣子沒見了最近好嗎?停刊電子報的這幾週我學習到不少新東西,剛好月底到了有些空檔,還是該來記錄一下了。首先是發現到 Packt 這個電子書平台,之前逛 Kobo 的 PHP 書籍就常看到他們家的,因為每本都不便宜,所以想說直接去他們平台上買看會不會比較划算。

他們的書系有比較多關於 PHP 的進階知識,像是程式碼架構、設計模式、最新 PHP 版本的介紹等等,對於想更精進 PHP 開發的我有很大的幫助,最近在看的是 Clean Code in PHP ,電子書定價 28.99 鎂,實體書 36.99 鎂。

正當準備刷下去的時候赫然發現他們竟然有訂閱方案,一個月只要 12.99 就可以看到飽,只要一個月看一本就回本了,於是二話不說立刻訂閱下去。在閱讀上可以直接用瀏覽器看,也可以下載他們家的 App,但他們的 App 爛到我不知道該怎麼吐槽了。

不能畫線就算了,連基本的字級放大縮小也沒有,行距調整就更別想,用他們的 App 看沒兩頁我眼睛就在喊救命,他們的 App 就只有上下頁的功能,其他全部都沒有XD

由於我是用電子書裝置閱讀,不管是用瀏覽器還是 App 看體驗都超差,直到我想起我的閱讀神器:Readwise Reader。由於 Packt 的書基本上就是網頁,要看網頁內容使用 Reader 再適合也不過了,於是我就把 Packt 的頁面加入閱讀,終於可以把字放大跟畫重點了,同時還可以跟 Heptabase 整合筆記,對於後續整理超方便。

而且使用 Reader 的最大好處是它可以直接把內容擷取下來,也就是說假使日後我不再訂閱 Packt 的方案後,我依舊也可以保有書的內容,不確定這算不算是個漏洞,但基本上不要拿去轉售或散佈書籍內容應該是還好。總之 Gaze + Packt + Reader + Heptabase 是我現在用的很順手的學習模式。

除了 Packt,最近的工作也發生了變化,首先是與合作兩年多的客戶結束承攬關係,讓我重新檢視自己的工作狀態,一直以為自己把每個專案都照顧得很好,但想不到還是發生預期外的狀況,因此我把手邊的工作再進一步縮減,除了推掉原本準備要承接的專案外,還找了新夥伴來協助手邊的工作,希望把既有的工作做得更仔細更完善。

尤其是看了 Clean Code in PHP 之後,除了複習已知但很少落實在工作上的工具外,對於 Clean Code 更是有了不同的認識,書中提及一個概念是我從沒想過的:Clean Code 關注的不只是 Code,而是在軟體開發過程中的每個人,之所以會有高階程式語言的誕生,目的就是為了要人類可以理解程式內容,而非只有機器看得懂的低階語言,因此寫出別人(或三個月後的自己)可以看得懂的程式碼是身為軟體工程師最需要關注的重點。

有時候看著自己以前寫的東西,就會有種想要全部打掉重練的衝動,但程式碼的現況都是當時的情境所產生的結果,如果現在覺得不滿意,並不代表當時自己的腦殘,只是沒有花時間去重新整理,對於這點我在重構自己的 WooCommerce 推播外掛特別有感,當重構完成後我很篤定一件事,那就是初期開發這支外掛的自己絕對沒想到可以這樣做,沒有時間的累積是不會有新的想法。

關於這本書以及自己的重構心得留待日後分享,這禮拜我最想聊的是關於 WordPress 外掛的更新機制:

如何自行託管 WordPress 外掛 / 佈景主題更新

關於付費外掛的更新部署,我都是透過 Appsero 來完成,其他類似的服務還有 Freemius,如果是免費外掛的話可以直接上架 WordPress(.)org 進行託管,那麼在什麼情境下會需要自行託管呢?

如果你跟我一樣遇到上述服務不適合你的使用情境,又不想為了上架 .org 而花費時間去符合規範,又或者是你希望設計自己的更新流程而不想用別人寫好的框架,那麼這篇文章提及的工具可以作為一個基礎架構,了解整個程式碼的運作邏輯後,可以根據需求再自行客製化,這樣就不用被第三方服務所約束。

我的情境很單純:讓使用者可以在 WordPress 後台外掛頁面更新我所提供的免費外掛。

一、事前準備

需要一個主機空間存放外掛的資訊檔以及新版外掛的 zip 檔,可以使用 Dropbox 或是 Google 雲端硬碟之類的空間,也可以放在自己的伺服器上,我最推薦的是放在 Github,這樣就可以跟版本控管的流程整合。

外掛資訊檔是一個 JSON 格式的文件,範例如下:

這份檔案可以命名為 my-plugin.json 然後放在自己的空間,上傳後的路徑我們會拿來作為取得新版外掛的依據,該資訊檔的關鍵是 version 以及 download_url 這兩個參數。如果要推播新的更新通知,只要把 version 版本號升版即可。

而 download_url 是新版外掛的下載位置,如果放在 Github 上面的話可以使用 Release 來產出 zip,搭配 Github Actions 還可以自動打包不用手動處理。

二、更新邏輯與相關技術

處理 WordPress 外掛主要有三個勾點,分別是 plugins_api、site_transient_update_plugins 以及 upgrader_process_complete。WordPress 判斷是否有外掛需要更新依賴的是資料庫暫存 Transient API。

在 wp_options 資料表裡面有一個 _site_transient_update_plugins 欄位,裡面以序列化的方式記錄了所有外掛的相關資訊。其中一個參數叫做 new_version,當 WordPress 讀到我們的外掛版本小於 new_version 時就會觸發更新通知,並且以 package 參數中的網址作為新版外掛的下載連結:

當使用者進入 WordPress 後台的外掛頁或是更新頁時,會觸發 get_transient() 方法,其中勾點 site_transient_update_plugins 就可以拿來修改上面這一堆序列化的內容,具體的邏輯是:

  1. 在 site_transient_update_plugins 裡面取得放在我們主機上的外掛資訊檔 my-plugin.json
  2. 檢查 my-plugin.json 中的 version 是否比目前外掛的版本號高
  3. 是的話取得 my-plugin.json 中的 version 與 download_url 資訊
  4. 改寫 _site_transient_update_plugins 中 my-plugin 的 new_verison 與 pacekage
  5. 使用者收到外掛的更新通知並點擊更新

需要注意的是步驟二的第二個判斷是 version_compare( '1.0.0', $remote->version, '<' ) 的第一個參數要換成你目前外掛的版本號,通常我會用常數來定義,這樣在更版時就會比較好控制,第三與第四個判斷是檢查使用者的 WordPress 與 PHP 版本,要符合 my-plugin.json 裡面定義的最低版本要求才會收到更新通知。

三、Composer 套件

除了主要的更新機制外,還有顯示新版資訊以及更新檔安裝完成後的處理,完整的程式碼可以參考 Misha Rudrastyh 大大的文章,為了方便使用,我把它加以整理後做成 Composer 套件,使用方法如下:

透過 Composer 進行安裝,使用時建立 Updater 物件並提供三個參數,分別是外掛代稱、目前外掛版本以及外掛資訊檔的下載路徑。

另外我還在外掛更新後增加了一個勾點 ods_updater_after_purge,這是讓開發者可以在外掛更新完成後加入一些任務的處理,像是更新資料表、跳出提醒通知等行為,都可以透過該勾點進行處理。

具體用法可以參考 Github 存放庫的說明:https://github.com/oberonlai/wp-updater

有個這個框架後接下來要託管付費外掛也能以此基礎繼續發展下去,像是在外掛下載連結可以帶入序號,當伺服器收到請求後就可以驗證該序號是否由已授權的網站發出的,確認沒問題才能下載,也可以整合私有存放庫讓部署流程更加自動化,這部分待日後實作後再分享出來~

完整程式碼說明:

https://oberonlai.blog/wordpress-plugin-update/

-

很久沒寫電子報有好多東西想寫,時間有限只能慢慢輸出了,下週見~

WordPress 開發日常

Read more from WordPress 開發日常

每次遇到想要跟我學習 WordPress 外掛開發的朋友來信,總是只能丟些教學文件給他們,畢竟我也不知道他們想做什麼東西,只能提供官方文件給他們參考,雖然這幾年來也寫了不少,但好像都缺少比較完整的開發教學。 想到之前為了教老婆開發而整理出的一套課程大綱,似乎有這個契機可以把它發展下去,但如果只是講理論而沒應用好像無法立即派上用場,於是想到可以整合之前寫過的小工具作為內容,就可以設計出真的能做出東西的教材。 剛好上週為了除錯的事情順手寫了一支日誌外掛,整合理論與實務的教學計畫如下: -- 前言 日誌紀錄是開發者與網站維護人員最重要的好夥伴,除了可以在開發當下輸出執行結果來確認程式的邏輯外,當網站發生錯誤時也能從紀錄中去檢查問題所在原因。查看 WooCommerce 的日誌紀錄步驟為:進入後台側選單 > 點選 WooCommerce > 狀態 > 日誌紀錄 > 選擇日誌檔 > 查看,就會顯示相關的資訊。 一、WooCommerce 內建日誌紀錄的問題 WooComerce 內建的日誌有以下幾個痛點: 選單的目錄層級過多,日誌檔太多時東西不好找...

6 months ago • 1 min read

上週五工作到一半,家裡的門鈴響起,開門後是衛生局的人員通報說社區附近出現登革熱案例,需要整棟樓進行消毒,正當我想著那我就不要出門就好,結果想不到對方說連屋內都要消毒時,我一整個傻眼,家裡這麼多吃的穿的睡的,全部都要暴露在殺蟲劑下,一想到頭就暈。 第一時間先上網查一下這是不是新型態的詐騙手法,才知道原來對臺南人來說這已是司空見慣的作業流程,還查到「養生膠帶」這個神器,它可以把大型傢俱鋪上一層塑膠袋作為防護,於是當晚趕快去水電行買了兩捲,想說隔天早上再蓋就好。 到了隔天一早九點,大樓就傳來噴藥機的巨大聲響,衛生局人員敲每戶的門,說要開始進行消毒了,那時候我們才剛吃完早餐,一整個被殺個措手不及,只好趕快把養生膠帶鋪上,但因為太趕,很多傢俱都沒有鋪到,就這樣半推半就的被請出家裡。 坐進電梯前看到消毒人員拿著在戶外消毒水溝的大型噴藥機直接在家裡面狂噴,不知為何有種荒謬感,好像我家是喪屍病毒外洩的實驗室必須徹底消毒一番,然後跟著鄰居們一起被迫撤離家園,似乎也拉近了鄰居之間的距離(?)...

6 months ago • 1 min read

這兩週在忙著準備 WordCamp 簡報以及擺攤相關事宜,雖然既累人又噴錢,但過程還是充滿了樂趣,我弄了宣傳 DM、易拉展、桌上立牌,以及手工裁切貼紙,好久沒做平面設計了,光設計一份 DM 就搞了五小時。 我是用 Figma 做的,由於它是專門用來做介面設計的,因此色彩模式並沒有 CMYK,所以只能用 RGB 輸出,為了要精準還原電腦上的顏色,前前後後不曉得打樣了多少次,最後還是睜一隻眼閉一隻眼讓它過了,不然可能花上七天七夜還搞不定… 明天就是期待已久的 WordCamp Taiwan,我覺得身為聽眾真的超幸福,只要人到屁股坐下,就能獲得這些講者們累積好多年的經驗與知識,會後還能去扒著他們不放問問題,光這樣想就覺得值回票價,我想分享一下身為開發者的我會去聽哪幾場,以及我是如何認識這些大大的: 上午 9:30 - WordPress 社群中的成長旅程 by Eric 在 WordCamp Keynote 由台灣人主講印象中這還是頭一次,我覺得這超棒的,以往的 Keynote 都是由 WordPress 官方代表來負責,通常會宣傳新的功能或是官方想要傳達的主題,這次是由 Eric...

7 months ago • 1 min read
Share this post