Tenho comentários de código sobre três soluções já postadas, mas também um comentário geral
Eles apresentam uma opção abaixo do ideal: substitua a opção da caixa de seleção Opções de tela do usuário; ou respeite-o, mas ignore seu código se o usuário alterar as caixas de seleção, mesmo para outras meta_boxes ou antes de seu código estar no WP. Parece que a escolha respeitosa só é útil se todos os seus usuários forem novos. A melhor solução seria definir uma opção de usuário personalizada para determinar se seus padrões específicos da meta_box foram alterados pelo usuário e respeitar isso. Não, eu não escrevi esse código! Deve ser fácil ... :)
As três soluções postadas:
1. A hidden_meta_boxes
solução do WraithKenny é a que substitui a opção do usuário. Observe que ele abrange todos os tipos de postagem ('postagem', 'página', 'link', 'anexo' e qualquer tipo de postagem personalizada). Tudo bem, a menos que você queira que seja específico. Você especificou o post_type em suas add_meta_box()
chamadas. Você pode tentar igualá-los ou apenas alterá-lo, pois os que não corresponderem serão ignorados. Se você deseja conhecer o post_type no filtro, pode usar o screen
parâmetro extra :
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. Como Rarst diz, default_hidden_meta_boxes
respeita a opção do usuário. Assim como hidden_meta_boxes
você pode usar o parâmetro $ screen para distinguir post_types.
3. A função set_user_metaboxes () do Drebabels também respeita a opção do usuário. Observe que está codificado para a tela de edição 'pós'. Para lidar com a tela de edição da 'página' e outros post_types, envolva o código neste loop:
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 );
}
}
}
Sim, get_user_meta
deveria ser get_user_option
. Para sites únicos, isso não importa, e mesmo para sites múltiplos, provavelmente não. Veja wp-admin / includes / ajax-actions.php para saber por que: update_user_option
possui o parâmetro global 'true'.