問題描述

我希望能夠使用螢幕選項隱藏元框,而不是刪除它們或將其限制到使用者角色,目標是將”uncheck” 用於使用者的元框。

我看到這將是棘手的,因為任何程式碼將使一個使用者的資料庫更改不會被允許執行每次他們打到頁面,因為它只是重置。但是比我編碼核心更聰明的人,所以也許有辦法。如果有的話,我要死了。

有任何想法嗎?

最佳解決方案

你是指管理員帖子螢幕上的 metaboxes 嗎?

為此,您不需要外掛,只需將以下內容放入您的 functions.php 檔案中即可。

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id();

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

基本上發生的是,對於當前登入的使用者,您正在更改 wp_usermeta 表中儲存的一些 meta_values 。

有兩種方法可以使用這個功能,你可以掛鉤到’user_register’ 或者你可以掛鉤到’admin_init’ 。

使用’user_register’ 的優點是,只有當新使用者註冊時,此功能才會觸發 (從而降低開銷) 。但是,對於已經存在的使用者來說,它將不起作用。

如果您希望為已經存在的使用者工作,請掛接到’admin_init’ 。當然,缺點是現在每次使用者訪問管理頁面時都會觸發此功能。

次佳解決方案

get_hidden_meta_boxes()中有 default_hidden_meta_boxes 過濾器,只要使用者在螢幕選項中沒有修改自己的偏好,就可以修改哪些不顯示。

第三種解決方案

我有關於已經發布的三個解決方案的程式碼註釋,也是一般的評論

它們提供次優選擇:覆蓋使用者的 「螢幕選項」 核取方塊選項; 或者尊重它,但如果使用者更改了核取方塊,即使是其他 meta_boxes,或者您的程式碼在 WP 之前,也會忽略您的程式碼。似乎尊重的選擇僅在所有使用者都是新使用者時才有用。最好的解決方案是設定一個自定義使用者選項,以確定您的特定 meta_box 預設值是否已被使用者更改,並遵守該選項。不,我沒有寫那段程式碼!應該很容易… 🙂

三個解決方案發布:

1. WraithKenny 的 hidden_meta_boxes 解決方案是覆蓋 user_option 的解決方案。注意它涵蓋所有的帖子型別 (‘post’,’page’,’link’,’attachment’ 和任何自定義的帖子型別) 。沒關係,除非你想要具體。您在 add_meta_box()電話中指定了 post_type 。你可以嘗試匹配那些,或者只是為了匹配,因為不匹配的那些將被忽略。如果您想知道過濾器中的 post_type,可以使用額外的 screen 引數:

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. 如 Rarst 所說,default_hidden_meta_boxes 尊重 user_option 。與 hidden_meta_boxes 一樣,您可以使用 $ screen 引數區分 post_types 。

Drebabels 的 set_user_metaboxes() 功能也尊重 user_option 。注意是’post’ 編輯螢幕是 hard-coded 。要處理’page’ 編輯螢幕和其他 post_types,請將程式碼包裝在此迴圈中:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id();

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

是的,get_user_meta 應該是 get_user_option 。對於 single-site 而言並不重要,甚至對於 multi-site 來說也是如此。參見 wp-admin /includes /ajax-actions.php 為什麼:update_user_option 具有’true’ 全域性引數。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。