
重點整理
在子主題 functions.php 用 pre_get_posts 加入一段函數,指定頁面 ID 後,管理員以外的角色(例如編輯)在後台就看不到這些頁面,可避免誤改。本文說明如何查頁面 ID 與修改函數。
當網站中具有多人共同編輯的情況下,為了防止其他具有編輯權限的工作同仁不小心修改到將已經建立好的網頁內容,除了安裝外掛來設定每一個身分更細的編輯項目外,也能以加入函數的方式將指定頁面隱藏起來。本篇文章分享的函數只需要將查詢到的頁面 ID 放入到指定位置,更新後就能夠生效,如果說只是單純想要隱藏頁面,又不想安裝多餘的外掛空耗主機資源,那麼就可以考慮使用此次教學說明的函數。
另外要做個提醒,加入任何自定義的函數前都請先確認 WordPress 版本(本次分享的函數在 WordPress 5.0 以上版本測試過)以及完成網站備份,以免網站發生錯誤無法還原。
函數說明與隱藏頁面效果
第一步:查看頁面 id 最快的方式,就是在後台中將游標移至要查詢的頁面項目上,在左下角就會顯示此頁面的 id 號碼,如下圖所示。

第二步:下面的 function 首先以 add_action 定義 hook 為 pre_get_posts ,函數名稱為 exclude_this_page ,接者再以 $query 執行變量查詢。在 global 全局中給定變數為 $pagenow 、$current_user,再以 if 條件式給定當登入身份(user_roles)為網站管理員(administrator)時,返回正常查詢,也就是頁面均顯示,而當登入身份為編輯(editor)時,則執行 post__not_in,id=3 的頁面將不予顯示。
第三步:那進入佈景主題編輯器,選擇子主題後在 function.php 檔案結尾處加入函數,更新前記得修改 array(3) 中的數值為想要隱藏的頁面 id ,如果要隱藏多個頁面,使用逗點區隔即可,像是 array(3,4,5) 。

第四步:筆者新增一個權限為編輯的使用者。

第五步:在網站管理員權限的登入狀態下,ID 為 3 的頁面可以顯示。

第六步:以編輯權限登入後,ID 為 3 的頁面會自動隱藏。

加入這段函數前要注意什麼?
- 限定只在後台執行:pre_get_posts 會影響網站上所有查詢,函數裡要先判斷
is_admin()與$query->is_main_query(),並只針對頁面類型,避免連前台的文章列表、選單都被過濾掉。 - 用角色判斷而非帳號名稱:用
current_user_can()檢查權限,日後新增同角色的人也會自動套用。 - 放在子主題或程式碼片段外掛:直接改父主題,更新時會被覆蓋。
- 先備份並測試:分別用管理員與編輯帳號登入,確認列表與前台都正常。
有哪些不寫程式的替代做法?
如果目的是避免同事改到重要頁面,用權限外掛管理通常比較完整:
- User Role Editor:可以調整每個角色能不能編輯他人的頁面、能不能發布或刪除。
- Members:除了角色權限,也能限制特定內容只給某些角色看。
- 善用內建角色:只需要寫文章的同事給「作者」角色,作者本來就不能修改別人的內容與頁面。
權限設好後,用該角色的帳號實際登入檢查一次,確認看得到、改得到的範圍符合預期。
常見問題
WordPress 怎麼隱藏頁面,不讓訪客看到?
在頁面編輯畫面把可見度改成「私人」,就只有登入的管理員與編輯看得到;改成「密碼保護」則要輸入密碼才能瀏覽。本文的 pre_get_posts 函數是另一回事,它隱藏的是後台列表中的頁面,對前台訪客沒有作用。
用這段函數隱藏的頁面,編輯就完全改不到了嗎?
不一定。函數只是讓頁面不出現在後台列表,若對方知道頁面 ID,直接輸入編輯網址仍可能打開。要真正禁止修改,必須用角色權限外掛限制,或把頁面作者改成管理員並移除編輯修改他人頁面的權限。
頁面 ID 要去哪裡看?
在後台「頁面」列表把滑鼠移到頁面標題上,瀏覽器左下角的網址中 post= 後面的數字就是 ID;打開頁面編輯畫面時,網址列的 post= 數字也一樣。
