Answers:
您是指管理员发布屏幕上的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”。当然,缺点是现在用户每次进入管理页面都会触发此功能。
functions.php
文件中,因为默认选项是针对特定项目的,该特定项目由我正在开发的主题表示/容纳。
有default_hidden_meta_boxes
过滤器get_hidden_meta_boxes()
,允许修改其作为用户并没有在屏幕上的选项修改他的喜好不受限制,只要所示。
我已经发布了有关三个解决方案的代码注释,但也有一般注释
它们提供了一个次优的选择:要么覆盖用户的“屏幕选项”复选框,要么不显示。或尊重它,但是如果用户曾经更改过复选框(甚至其他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'全局参数。