profile

WordPress 開發日常

三個實用的 WordPress 後台客製化技術

Published about 1 year ago • 1 min read

細數自己曾經為了看棒球做過以下蠢事:

  • 2001 世界棒球錦標賽陳金鋒扛出三分砲時,High 過頭把我哥的床架給坐斷
  • 2003 亞錦賽翹了一堂要上台報告的課,結果期末成績不及格
  • 2006 當兵時偷用簡報室的投影機看王建民的比賽,結果被長官抓包後一起看
  • 2013 經典賽八強複賽對日本戰況膠著時,丟包老婆讓她自己回家
  • 2023 經典賽看電腦螢幕超過十一點,結果隔天早上精神不濟

不知道自己還能當一日球迷到幾歲,只希望今晚台灣的比賽不用看到 called game 的字卡出現XD

-

這週剛好都在做後台相關的客製化,整理如下:

一、後台文章列表增加日期區間篩選

WordPress 後台文章列表預設的篩選模式有依文章狀態、月份以及分類這三種,客戶想要增加使用日期區間的方式來進行篩選,也就是有兩個日期選項:起始日與結束日,篩選後會顯示在這個日期區間中發表的文章列表:

要實現該功能有兩個步驟,首先是使用勾點 restrict_manage_posts 來增加日期選擇 UI,我使用的是 jQuery UI 的日期選擇元件,並增加 after_date 以及 before_date 兩個文字輸入欄位。

如果你想要針對日期選擇器做調整可以參考 jQuery UI 的官方手冊,或是也可以採用其他的函式庫。處理好介面的部分後接下來要進行文章的篩選,會用到的勾點是 pre_get_posts,該勾點帶有一個參數 $query 參數,而參數就是我們常用的 WP_Query 物件。

在勾點中我們先判斷目前後台的所在位置,並當網址參數帶有起始日與結束日這兩個值的時候,才進行查詢條件的修改,這邊我們會用到 WP_Queryset 方法來加入新的查詢條件,該方法帶有兩個參數,分別是查詢名稱以及查詢參數。

由於我們要用文章的發表日期來進行篩選,因此加入 date_queryafterbefore 屬性,參數 inclusive 代表是否要包含篩選日期當天的文章,而 column 則代表要依照文章的哪種日期來篩選,可選值有文章發表時間與修改時間。

最後返回 $query 即可完成文章列表的篩選,有了這樣的基礎架構後,你就可以在文章列表頁加入各種自訂的篩選邏輯。

完整程式碼:https://oberonlai.blog/wordpress-admin-date-range/

二、限制作者只能看到他們自己的文章

有些多作者的網站會開放後台讓作者能自行進入後發表文章,但有時候網站管理員不希望該作者看到其他人的文章,這時候勾點 pre_get_posts 又可以派上用場了,主要的邏輯是先判斷目前所在頁面是否為後台的文章列表頁,然後檢查目前登入者的角色,如果是作者的話把查詢參數多設定一個 author 的條件,並指定為目前登入者的 User ID,這樣就可以確保作者只會看到自己發表的文章,程式碼如下:

https://oberonlai.blog/wordpress-admin-author-post-only/

三、WooCommerce 後台訂單列表增加顯示欄位

一個很常見的需求是 WooCommerce 的訂單列表要增加顯示欄位,這樣就能讓管理者在在清單中一眼看見相關資訊而不用個別點進去檢視,甚至還可以直接在列表頁做一些常用的管理,像是開立/作廢發票、輸入物流單號等功能:

要增加自訂的顯示欄位有兩個步驟,第一個是先透過勾點 manage_shop_order_posts_columns 把欄位的表格標題加入,也就是上圖中的發票狀態、金流單號,其次再用 manage_shop_order_posts_custom_column 去根據表格標題輸出對應的資料。

需要注意的是這兩個勾點都是動態勾點,也就是可以根據勾點名稱的不同去指定 Post Type,寫成變數是這樣:manage_{$post→post_type}_posts_columns ,因為我們要把欄位加在訂單列表中,而 WooCommerce 訂單的 Post Type 為 shop_order,因此使用的勾點就是 manage_shop_order_posts_columns

勾點 manage_shop_order_posts_columns 帶有一個欄位參數,它是一個由欄位 ID 與欄位標題組成的陣列,欄位的 ID 稍後會作為輸出資料的判斷依據,因此我們只要將這個欄位參數加入自訂的表格標題即可。

由於我們想要將自訂欄位顯示在訂單編號的後面,因此先用 array_search 找到訂單編號 order_number 的索引,然後把 $columns 拆成三組陣列,再以訂單編號欄位、自訂欄位、其他欄位的順序組合起來,這樣就能讓我們的自訂欄位顯示在訂單編號右邊。

接下來根據欄位 ID 來輸出資料,勾點 manage_shop_order_posts_custom_column 帶有兩個參數,第一個是欄位 ID,第二個是該筆訂單的 Post ID,有了這兩個資料我們就可以判斷哪個資料欄位要顯示什麼內容,甚至也可以將既有欄位的輸出資料進行改寫。

完成程式碼:https://oberonlai.blog/woocommerce-order-columns/

四、所寫即所得 PHP 編輯器:Tinkerwell

這陣子以來深入使用了之前朋友介紹的 Tinkerwell,隨著使用時間的增加慢慢覺得它是我目前開發上不可或缺的工具,原因在於它幫我省下許多測試時間。不知道你有沒有開發過一種需求是必須經過超多前端操作步驟才能觸發結果的功能?

舉個例子,有個功能是當訂單完成後以後,要新增一個 N 天後的排程檢查訂單是否有付款成功,如果沒有的話要寄電子郵件通知客戶,然後信件內文要帶入從第三方金流回傳的付款資訊以及重新付款連結。

為了要檢查信件內容的資訊是否正確,我會這樣測試:

  1. 進入前台商品頁
  2. 將商品加入購物車
  3. 在結帳頁輸入結帳資訊以及選擇特定的付款方式
  4. 送出訂單後在後台改變訂單狀態以建立排程
  5. 前往 WooCommerce 排程管理點擊 Run 手動觸發排程
  6. 開啟收信軟體檢查信件內文是否正確,

然後每改一次信件內容我就要跑上面六個步驟反覆測試。

雖然上述的例子可能有點誇張,但我常常就是被這些測試步驟搞得很煩,我試著學習寫自動化測試來簡化測試步驟,但為了要寫出測試腳本有時候反而會繞好大一圈,而 Tinkerwell 幫我解決了這個大難題。

Tinkerwell 介紹

Tinkerwell 基本上就是一個文字編輯器,但沒有像 VSCode 有各種包含包海的功能,它做的事情就是單純把 PHP 的執行結果輸出在下方視窗中,省去以往為了要寫 PHP 還必須先建立開發環境與伺服器,而且還可以立即看到輸出結果:

除了基本的 PHP 外,最棒的地方是它支援 WordPress 的 API,不管是 WP_QueryWC_Order_Query,或是每天一定會用到的 get_optionget_post_meta 這些 WordPress 內建方法的都可以無痛使用。

如果你有寫過 PHPUnit Test 就會知道,這些 WordPress 的方法都要自己 Mock 出來,而這些自己刻出來的方法有時候雖然可以通過單元測試,但少了與真實資料庫的連結還是會發生預期外的狀況,有了 Tinkerwell 完全不用擔心這問題,就照平常自己寫程式的習慣來測試即可。

Tinkerwell 應用

你可能會問:我們自己寫的類別或方法也可以用嗎?我會說這就是 Tinkerwell 最美妙的地方,你只要在開啟資料夾的時候選擇本機的 WordPress 檔案位置,那麼在這目錄底下所有佈景主題與外掛的方法都可以呼叫得到。

因此回到上述那個範例,我要檢查信件內容的資料是否正確,我只要呼叫我自己產出信件內容的方法就好,然後手動帶入指定的訂單參數,由於 Tinkerwell 可以直接跟資料庫互動,因此我就能知道執行的結果是否如我所預期的。

除了本機以外,它也可以用 SSH 遠端連線主機上的 WordPress 網站,這樣就可以在本機測試遠端主機上的程式碼,順帶一提,它拿來作為教學使用也非常方便,尤其是介紹 WordPress 的 API 時可以直接拿到資料庫的資料,就不用再切換到瀏覽器查看輸出結果。

如果你也正在學習 WordPress 開發,大推 Tinkerwell 這套工具!

-

今晚來盤義大利麵吧!最近迷上清炒白酒蛤蠣小辣XD,我們下週見!

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