Tengo comentarios de código sobre tres soluciones ya publicadas, pero también un comentario general
Presentan una opción subóptima: ya sea anular la opción de casilla de verificación Opciones de pantalla del usuario; o respételo, pero ignore su código si el usuario alguna vez ha cambiado las casillas de verificación, incluso para otras meta_boxes, o antes de que su código estuviera en WP. Parece que la elección respetuosa solo es útil si todos los usuarios son nuevos. La mejor solución sería establecer una opción de usuario personalizada para determinar si el usuario ha cambiado los valores predeterminados específicos de su meta_box y respetarlo. No, no he escrito ese código! Debería ser fácil ... :)
Las tres soluciones publicadas:
1. La solución hidden_meta_boxes
de WraithKenny es la que reemplaza la opción user_option. Tenga en cuenta que abarca todos los tipos de publicaciones ("publicación", "página", "enlace", "archivo adjunto" y cualquier tipo de publicación personalizada). Eso está bien a menos que quieras que sea específico. Usted especificó el post_type en sus llamadas add_meta_box()
. Puede tratar de igualarlos, o simplemente hacerlo, ya que los que no coincidan serán ignorados. Si desea conocer el tipo_post en el filtro, puede usar el parámetro screen
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 dice Rarst, default_hidden_meta_boxes
respeta la opción de usuario. Al igual que con hidden_meta_boxes
, puede usar el parámetro $ screen para distinguir post_types.
3. La función set_user_metaboxes () de Drebabels también respeta la opción user_option. Tenga en cuenta que está codificado para la pantalla de edición 'publicar'. Para manejar la pantalla de edición de 'página', y otros post_types, envuelva el código en este bucle:
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
debería ser get_user_option
. Para un sitio único no importa, e incluso para sitios múltiples probablemente no lo haga. Consulte wp-admin / includes / ajax-actions.php para saber por qué: update_user_option
tiene el parámetro global 'verdadero'.