如何设置默认屏幕选项?

时间:2011-04-22 作者:developdaly

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

我知道这将是多么棘手,因为任何会对用户进行DB更改的代码都不允许在每次点击页面时运行,因为它只会重置。但是比我聪明的人编写核心代码,所以也许有办法。如果有,我很想知道。

有什么想法吗?

4 个回复
最合适的回答,由SO网友:drebabels 整理而成

您指的是admin post屏幕上的元数据库,对吗?

因此,您不需要插件,只需将以下内容放入您的函数中即可。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\\u usermeta表中保存的一些meta\\u值。

有两种方法可以使用此函数,您可以挂接到“user\\u register”或“admin\\u init”。

使用“user\\u register”的优点是,此函数仅在注册新用户时启动(从而降低开销)。但是,它不适用于已经存在的用户。

如果您想让它对已经存在的用户起作用,那么可以挂接到“admin\\u init”。当然,缺点是现在每当用户转到管理页面时,该函数都会启动。

SO网友:Rarst

default_hidden_meta_boxes 筛选输入get_hidden_meta_boxes() 这允许修改未显示的内容,只要用户未在屏幕选项中修改其首选项。

SO网友:kitchin

我已经发布了关于三种解决方案的代码注释,但还有一条一般性注释

它们提供了一个次优的选择:要么覆盖用户的屏幕选项复选框选择;或者尊重它,但如果用户曾经更改过复选框,即使是其他meta\\u框,或者在您的代码在WP中之前,也可以忽略您的代码。似乎只有当所有用户都是新用户时,尊重的选择才有用。最好的解决方案是设置一个自定义用户选项,以确定用户是否更改了特定的meta\\u框默认值,并遵守该选项。不,我没有写那个代码!应该很简单…:)

发布的三种解决方案:

1 幽灵肯尼的hidden_meta_boxes 解决方案是覆盖user\\u选项的解决方案。注意,它涵盖了所有帖子类型(“帖子”、“页面”、“链接”、“附件”和任何自定义帖子类型)。那很好,除非你想具体点。您在中指定了post\\u类型add_meta_box() 呼叫。你可以试着匹配那些,或者只是随机应变,因为不匹配的会被忽略。如果您想知道过滤器中的post\\u类型,可以使用额外的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\\u选项。与…一样hidden_meta_boxes, 您可以使用$screen参数来区分post\\U类型。

3 Drebabels的set\\u user\\u metaboxes()函数也尊重user\\u选项。注意,它是为“post”编辑屏幕硬编码的。要处理“页面”编辑屏幕和其他post\\u类型,请将代码包装在此循环中:

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”全局参数。

SO网友:WraithKenny

add_filter( \'hidden_meta_boxes\', \'custom_hidden_meta_boxes\' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = \'your_metabox\';
    return $hidden;
}
还有hidden_meta_boxes 过滤器可以在每次页面加载时“取消选中”metabox(使其隐藏)(但根本不需要更新数据库)。如果你只想new 用户在自己选中该框之前,请使用Rarst的答案。

结束

相关推荐

无法在自定义构建的Metabox中保存自定义分类术语

我大致遵循了tutorial here 关于如何创建“自定义分类输入面板”。我正在使用自定义帖子类型homes 还有一种自定义分类法beds (用于记录一所房子的床位数)。我已经在下拉菜单中显示了分类术语,但无法在保存帖子时保存它们。我开始只是发布旨在保存术语的代码,但意识到我应该发布创建和显示元盒的代码,以用于上下文。自定义帖子类型名称为“homes”,自定义分类名称为“beds”。分类法是分层的(我认为这并不重要,但我可能错了)。//adding metaboxes for the homes pos