Blog

  • WordPress主題開發筆記:動態修改 Bootstrap 按鈕顏色

    當你在 WordPress 主題中使用 Bootstrap 並希望透過自訂器(Customizer)讓使用者即時調整語意顏色(如 $primary)時,你可能會遇到一個令人困惑的問題:Bootstrap 的按鈕樣式是以 SASS 編譯後的固定值呈現,無法在透過使用bootstrap提供的CSS variables動態修改。

    這篇文章將深入探討這個問題的根源,以及如何用 PHP 解決它,讓 Bootstrap 的 .btn-primary.btn-danger 等語意化按鈕能夠根據使用者設定即時更新。

    問題:Bootstrap 的 SASS 編譯限制

    Bootstrap 使用 SASS 編譯語意化按鈕樣式,像這段程式碼:

    _button.scss

    @each $color, $value in $theme-colors { {
      .btn-#{$color} {
        ...
        @include button-variant($value, $value);
      }
    }
    

    button-variant這個Mixin會將 $theme-colors 中的每個顏色編譯成固定的 CSS,例如.btn-primary

    compiled.css

    .btn-primary {
        --bs-btn-color: #fff;
        --bs-btn-bg: #0d6efd;
        --bs-btn-border-color: #0d6efd;
        --bs-btn-hover-color: #fff;
        --bs-btn-hover-bg: rgb(11.05, 93.5, 215.05);
        --bs-btn-hover-border-color: rgb(10.4, 88, 202.4);
        --bs-btn-focus-shadow-rgb: 49, 132, 253;
        --bs-btn-active-color: #fff;
        --bs-btn-active-bg: rgb(10.4, 88, 202.4);
        --bs-btn-active-border-color: rgb(9.75, 82.5, 189.75);
        --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
        --bs-btn-disabled-color: #fff;
        --bs-btn-disabled-bg: #0d6efd;
        --bs-btn-disabled-border-color: #0d6efd;
    }

    這些值在編譯後就「定型」了,無法透過 WordPress 的 get_theme_mod() 或 CSS 變數在前端動態修改。

    原因:SASS 無法處理 CSS 變數

    你可能會想:「那我把 $primary 改成 var(--bs-primary) 不就好了?」但 SASS會報錯:

    Code

    Error: $color2: var(--bs-primary) is not a color.
    

    因為 button-variant 使用的色碼算法需要實際的色碼來進行運算(例如 shade-color()mix()),而 var(--bs-primary) 只是字串,無法參與這些函式。

    解決方案:用 PHP 動態產生 CSS覆蓋Boostrap CSS

    我們可以在 WordPress 中使用 PHP 根據 get_theme_mod() 的值動態產生 CSS,並透過 wp_add_inline_style() 注入到 Bootstrap 的樣式表中。

    步驟如下:

    1. 在 Customizer 中註冊每個語意化顏色設定,例如 theme_color_primary
    2. functions.php 中撰寫一個函式,根據這些設定值計算 hover、active、disabled 狀態的顏色。
    3. 使用 wp_add_inline_style() 將產生的 CSS 注入到 Bootstrap 的樣式表。

    範例輸出:

    css

    .btn-primary {
      --bs-btn-bg: #ff5722;
      --bs-btn-border-color: #ff5722;
      --bs-btn-color: #fff;
      --bs-btn-hover-bg: #e64a19;
      --bs-btn-hover-border-color: #e64a19;
      --bs-btn-hover-color: #fff;
      --bs-btn-active-bg: #d84315;
      --bs-btn-active-border-color: #d84315;
      --bs-btn-active-color: #fff;
      --bs-btn-disabled-bg: #ff5722;
      --bs-btn-disabled-border-color: #ff5722;
      --bs-btn-disabled-color: #fff;
    }
    

    這些 CSS 變數會覆蓋 Bootstrap 原本的樣式,讓按鈕顏色能夠根據使用者設定即時更新。

    有相同問題的 class 包括:

    .btn-#{$color}
    .btn-outline-#{$color}
    .link-#{$color}

    注意事項:Bootstrap 未來可能變更 SASS 函式

    目前我們使用 PHP 模擬 Bootstrap 的 button-variant SASS mixin,並根據 WordPress 自訂器的設定值動態產生 CSS。這種做法雖然有效,但本質上是一種 繞道(workaround)

    值得注意的是,Bootstrap 的 SASS 結構與函式(例如 shade-color()color-contrast()mix())在未來版本中可能會有所調整。

    因此,如果 Bootstrap 更新了這些函式的邏輯或變數命名,你的 PHP 生成函式可能需要同步更新,以確保樣式輸出仍然正確。

    希望未來的改進

    理想情況下,Bootstrap 能在未來版本中提供更完整的 CSS 變數支援,讓我們不必透過 PHP 模擬 SASS 的邏輯,而是直接在前端以 CSS 變數覆蓋樣式。這將大幅簡化 WordPress 主題的自訂流程,並提升相容性與維護性。

  • 補充品

    將每日要食嘅補充品花少少時間分袋裝起,每日隨取隨食。

    肩頸肌肉很痛!

  • You have bigger problems

    生活大部份事情都是相對的。若意識到自己有更大的課題,人自然變得更寬容、豁達和平靜。日常瑣事猶如風中塵埃,微不足道。

    與其說 You have bigger problems,不如說 You have bigger purposes 。找到自己的追求和意義,便是心靈的安息處。而當這份追求能為社會帶來價值時,便是所謂的「生之意義」(ikigai)。

  • Calling

    當⼀件事令你自動起床、期待,不就是你的calling嗎?

    在混沌、概率性的外在世界,去建立確定性的內核,我認為是不錯的平衡。

  • 《人性的優點》

    最近同時處理幾個範疇的事,閱讀休閒書籍的時間有限,所以簡單記錄一下。這本書很好、實用,值得推薦。

    在實際應用方面,我認為最困難的,是察覺自己正處於憂慮之中。當情緒突然湧現,人往往習慣透過最直接的出口來發洩(快思慢想的系統一?)。這時未必會立即想到書中提到的方法來疏導情緒。但如果能意識到情緒正在發生,其實根據書中的建議,是可以有效處理的。

    可以透過定期自問「我此刻開心嗎?」來做情緒檢測。如果答案是否定的,就可以應用書中的方式去疏導情緒。重點是這個問題要定期主動去問,而不是等待事件觸發,例如每一日、每半日、每小時……別寄望自己能在情緒爆發時突然冷靜下來,趁理性多於感性的時候主動檢測。

    之所以選用「開心」來作自問,是出於對生命美好的嚮往,希望能讓自己的情緒維持在正面的狀態。

    《人性的優點》
    作者: 戴尔·卡耐基
    譯者: 胡彬
    ISBN:9787201116891

  • 《真確》

    《真確》

    扭轉直覺偏誤、情緒化決策。

    心得

    這本書的好看之處是例子有趣生動、兼有世界觀和啟發性。令人主動地將視界放大,客觀去檢視問題,看到真確、事實。

    書中提到的偏誤,對我相對有啟發性的是「怪罪型直覺偏誤」和「急迫型直覺偏誤」。雖然我無什麼世界性的例子,但都曾經因為以上的偏誤踩過坑,包括行為上、心理上、財務上。

    應用書中的知識則是一個課題。第一,不要急、堅守衡量數據。第二,尋找系統、原因,不要指責人或找英雄。中途注意其餘的偏誤。最後,嘗試使用其他視角,保持開放。

    最後致敬一下作者Hans Rosling,將一生奉獻於令世界變得更好(而做到),令人敬佩。

    書本資訊

    《真確》(Factfulness)
    作者: 漢斯·羅斯林 (Hans Rosling)
    譯者: 林力敏
    ISBN:9789861343242

  • 最大虧損

    破產風險Risk of Ruin=「本金虧損到無法回本」的機率。

    虧損與回本需要的獲利的關係如下圖:

    選擇可接受的最大虧損,需要配合策略的回報率和風險胃納。

    required-time-to-recover-given-cagr

    以上假設回報是穩定的,但現實是沒有穩定。可以進一步用模擬的方法找出回本時間的區間。或者設定足夠的安全邊際。

    simulation-of-recovery-time

    另外,虧損出現的時間也有分別。假設10年計劃裡,虧損出現在第1年比出現在第9年好,因前者有一大段時間追回。因此,可接受的最大虧損可以遞減,又或者隨時間使用更好的策略彌補。

    別忘了你還有機會成本。追回虧損的時間裡損失了其他投資機會,最少也損失了無風險回報,所以要真正「追回」的錢比本金還要多一點點。

  • 《月亮與六便士》

    《月亮與六便士》

    心得

    「人性的複雜」是我讀完《月亮與六便士》的第一感覺。當然,人本來就複雜,這並非什麼新鮮事。但用一個起伏跌宕的故事訴說,還是相當有意思。

    這種矛盾和複雜性體現在人與人之間的互動。有情、無情、愛、恨,明明嫌惡卻又忍不住親近,心裡鄙視他的行為卻又崇敬他面對生活的態度,憤怒、懦弱、貪婪、無私、仁慈、同情……各種情感擰在一起。誰又能分清對某某懷著怎樣的情感?就像同時嘗到了甜酸苦辣,一時也說不出究竟是什麼味道,難以言表。

    此外,個人內在的矛盾。精神與肉體、理想與現實、理性與感性、社會與自我。人在某些時空總會受到這些內在矛盾的拉扯。正如主角查尔斯的原型高更的代表作《我們從何處來?我們是誰?我們向何處去?》。這些對靈魂的拷問彷彿在黑暗中前行,渴望找到光明;我想到虛無主義和需要擺脫虛無主義;想到色即是空、空即是色。總之,人性複雜得不可思議,又似乎大道至簡。

    至於「月亮」和「六便士」,作者顯然更傾向月亮。只是甲之蜜糖 乙之砒霜。「人生沒有標準答案」、「做自己想做的事」在現代社會已成俗套,對現代人也許沒有多大意思,但在作者的年代確實是難以想像。今日,如果一個人正在追逐星辰,會否對查尔斯有某程度的感同身受?手裡捏住六便士的人,又會否因為查尔斯的極端抬頭看看?又或者,月亮和六便士,其實沒太大分別?

    書中也有其他值得思考和細味的地方:價值觀、愛情觀、兩性地位等。其中一個未理解的地方是整部作品的首兩章。作者形容它們是「題外話」。我也啃得相當辛苦。當時我的想法是:我要讀完整部作品再重讀這兩章,才能知道它們的意義。

    留待下次重讀。

    書本資訊

    《月亮與六便士》(The moon and sixpence)
    作者: 毛姆 (William Somerset Maugham)
    譯者: 徐淳剛
    ISBN:9787533936020

  • 《深讀的技術》

    《深讀的技術》

    面對第一印象艱澀難讀的經典名著,該如何下手、如何品味?

    令我在意的觀點

    • 選擇讀完以後能把現代社會的存在方式看得更加透徹清晰,以及當人們遇上問題時,能即時為我們帶來指引的作品。
    • 養成閱讀習慣
      • 為書籍命名,與書本做朋友。
      • 學會珍惜「覺得有趣的部份」。
    • 弄髒書本
      • 在書上作筆記像是「一種與作者合著的體驗」
      • ABQ註解法
        • 人們普遍認為很重要的部分 (A)
        • 個人在意的部分 (B)
        • 難以理解的部分 (Q)
        • 索引 (這段的內容大概是什麼?我是什麼地方看不懂?)
    • 與書對話
      • 把書當成寫給自己的信來讀,把在意的部分當成對自己的「提問」,把整本看完後,找出「屬於你的答案」。
      • 把4-5個最重要的提問歸納成「書的主題」。
    • 「委身於書」
      • 世上存在無法用任何方法對付的名著。請用自己的方式去感受,在內心發酵。
      • 看不懂也是樂趣。接受「異物」,留在心中孵化。
    • 與讀完的書相處
      • 讀名著的樂趣和收穫往往是在讀完以後才能體會。
      • 透過分享、重讀獲得新發現。

    心得

    內容簡明扼要,又好看又實用。

    這本《深讀的技術》,我原本期待它教我一些高效閱讀的技巧,幫助我以後迅速汲取知識。沒想到書中談及的不僅僅是方法與工具,更側重於引導我們去享受一部作品,體會作品的深意,並從中獲得感悟。

    (原著的標題是《「名著」の読み方》,如果直譯為《閱讀名著的方法》,大概我也不會提起興趣。出版社果然是了解讀者的。)

    秋満吉彦先生在後記寫道:「我的願望是希望讀到這裡的人,能夠愛上閱讀。」我完全感受到他對閱讀的熱忱。事實上,我一直想閱讀一些文學經典, 但總擔心需要投入太多心力去理解而猶豫。看完這本書,我會嘗試接觸平日不常涉獵的作品,結合秋満先生分享的閱讀方法,希望能體驗到「人書合一」帶來的感動。

    部份書裡提及過的書藉

    《變形記》

    《默默》(Momo)

    《活出意義來》(Man’s Search for Meaning)

    《From Yeravda Mandir》

    《清秀佳人》(Anne of Green Gables)

    《人生論筆記》

    《茶之書》

    《純粹理性批判》

    《法華經》

    《卡拉馬助夫兄弟們》

    《金閣寺》

    《關於活著的意義》神谷美惠子

    《論幸福》

    書本資訊

    《深讀的技術》 (「名著」の読み方)
    作者: 秋満吉彦
    譯者: 韓宛庭
    ISBN:9786263188259