问题描述

我希望能够使用屏幕选项隐藏元框,而不是删除它们或将其限制到用户角色,目标是将”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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。