本篇文章更新時間:2021/10/07
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
同事開了一個需求是「可以觀看但不能編輯與刪除內容的帳號權限」,用途是讓客戶可以把這帳號交給工讀生來審閱與紀錄內容。
既然是審閱,那這些內容就不會是「已發佈」的狀態,所以如果要可以預覽,又不能修改別人的內容,這塊就要繞路處理。
好在這需求也不新奇,已經有外掛 Public Post Preview 可以辦到,只是這外掛預設會需要作者主動的開啟預覽功能,本篇情境還要將此功能自動化才能整合完成。
function mxp_manage_POST_TYPE_SCREEN_ID_columns($columns) {
$user = wp_get_current_user();
$allowed_roles = array('viewer');
// 限制帳號角色啟用列表欄位
if (array_intersect($allowed_roles, $user->roles)) {
$columns['view'] = '預覽'; //新增的列表欄位
unset($columns['要移除的其他欄位名稱']);
}
return $columns;
}
add_filter('manage_POST_TYPE_SCREEN_ID_columns', 'mxp_manage_POST_TYPE_SCREEN_ID_columns', 11, 1);
function mxp_manage_POST_TYPE_posts_custom_column($column_key, $post_id) {
if ($column_key == 'view') {
//針對「預覽」欄位的開啟草稿預覽處理
$post_ids = get_option('public_post_preview', array());
$post_ids[] = $post_id;
$post_ids = array_map('intval', $post_ids);
$post_ids = array_map('absint', $post_ids);
$post_ids = array_filter($post_ids);
$post_ids = array_unique($post_ids);
update_option('public_post_preview', $post_ids);
$link = DS_Public_Post_Preview::get_preview_link(get_post($post_id));
echo "點此預覽";
}
}
add_action('manage_POST_TYPE_posts_custom_column', 'mxp_manage_POST_TYPE_posts_custom_column', 10, 2);
權限部分直接開一個角色(role)名為「viewer」,設定好角色對應權限後,這邊將對應要開啟的內容類型(Post Type)配置上述的程式碼片段。
如此一來就能針對還未發佈的內容,在列表頁面觀看時就出現一個「預覽」欄位,欄位中自動幫所有內容篇幅加入草稿預覽功能。
關於新增內容列表欄位,可以參考 manage_{$screen-id}_columns 與 manage_{$post_type}_posts_columns 兩個 Hooks。先前有寫過一篇筆記 [WordPress] 客製化內容類型中設定可排序欄位(Sortable columns) 也可以參考。
Public Post Preview 這款外掛還有針對「預覽時效」來處理,預設是兩天,至於其他的狀況,外掛也有考量。這樣的操作整合實在方便又強大!
apply_filters('ppp_nonce_life', 2 * DAY_IN_SECONDS); // 2 days.
如果希望當下對外公開的預覽時效性低一點可以補上 Hook
function mxp_setting_preview_limit($seconds) {
return 3600;
}
add_filter('ppp_nonce_life', 'mxp_setting_preview_limit', 10, 1);
限制一小時的預覽時效。(如果工讀生超過可接受預覽時間也只需要重新刷新內容列表頁面即可產生過新的預覽連結)
這樣限縮也可減少不正確的資料在外遊走的時間,及早審閱修正發佈正確的內容。