如何设置默认屏幕选项?


20

我希望能够使用屏幕选项来隐藏meta框,而不是删除它们或将其限制为用户角色,其目的只是为用户“取消选中” meta框。

我知道这会很棘手,因为任何会导致用户更改数据库的代码都不会在用户每次访问该页面时就运行,因为它将被重置。但是比我编写核心代码还要聪明的人,所以也许有办法。如果有的话,我很想知道。

有任何想法吗?


对于每个用户名,您将必须创建自己的排序插件,该插件将在所有用户名旁边填充一个复选框,并将其挂接到用于显示元框或多个元框的过滤器中。
Wyck

通过默认情况下,你的意思是,他们应该一旦创建新用户时,正确应用?
2011年

Answers:


25

您是指管理员发布屏幕上的metabox吗?

为此,您不需要插件,只需将以下内容放到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”。当然,缺点是现在用户每次进入管理页面都会触发此功能。


15
不是主题工作,不属于functions.php。
fuxia

6
@toscho我不太同意。自然地,您可以将其放入插件中,但是,例如,如果您要为自己或可能不需要某些框的客户构建主题,那么为什么要增加将其包含在插件中的额外管理开销。通过将其放到functions.php文件中,可以确保主题的体验是一致的,而不必确保已安装和激活插件。
drebabels,2011年

10
没有开销,通过使用插件。这是一个神话,必须立即消失。另外,您的使用限制不是问题的一部分。成千上万的新手会阅读您的答案。您将以最好的代码帮助他们,而不是在某些特定情况下可以起作用的代码。:)
fuxia

+1好答案-有时您确实想明确设置这些值。这是一个很好的基础,当然可以轻松修改此代码以在必要时调用它(例如,添加一个新用户),以便您确实在设置“默认”选项,而不是对更改它们的用户强制使用这些选项。我会将这段代码添加到主题functions.php文件中,因为默认选项是针对特定项目的,该特定项目由我正在开发的主题表示/容纳。
cwd

1
在写完此答案的几个月后,将过滤器添加到核心中使该答案过时了。
WraithKenny


7

我已经发布了有关三个解决方案的代码注释,但也有一般注释

它们提供了一个次优的选择:要么覆盖用户的“屏幕选项”复选框,要么不显示。或尊重它,但是如果用户曾经更改过复选框(甚至其他meta_box),或者您的代码在WP中之前,也忽略了您的代码。似乎只有当您所有的用户都是新用户时,尊重的选择才有用。最好的解决方案是设置一个自定义用户选项,以确定用户是否已更改了特定的meta_box默认设置,并遵守了该设置。不,我还没有编写代码!应该很容易... :)

发布了三个解决方案:

1. WraithKenny的hidden_meta_boxes解决方案是覆盖user_option的解决方案。请注意,它涵盖了所有帖子类型(“帖子”,“页面”,“链接”,“附件”和任何自定义帖子类型)。除非您不希望它具体化,否则很好。您在add_meta_box()调用中指定了post_type 。您可以尝试匹配它们,或者只附加它,因为不匹配的将被忽略。如果您想知道过滤器中的post_type,可以使用extra 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.正如拉斯特所说,default_hidden_meta_boxes尊重user_option。与一样hidden_meta_boxes,您可以使用$ screen参数来区分post_types。

3. Drebabels的set_user_metaboxes()函数也尊重user_option。请注意,它是为“帖子”编辑屏幕进行硬编码的。要处理“页面”编辑屏幕和其他post_type,请在以下循环中包装代码:

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。对于单站点,这无关紧要,即使对于多站点,也可能无关紧要。有关原因,请参见wp-admin / includes / ajax-actions.php:update_user_option具有'true'全局参数。


1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

还有一个hidden_meta_boxes过滤器,它会在每次页面加载时“取消选中”元框(使其隐藏)(但根本不必更新数据库)。如果您只是想让用户在自己选中该框之前将其关闭,请使用Rarst的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.