¿Cómo establecer las opciones de pantalla predeterminadas?
Me gustaría poder ocultar las cajas meta usando las opciones de pantalla, en lugar de eliminarlas o restringirlas a roles de usuario, el objetivo es simplemente "desmarcar" la caja meta para el usuario.
Entiendo que esto sería complicado ya que cualquier código que realizara un cambio en la base de datos para un usuario no se podría ejecutar cada vez que acceden a la página porque simplemente se reiniciaría. Pero hay personas más inteligentes que yo programando el core, así que tal vez haya una manera. Y si existe, me muero por saberla.
¿Alguna idea?

¿Te refieres a las metaboxes en la pantalla de edición de entradas en el área de administración, cierto?
Para eso no necesitas un plugin, simplemente añade lo siguiente en tu archivo functions.php.
// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {
// Estas son las meta claves que necesitaremos actualizar
$meta_key['order'] = 'meta-box-order_post';
$meta_key['hidden'] = 'metaboxhidden_post';
// Esto permite usar la función sin engancharla a user_register
if ( ! $user_id)
$user_id = get_current_user_id();
// Establece el orden por defecto si no se ha configurado aún
if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
$meta_value = array(
'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
'advanced' => '',
);
update_user_meta( $user_id, $meta_key['order'], $meta_value );
}
// Establece los elementos ocultos por defecto si no se han configurado aún
if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
$meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
}
}
Básicamente lo que está sucediendo es que para el usuario actualmente conectado, estás modificando algunos meta_values guardados en la tabla wp_usermeta.
Hay dos formas de usar esta función: puedes engancharla a 'user_register' o puedes engancharla a 'admin_init'.
La ventaja de usar 'user_register' es que esta función solo se ejecutará cuando se registre un nuevo usuario (menor sobrecarga). Sin embargo, no funcionará para usuarios que ya existen.
Si deseas que funcione para usuarios existentes, entonces engancha a 'admin_init'. La desventaja, por supuesto, es que ahora esta función se ejecuta cada vez que un usuario va a la página de administración.

@toscho No estoy realmente de acuerdo con eso. Naturalmente podrías poner esto en un plugin, pero si, por ejemplo, estás construyendo un tema para ti mismo o quizás para un cliente que no necesita ver ciertos cuadros, ¿por qué añadir la sobrecarga de gestión adicional que conlleva incluirlo en un plugin? Al colocarlo en el archivo functions.php te aseguras de que la experiencia con el tema sea consistente sin tener que asegurarte de que un plugin esté instalado y activado.

No hay sobrecarga al usar un plugin. Eso es un mito que debe morir instantáneamente. Además, tu restricción de uso no era parte de la pregunta. Tu respuesta es leída por miles de principiantes. Les ayudarás con el mejor código que puedas escribir, no con algo que solo funciona en algunas situaciones específicas. :)

+1 Buena respuesta - a veces sí quieres establecer estos valores explícitamente. Es una buena base, y por supuesto este código puede modificarse fácilmente para llamarlo cuando sea necesario (al agregar un nuevo usuario, por ejemplo), de modo que realmente estés configurando las opciones "predeterminadas" y no forzando opciones en usuarios que las cambian. Voy a añadir este código al archivo functions.php
de mi tema porque las opciones predeterminadas son para un proyecto específico, el cual está representado/alojado por el tema que estoy desarrollando.

¿Realmente la gente quiere que sus shortcodes sigan funcionando aunque cambien de tema? Lo mismo aplica para este tipo de función... Incluso más, coloco el plugin dentro de la carpeta mu-plugins
, así no puede ser desactivado fácilmente por el cliente (esto también funciona para instalaciones individuales de WP:).

Un par de meses después de que se escribió esta respuesta, se agregaron filtros al núcleo haciendo que esta respuesta quedara obsoleta.

Creo que @toscho tiene razón en el contexto de crear temas y plugins robustos para distribución masiva. Sin embargo, es importante considerar que además de miles de principiantes intentando modificar temas preconstruidos, también hay muchos desarrolladores creando temas personalizados desde cero para un único cliente destinados a funcionar en un único contexto. A veces en ese caso tienes características de administración intrínsecamente vinculadas al tema personalizado. No parece la peor idea incluirlas en el código del tema si ese es el caso.

Existe el filtro default_hidden_meta_boxes
en get_hidden_meta_boxes()
que permite modificar cuáles no se muestran, siempre y cuando el usuario no haya modificado sus preferencias en las opciones de pantalla.

Tengo comentarios sobre el código de las tres soluciones ya publicadas, pero también un comentario general
Presentan una elección subóptima: o anulan la selección del usuario en las casillas de verificación de Opciones de Pantalla; o la respetan pero hacen que tu código sea ignorado si el usuario alguna vez ha cambiado las casillas, incluso para otros meta_boxes, o antes de que tu código estuviera en WP. Parece que la elección respetuosa solo es útil si todos tus usuarios son nuevos. La mejor solución sería establecer una opción de usuario personalizada para determinar si los valores predeterminados de tu meta_box específico han sido cambiados por el usuario, y respetar eso. No, ¡no he escrito ese código! Debería ser fácil... :)
Las tres soluciones publicadas:
1. La solución de hidden_meta_boxes
de WraithKenny es la que anula la user_option. Nota que cubre todos los tipos de contenido ('post', 'page', 'link', 'attachment', y cualquier tipo de contenido personalizado). Eso está bien a menos que quieras que sea específico. Especificaste los post_type en tus llamadas a add_meta_box()
. Puedes intentar hacerlos coincidir, o simplemente dejarlo así ya que los que no coincidan serán ignorados. Si quieres saber el post_type en el filtro, puedes usar el parámetro adicional 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', y cualquier tipo de contenido personalizado
// $hidden[]= 'foo_box_id';
// /o/
// $hidden= array_diff($hidden, array('foo_box_id'));
}
return $hidden;
}
2. Como dice Rarst, default_hidden_meta_boxes
respeta la user_option. Al igual que con hidden_meta_boxes
, puedes usar el parámetro $screen para distinguir post_types.
3. La función set_user_metaboxes() de Drebabels también respeta la user_option. Nota que está codificada para la pantalla de edición de 'post'. Para manejar la pantalla de edición de 'page' y otros post_types, envuelve el código en este bucle:
function set_user_metaboxes($user_id=NULL) {
$post_types= array( 'post', 'page', 'link', 'attachment' );
// añade cualquier tipo de contenido personalizado aquí:
// $post_types[]= 'mi_tipo_de_contenido_personalizado';
foreach ($post_types as $post_type) {
// Estas son las metaclaves que necesitaremos actualizar
$meta_key= array(
'order' => "meta-box-order_$post_type",
'hidden' => "metaboxhidden_$post_type",
);
// El resto es igual al código de drebabels,
// con '*_user_meta()' cambiado a '*_user_option()'
// Para que esto pueda usarse sin engancharse a user_register
if ( ! $user_id)
$user_id = get_current_user_id();
// Establece el orden predeterminado si aún no se ha establecido
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 );
}
// Establece los ocultos predeterminados si aún no se han establecido
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 solo sitio no importa, e incluso para multi-sitio probablemente no. Mira wp-admin/includes/ajax-actions.php para saber por qué: update_user_option
tiene el parámetro global 'true'.

add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
$hidden[] = 'your_metabox'; // Agrega tu metabox al array de elementos ocultos
return $hidden;
}
También existe el filtro hidden_meta_boxes
que "desmarcaría" el metabox (haciéndolo oculto) en cada carga de página (pero no tendría que actualizar la base de datos en absoluto). Si solo quieres que esté desactivado para nuevos usuarios hasta que ellos mismos marquen la casilla, utiliza la respuesta de Rarst.
