У меня есть комментарии к трем уже опубликованным решениям, но также и общий комментарий
Они представляют собой неоптимальный выбор: либо отменить выбор опции «Параметры экрана» пользователя; или уважайте его, но игнорируйте ваш код, если пользователь когда-либо изменял флажки, даже для других meta_boxes, или до того, как ваш код был в WP. Кажется, уважительный выбор полезен, только если все ваши пользователи являются новыми. Лучшим решением было бы установить пользовательскую опцию пользователя, чтобы определить, были ли ваши конкретные значения по умолчанию для meta_box изменены пользователем, и уважать это. Нет, я не написал этот код! Должно быть легко ... :)
Опубликованы три решения:
1. Решение WraithKenny hidden_meta_boxes
переопределяет user_option. Обратите внимание, что он охватывает все типы сообщений («публикация», «страница», «ссылка», «вложение» и любые пользовательские типы сообщений). Это хорошо, если вы не хотите, чтобы это было конкретным. Вы указали post_type в своих add_meta_box()
звонках. Вы можете попытаться сопоставить их или просто использовать, поскольку те, которые не соответствуют, будут игнорироваться. Если вы хотите узнать 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.
3. Функция Drebabels set_user_metaboxes () также учитывает user_option. Обратите внимание, что он жестко запрограммирован для экрана редактирования «post». Чтобы обработать экран редактирования '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
. Для одного сайта это не имеет значения, и даже для нескольких сайтов это, вероятно, не имеет значения. См. Wp-admin / includes / ajax-actions.php, почему: update_user_option
имеет глобальный параметр 'true'.