Ho commenti in codice su tre soluzioni già pubblicate, ma anche un commento generale
Presentano una scelta non ottimale: sovrascrivere la scelta della casella di controllo Opzioni schermo dell'utente; o rispettalo ma fai ignorare il tuo codice se l'utente ha mai cambiato le caselle di controllo, anche per altre meta_box, o prima che il tuo codice fosse in WP. Sembra che la scelta rispettosa sia utile solo se tutti i tuoi utenti sono nuovi. La soluzione migliore sarebbe quella di impostare un'opzione utente personalizzata per determinare se le impostazioni predefinite specifiche della meta_box sono state modificate dall'utente e rispettarle. No, non ho scritto quel codice! Dovrebbe essere facile ... :)
Le tre soluzioni pubblicate:
1. La hidden_meta_boxes
soluzione di WraithKenny è quella che sostituisce l'opzione_utente. Nota che copre tutti i tipi di post ("post", "pagina", "link", "allegato" e tutti i tipi di post personalizzati). Va bene se non vuoi che sia specifico. Hai specificato post_type nelle tue add_meta_box()
chiamate. Puoi provare ad abbinarli o semplicemente ad ala poiché quelli che non corrispondono verranno ignorati. Se vuoi conoscere il post_type nel filtro, puoi usare il screen
parametro 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. Come dice Rarst, default_hidden_meta_boxes
rispetta l'opzione_utente. Come per hidden_meta_boxes
, puoi usare il parametro $ screen per distinguere post_types.
3. La funzione set_user_metaboxes () di Drebabels rispetta anche l'opzione_utente. Nota che è hardcoded per la schermata di modifica 'post'. Per gestire la schermata di modifica della "pagina" e altri post_types, avvolgi il codice in questo 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 );
}
}
}
Sì, get_user_meta
dovrebbe essere get_user_option
. Per il sito singolo non importa, e probabilmente anche per il sito multiplo. Vedi wp-admin / Includes / ajax-actions.php per il motivo: update_user_option
ha il parametro globale "vero".