我已经发布了关于三种解决方案的代码注释,但还有一条一般性注释
它们提供了一个次优的选择:要么覆盖用户的屏幕选项复选框选择;或者尊重它,但如果用户曾经更改过复选框,即使是其他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”全局参数。