J'ai des commentaires de code sur trois solutions déjà publiées, mais aussi un commentaire général
Ils présentent un choix sous-optimal: soit remplacer le choix de la case Options d'écran de l'utilisateur; ou respectez-le mais faites ignorer votre code si l'utilisateur a déjà modifié les cases à cocher, même pour d'autres méta_boxes, ou avant que votre code ne soit dans WP. Il semble que le choix respectueux ne soit utile que si tous vos utilisateurs sont nouveaux. La meilleure solution serait de définir une option utilisateur personnalisée pour déterminer si vos paramètres par défaut meta_box spécifiques ont été modifiés par l'utilisateur, et respecter cela. Non, je n'ai pas écrit ce code! Ça devrait être facile ... :)
Les trois solutions proposées:
1. La hidden_meta_boxes
solution de WraithKenny est celle qui remplace l'option user_option. Notez qu'il couvre tous les types de publication («publication», «page», «lien», «pièce jointe» et tous les types de publication personnalisés). C'est bien, sauf si vous voulez que ce soit précis. Vous avez spécifié les post_type dans vos add_meta_box()
appels. Vous pouvez essayer de faire correspondre ceux-ci, ou tout simplement le faire car ceux qui ne correspondent pas seront ignorés. Si vous voulez connaître le post_type dans le filtre, vous pouvez utiliser le screen
paramètre supplémentaire :
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. Comme le dit Rarst, default_hidden_meta_boxes
respecte l'option user_option. Comme avec hidden_meta_boxes
, vous pouvez utiliser le paramètre $ screen pour distinguer les post_types.
3. La fonction set_user_metaboxes () de Drebabels respecte également l'option user_option. Notez qu'il est codé en dur pour l'écran d'édition «post». Pour gérer l'écran d'édition de la page et d'autres post_types, encapsulez le code dans cette boucle:
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 );
}
}
}
Ouais, ça get_user_meta
devrait l'être get_user_option
. Pour un site unique, cela n'a pas d'importance, et même pour plusieurs sites, cela n'a probablement pas d'importance. Voir wp-admin / includes / ajax-actions.php pour savoir pourquoi: update_user_option
a le "vrai" paramètre global.