¿Cómo configurar las opciones de pantalla predeterminadas?

20

Me encantaría poder ocultar meta cuadros utilizando las opciones de pantalla, en lugar de eliminarlos o restringirlos a roles de usuario, el objetivo es simplemente "desmarcar" el meta cuadro para el usuario.

Veo cómo esto sería complicado, ya que cualquier código que haga un cambio de base de datos para un usuario no podrá ejecutarse cada vez que acceda a la página porque simplemente se restablecerá. Pero las personas más inteligentes que yo codifico el núcleo, por lo que tal vez hay una manera. Y si lo hay, me muero por saberlo.

¿Algunas ideas?

desarrollado
fuente
Por nombre de usuario, debería crear su propio complemento que llene a todos los usuarios con una casilla de verificación junto a su nombre y se enganche en un filtro para mostrar meta cuadros, o múltiples meta cuadros.
Wyck
Por defecto, quiere decir que deben aplicarse una vez cuando se crea un nuevo usuario, ¿correcto?
Rarst

Respuestas:

25

Te refieres a los metaboxes en la pantalla de publicación del administrador, ¿verdad?

Para eso no necesita un complemento, simplemente suelte lo siguiente en su archivo functions.php.

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // 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_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 );
    }

    // Set the default hiddens if it has not been set yet
    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á cambiando algunos meta_valores guardados en la tabla wp_usermeta.

Hay dos formas de usar esta función: puede engancharse en 'user_register' o puede engancharse en 'admin_init'.

La ventaja de usar 'user_register' es que esta función solo se activará cuando se registre un nuevo usuario (por lo tanto, una sobrecarga menor). Sin embargo, no funcionará para los usuarios que ya existen.

Si desea que funcione para usuarios que ya existen, conéctese a 'admin_init'. La desventaja, por supuesto, es que ahora esta función se activa cada vez que un usuario accede a la página de administración.

Drebabels
fuente
15
Este no es un trabajo temático y no pertenece a un functions.php.
fuxia
66
@toscho Realmente no estoy de acuerdo con eso. Naturalmente, podría poner esto en un complemento, pero si, por ejemplo, está creando un tema para usted o quizás para un cliente que no necesita ver ciertos cuadros, ¿por qué agregar la sobrecarga de administración adicional que viene con incluir esto en un complemento? Al colocarlo en el archivo functions.php, se asegura de que la experiencia del tema sea consistente sin tener que asegurarse de que un complemento esté instalado y activado.
drebabels
10
No hay gastos generales mediante el uso de un complemento. Ese es un mito que tiene que morir al instante. Además, su restricción de uso no era parte de la pregunta. Tu respuesta es leída por miles de principiantes. Los ayudarás con el mejor código que puedas escribir, no con algo que funcione en algunas situaciones específicas. :)
fuxia
+1 Buena respuesta: a veces desea establecerlos explícitamente. Es una buena base y, por supuesto, este código se puede modificar fácilmente para que se llame cuando sea necesario (agregar un nuevo usuario, por ejemplo), de modo que realmente esté configurando las opciones "predeterminadas" y no forzando las opciones a los usuarios que las cambian. Agregaré este código al functions.phparchivo de mi tema porque las opciones predeterminadas son para un proyecto específico, que está representado / alojado por el tema que estoy desarrollando.
cwd
1
Un par de meses después de que se escribió esta Respuesta, los filtros se agregaron al núcleo haciendo que esta respuesta sea obsoleta.
WraithKenny
16

Hay un default_hidden_meta_boxesfiltro get_hidden_meta_boxes()que permite modificar que no se muestran siempre que el usuario no haya modificado sus preferencias en las opciones de pantalla.

Rarst
fuente
7

Tengo comentarios de código sobre tres soluciones ya publicadas, pero también un comentario general

Presentan una opción subóptima: anular la opción de casilla de verificación Opciones de pantalla del usuario; o respetarlo pero ignorar su código si el usuario alguna vez ha cambiado las casillas de verificación, incluso para otros meta_boxes, o antes de que su código estuviera en WP. Parece que la opción respetuosa solo es útil si todos sus usuarios son nuevos. La mejor solución sería establecer una opción de usuario personalizada para determinar si el usuario ha cambiado sus valores predeterminados específicos de meta_box, y respetar eso. ¡No, no he escrito ese código! Debería ser fácil ... :)

Las tres soluciones publicadas:

1. La hidden_meta_boxessolución de WraithKenny es la que anula la opción user_option. Tenga en cuenta que cubre todos los tipos de publicación ('publicación', 'página', 'enlace', 'adjunto' y cualquier tipo de publicación personalizada). Eso está bien a menos que quieras que sea específico. Especificó los post_type en sus add_meta_box()llamadas. Puede intentar hacer coincidir esos, o simplemente aletearlo, ya que los que no coincidan serán ignorados. Si desea conocer el post_type en el filtro, puede usar el screenparámetro adicional :

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_boxesrespeta 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 de usuario. Tenga en cuenta que está codificado para la pantalla de edición de 'publicación'. 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 );
       }
    }
 }

Si, get_user_metadeberia ser get_user_option. Para un solo sitio no importa, e incluso para un sitio múltiple probablemente no. Vea wp-admin / includes / ajax-actions.php para saber por qué: update_user_optiontiene el parámetro global 'verdadero'.

Kitchin
fuente
1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

También hay un hidden_meta_boxesfiltro que "desmarcaría" el metabox (ocultándolo) en cada carga de la página (pero no tendría que actualizar la base de datos). Si solo desea desactivarlo para los nuevos usuarios hasta que ellos mismos marquen la casilla, use la respuesta de Rarst.

WraithKenny
fuente