Wordpress

WordPress 區塊鎖定怎麼設定?防止版面被誤搬誤刪的完整教學

客戶接手網站後,只想改改文案、換張照片,卻在拖曳版面的時候,順手把整個精心排好的頁尾群組一起搬走,回頭才發現原本置中對齊的聯絡資訊散成一團,設計師花了半天調整的間距全部跑掉。這種情況在多人協作或代管中的網站,幾乎每隔一陣子就會重演一次。

WordPress 區塊編輯器(Gutenberg)其實內建了一個直接處理這個問題的機制,叫作區塊鎖定(Block Locking)。它不是外掛,不必額外安裝,也不是拿來管理誰有什麼權限的系統。它鎖住的是動作,不是人,對付的正是這種手滑造成的誤刪、誤搬。這件事處理得好不好,直接關係到一個代管中的網站,能不能放心把編輯權限交給客戶或團隊裡的其他人。

這個機制怎麼運作、能鎖到什麼程度、又要怎麼解開,先從它的基本概念看起。

區塊鎖定是什麼?避免版面被誤動的內建機制

WordPress 官方的 Block Editor Handbook 把這個功能定義得很清楚,區塊鎖定 API 能限制的是「移動」與「移除」這兩種行為,設計目的是保持版面一致性,並且守住內容不被破壞。換句話說,鎖定針對的是編輯器裡的操作動作,不是某個使用者的身分或角色。這一點很重要,後面會反覆看到,因為它直接決定了這個功能能防住什麼、防不住什麼。

這個功能其實分成 2 個層次。一個是針對單一區塊的鎖定,設定完只有那一個區塊會被鎖住;另一個是範本鎖定,鎖的對象是一整個容器裡的所有子區塊,例如整組頁首群組、一組多欄排版。這 2 層概念用的底層屬性不同,操作介面也略有差異,後面會分開拆解,先知道有這兩種模式就好。

它也不是什麼新功能或實驗性質的東西。底層的鎖定 API 早在 WordPress 5.9 就已經存在,只是當時只能靠寫程式碼設定;視覺化的鎖定選單,也就是在區塊選項裡直接點幾下就能鎖的介面,是 6.0 才加進來。WordPress 相關媒體 Gutenberg Times 長期追蹤這個功能的版本演進,確認它已經穩定存在好幾個大版本,不是那種可能哪天就被拿掉的實驗功能,可以放心用在正式營運的站台上。

多人協作與代管網站,最常見的三種誤動情境

這個功能會被需要,通常不是因為要防駭客或防惡意破壞,而是為了對付一種更常見、也更難防的狀況,也就是原本立意良善的使用者,一個手滑弄壞了版面。以下 3 種情境,幾乎是每個接觸過多人協作或代管網站的人都遇過的:

  1. 網頁設計工作室把網站交給客戶自己維運內容,客戶原本只需要改文字改圖片,卻常常在拖曳畫面的時候,不小心搬動或刪掉整組精心設計的排版,像頁首、頁尾,或是花時間排好的案例展示區塊。
  2. 同一個網站有多位編輯者輪流上稿,行銷團隊、外包寫手,或是好幾個部門共用同一個佈景主題,彼此不熟悉別人排好的版面,容易在編輯自己那篇文章的時候,順手動到大家共用的區塊,例如可重複使用區塊或導覽選單。
  3. 網站正在被工作室或站長代管維運,某些關鍵區塊已經調整到穩定狀態,像導覽列、頁尾的聯絡資訊,或是法遵聲明區塊,不希望任何人事後更動,卻仍然希望對方能編輯其餘的內容。
客戶自行維運、多位編輯者共用、工作室代管三種情境,使用者手滑就搬走或刪掉整組排版,正是區塊鎖定要防的狀況
代管網站最常見的三種誤動,多半不是惡意破壞,而是原本立意良善的使用者一個手滑弄壞了版面。

Learn WordPress 官方課程直接點出這個功能的用途,能讓工作室交付預先設計好的版型給客戶編輯,卻不容易被改動,這正是這個功能被設計出來的目的。不過,鎖定也不是套上去就萬事大吉。Themes Harbor 這個 WordPress 相關網站分享過一個誠實的反面案例,他們原本用最嚴格的內容鎖定模式,做出多款預先鎖好的版型,卻發現編輯者常常需要微調版面,每次都得先手動解開限制才能改設計,反而拖慢了流程,後來選擇不再大量套用這種模式。這也提醒一件事,鎖定要用在真的不該被改的區塊上,不要無差別套用到整篇內容。

單一區塊的鎖定操作順序

進到實際操作,鎖一個區塊其實只要幾個步驟。第一個入口是選取想鎖定的區塊之後,點開區塊工具列右側的選項選單,也就是三個點組成的那個按鈕,裡面會有一個「鎖定」選項。第二個入口在「列表檢視」裡,對著清單裡任何一個區塊,同樣可以叫出這個鎖定選單,不必先跑到畫面上把區塊找出來,對排版複雜、區塊層層疊套的頁面特別方便。

點開鎖定視窗後,會看到 3 個選項:鎖定移動、鎖定移除,以及兩者都選,也就是同時限制移動與移除。設定完成之後,這個區塊在工具列與列表檢視裡都會多出一個鎖頭圖示,這是用來確認鎖定已經生效的視覺提示。如果選了鎖定移除,原本選項選單裡的「移除區塊」項目會直接消失,不是變成灰色不能點,是整個看不到;如果選了鎖定移動,拖曳把手與方向鍵移動都不會有反應,列表檢視裡想把這個區塊拖到別的位置,同樣拖不動。

區塊鎖定視窗,鎖定移動與鎖定移除兩個開關可單獨勾選,另有全部鎖定一次套用兩者
選取區塊後打開鎖定視窗,勾「鎖定移動」讓區塊搬不動、勾「鎖定移除」讓它刪不掉,兩個開關可以分開勾,也能用「全部鎖定」一次套用。

有一件事值得特別說清楚,鎖定完全不影響樣式與內容的編輯。文字照樣能改,圖片照樣能換,顏色、間距這些樣式設定也都還能照常調整。鎖定管住的只有這個區塊能不能被搬動、能不能被刪掉這兩件事,跟區塊裡裝了什麼內容完全是兩回事。這也是為什麼區塊鎖定被稱作是防呆設計,而不是內容審核機制,它擋的是版面結構被弄亂,不是擋內容本身的更動。

群組、欄與導覽區塊的整組鎖定設定

單一區塊鎖定處理的是一個一個鎖,但很多情境其實不是鎖一個區塊,而是要鎖住一整個排版容器裡的所有子區塊,例如整個頁首群組,或是一組多欄排版底下所有的欄。如果只鎖了最外層的容器,裡面的子區塊卻沒有一起鎖上,還是防不住有人跑進容器裡面搬動其中一塊,整組鎖定要解決的正是這個問題。

目前支援「套用到全部內部區塊」這個整組鎖定選項的,只有 5 種核心容器區塊:群組、封面、欄群、單欄,以及導覽。操作方式跟單一區塊鎖定大致相同,選取這個容器區塊,打開鎖定視窗,除了原本的鎖定移動、鎖定移除,會多出第四個選項,也就是「套用到全部內部區塊」。勾選之後,容器本身與裡面所有子區塊,會一併套用同樣的鎖定規則,不必再逐一進到每個子區塊裡各鎖一次。

從底層資料來看,套用這個選項之後,區塊標記裡會多一個 templateLock 屬性,值會被設成 all,同時原本的 lock 屬性也會被設定為移動與移除都是 true。這組屬性跟接下來要細講的範本鎖定,其實是同一套機制,這裡先讓大家知道群組鎖定在編輯介面上長什麼樣子,後面會拆解 all 以外還有哪些層級可以選。順帶一提,早期版本裡,欄區塊在某些操作下曾經因為初始化範本鎖定狀態的方式,導致編輯器出錯,這個問題後續已經修正,欄區塊現在會正確繼承外層容器的鎖定狀態,整組鎖定的行為已經穩定下來,不需要特別擔心。

解除鎖定的兩個步驟與預設權限的落差

解鎖的操作跟鎖定完全對稱。點選被鎖定的區塊,從工具列上的鎖頭圖示,或是列表檢視裡同樣的鎖頭圖示,叫出同一個設定視窗,把原本勾選的項目取消,按下套用就完成解鎖,不需要記另外一套操作方式。

不過,這裡有一個對代管站台來說很關鍵的落差,預設情況下,只要是能進入區塊編輯器、對這份內容有編輯權限的使用者,就能自己把別人鎖上的區塊解鎖。區塊鎖定預設並不分角色,管理員可以解鎖,一般能編輯這份內容的作者、編輯者角色,同樣可以解鎖。也就是說,單靠介面上的鎖定,防得住手滑,防不住一個人明知道這個區塊被鎖住,還是刻意想把它解開。

這件事聽起來有點違反直覺,一個標榜防呆的功能,居然連解鎖的權限都不設限。但這其實呼應了前面提過的定義,鎖定針對的是動作,不是身分,它從一開始的設計就沒有打算取代角色權限管理。真正要把誰能鎖定、誰能解鎖這件事也管起來,得靠一段放進佈景主題的程式碼才做得到。

範本鎖定的三個層級,all、insert 與 contentOnly

前面說的整組鎖定,其實只是範本鎖定(Template Locking)這個機制裡最嚴格的一種用法。範本鎖定要處理的問題更大一點,管理的不是一兩個區塊,而是一整組範本或版型要怎麼被使用者使用。它適用的容器跟前面一樣,是群組、封面、欄群、單欄與導覽這幾種區塊,寫進內容時用的屬性,在範型或範本檔案裡叫 templateLock,如果是替自訂文章類型註冊範本,則是用 template_lock 這個名稱,兩者指的是同一套邏輯。這 3 個層級,分別鎖住不同程度的排版彈性,適合的情境也不一樣。

範本鎖定 all、insert、contentOnly 三個層級,對新增、移動、移除區塊與改內容的限制程度各不相同
all 把整組排版凍結、insert 只禁止增刪、contentOnly 只留文字與圖片可編輯,三個層級鬆緊不同。

all,鎖死整個容器不能新增搬動或刪除

這是 3 個層級裡最嚴格的一種。容器內所有子區塊全部被鎖死,不能新增區塊、不能搬動,也不能刪除,等同把整組排版凍結成一塊不能再被更動的內容。Fullsiteediting.com 對這個層級的定義很直接,設定為 all 之後,使用者無法再插入新區塊,也不能移動或移除既有的區塊。

適合套用 all 的情境,是那種已經定案、完全不希望被更動的區塊,例如已經反覆調整、確定不會再改的頁尾版型,或是法遵聲明這種內容與排版都不該被任何人動到的區塊。標記上的寫法很單純,在容器區塊的屬性裡把 templateLock 設成 all,同時 lock 屬性裡的 move 與 remove 也都會是 true,兩組屬性合起來,才是完整鎖死一個容器的做法。

insert,禁止新增區塊但保留既有內容能調整

insert 比 all 寬鬆一階,鎖住的是不能再塞新區塊進來,也不能刪除既有區塊這兩件事,但排版裡本來就存在的那些區塊,順序或內容還是可以視情況調整,寬鬆度介於單一鎖定與整組凍結之間。Fullsiteediting.com 把這個層級定義為,阻止使用者插入或移除區塊,但沒有把移動這件事一併鎖死。

這個層級比較適合已經排定好幾個固定欄位、但仍然允許使用者微調內容的情境,常見的用法是替自訂文章類型註冊範本。舉例來說,一個書籍文章類型,可以預先定義好圖片、標題、描述這 3 個區塊當作固定範本,搭配 insert 層級的範本鎖定,使用者不能再多塞一個區塊進來、也不能把這 3 個區塊裡的任何一個刪掉,但範本裡原有的內容,還是可以照常編輯與微調。

contentOnly,只留文字與圖片可以編輯,其餘全部隱藏

這是 3 個層級裡最貼近交給不熟悉排版的人編輯這種情境的模式,設定完成後,畫面上所有跟排版、樣式有關的子區塊,例如容器本身、間距設定、欄位配置,都會直接從列表檢視裡隱藏,也沒辦法被點選;側邊欄只會列出屬於內容類的區塊,像文字與圖片,讓使用者點進去編輯。換句話說,使用者能改的就只剩文字與媒體本身,連底層的排版結構長什麼樣子都看不到,也動不了。

套用 contentOnly 後,群組、欄位配置、間距設定等排版結構從列表檢視隱藏,側邊欄只留文字與圖片可編輯
設成 contentOnly 後,排版結構全部從列表檢視隱藏,使用者能動的只剩文字與圖片。

這個模式是 WordPress 6.1 才加入的,官方的核心開發紀錄把它稱作一種鎖定類型,啟用之後,使用者只能更動區塊或範型裡巢狀的內容,整個區塊的階層結構會被完全隱藏,對使用者來說,看起來就像是一個不能拆解的單一整體。目前支援 contentOnly 的核心區塊只有 3 種,群組、封面,以及欄,這裡的欄指的是單欄 Column,不是前面提到的欄群 Columns,兩者容易搞混,要特別留意。

Themes Harbor 針對這 3 種區塊,分別記錄了套用之後的實際行為。群組被設成 contentOnly 之後,使用者可以編輯裡面的文字或圖片,但沒辦法做任何版面或樣式上的變動;封面區塊在這個模式下,使用者可以修改覆蓋在上面的文字,但背景的圖片、影片或漸層色,以及其他設計元素都維持不變;單欄區塊套用之後,欄位內的文字與圖片可以編輯,但欄數、欄寬與其他排版設定全部被鎖住,使用者連想調整都調整不了。

不過,這個模式有一個限制,目前沒有辦法透過編輯器介面直接把某個區塊設成 contentOnly,只有 all、insert,以及單一區塊鎖定這幾種才有介面上的按鈕可以按。contentOnly 只能透過程式碼,或是預先寫進範型與範本檔案裡的屬性去設定,把 templateLock 這個屬性設成 contentOnly 之後,之後套用這個範型的人才會看到這個被簡化過的編輯介面。另外,如果自訂文章類型也想套用 contentOnly,一樣可以在註冊文章類型的時候,把範本鎖定的層級設成這個值,不只能用在範型上。

還有一件事,即使套用了 contentOnly,使用者畫面上仍然會有一個「修改」的連結按鈕,點下去就能手動切換回完整的編輯模式,看到原本被隱藏的排版控制項。這個按鈕目前沒有辦法用程式關掉,任何能進到編輯器的人都按得到。Themes Harbor 也誠實提到這個模式的取捨,優點是介面乾淨,工作室或代理商能一邊維持設計一致性,一邊放行內容編輯;缺點是熟悉完整編輯器的使用者,可能會覺得這裡怎麼都不能改,如果對方不知道這個頁面套用了這種模式,還可能花時間去找根本藏起來的控制項。

用一段程式碼,把鎖定與解鎖的權限收回給管理員

前面提到,區塊鎖定預設不分角色,只要能編輯這份內容,就能自己解鎖被鎖住的區塊。這個落差要靠 WordPress 內建的一個過濾器補起來,叫作 block_editor_settings_all。透過這個過濾器,可以修改編輯器設定裡的 canLockBlocks 這個值,設成 true 代表這個使用者可以自己鎖定或解鎖區塊,設成 false 就代表整個鎖定與解鎖的選單項目會直接消失,不是變灰、是看不到。這個值預設是 true,也就是任何有編輯權限的人都看得到鎖定選單。

這段程式碼放在使用中佈景主題的 functions.php,或是子佈景主題、自訂外掛裡都可以,效果是全站生效,不必逐頁設定。以下是 3 種常見的寫法。

第一種,只針對特定文章類型關閉這個功能,例如頁面一律不給鎖定與解鎖的權限:

add_filter( 'block_editor_settings_all', function( $settings, $context ) {
    if ( $context->post && 'page' === $context->post->post_type ) {
        $settings['canLockBlocks'] = false;
    }
    return $settings;
}, 10, 2 );Code language: PHP (php)

第二種,依角色的能力來判斷,只放行有能力管理主題選項的角色,實務上等於只留給管理員層級:

add_filter( 'block_editor_settings_all', function( $settings ) {
    $settings['canLockBlocks'] = current_user_can( 'edit_theme_options' );
    return $settings;
} );Code language: PHP (php)

Learn WordPress 官方課程附的範例,用另一個能力判斷,把權限收得更緊,只留給管理員:

function example_theme_restrict_locking_ui( $settings, $context ) {
    $settings['canLockBlocks'] = current_user_can( 'activate_plugins' );
    return $settings;
}
add_filter( 'block_editor_settings_all', 'example_theme_restrict_locking_ui', 10, 2 );Code language: PHP (php)

套用這段程式碼之後,實際的效果很直接。用作者層級的帳號登入,鎖定使用者介面會整個改變,原本能看到的解鎖選項不見了,只有管理員還保留這個能力。也可以換一個門檻,例如用 delete_others_posts 這個能力當判斷依據,等同放寬到編輯者以上的角色都能用;如果還想更進一步,鎖到某個特定的使用者信箱,也可以在這段程式碼裡再加一層判斷。哪一種寫法比較合適,取決於這個網站有多少人需要鎖定或解鎖的權限,不是只有管理員能鎖就一定最安全,團隊裡真的需要排版的角色,也該保留這個能力。

介面上的區塊鎖定,擋得住多數人真正會犯的錯,也就是連續好幾次滑鼠沒抓穩,把整組排版拖到別的地方去。搭配範本鎖定的 3 個層級,再加上收回權限的這段程式碼,一個代管中的網站,終於可以把哪些內容可以放手交出去、哪些排版絕對不能被動這件事,講得清清楚楚,而不是靠口頭提醒或事後補救。下一次要把網站交給客戶自己維運,或是把一份範本開放給團隊成員共用,這幾層鎖定,值得花幾分鐘先設好,而不是等版面被拖亂了才回頭補救。

常見問答

本區問答由 AI 依文章內容自動整理,僅供快速參考,正式內容仍以全文為準。

WordPress 區塊鎖定可以鎖住什麼?

區塊鎖定能限制的是「移動」與「移除」這兩種動作,設定完成後,被鎖住的區塊沒辦法被拖曳搬動,也沒辦法被刪除,但鎖定完全不影響區塊的文字、圖片與樣式,這些照樣可以編輯。

一般編輯者可以解開別人鎖定的區塊嗎?

可以,區塊鎖定預設不分角色,只要對這份內容有編輯權限,就能自己把別人鎖上的區塊解鎖;管理員與一般作者、編輯者的解鎖能力沒有差別,鎖定針對的是動作,不是使用者身分。

怎麼把一整組頁尾區塊一起鎖住?

選取群組、封面、欄群、單欄或導覽這類容器區塊,打開鎖定視窗後勾選「套用到全部內部區塊」,容器本身與裡面所有子區塊就會一併套用同樣的鎖定規則,不必再逐一進到每個子區塊裡各鎖一次。

範本鎖定 contentOnly 要怎麼設定?

contentOnly 目前沒有編輯器介面按鈕可以直接設定,只能透過程式碼,或預先寫進範型與範本檔案裡的 templateLock 屬性;套用後,排版與樣式子區塊會從列表檢視隱藏,只留文字與圖片可以編輯。

怎麼把區塊解鎖權限收回給管理員?

需要在佈景主題 functions.php 或外掛裡,透過 block_editor_settings_all 這個過濾器把 canLockBlocks 設成依角色能力判斷,只放行有能力管理主題選項的使用者,其餘角色的解鎖選單就會直接消失。

資料來源
  1. Block locking – Block Editor Handbook — Block Editor Handbook
  2. Patterns and block locking – Theme Handbook — Block Editor Handbook
  3. The Key to Locking Blocks — Learn WordPress
  4. Content Locking Features and Updates — Make WordPress Core