¿Cómo configurar las opciones de pantalla predeterminadas?

19

Me encantaría poder ocultar las metacuadros mediante las opciones de pantalla, en lugar de eliminarlas o restringirlas a las funciones de usuario, el objetivo es simplemente "desmarcar" la casilla de metadatos para el usuario.

Veo que esto podría ser complicado, ya que cualquier código que haría un cambio de base de datos para un usuario no podría ejecutarse cada vez que llegara a la página porque simplemente se restablecería. Pero la gente más inteligente que yo codifico el núcleo, así que quizás haya una manera. Y si lo hay, me muero por saber.

¿Alguna idea?

    
pregunta developdaly 22.04.2011 - 04:18

4 respuestas

23

¿Te estás refiriendo a los metaboxes en la pantalla de la publicación del administrador, verdad?

Para eso no necesita un complemento, simplemente coloque 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 que ha iniciado sesión actualmente, estás cambiando algunos meta_valores guardados en la tabla wp_usermeta.

Hay dos formas de usar esta función, puedes enlazar a 'user_register' o puedes enlazar a '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, menos gastos generales). Sin embargo, no funcionará para usuarios que ya existen.

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

    
respondido por el drebabels 14.06.2011 - 10:32
16

Hay un filtro default_hidden_meta_boxes en get_hidden_meta_boxes() que permite modificar lo que no se muestra mientras el usuario lo haya hecho No modificó sus preferencias en las opciones de pantalla.

    
respondido por el Rarst 24.08.2011 - 17:22
6

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'.

    
respondido por el kitchin 23.06.2013 - 13:11
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 filtro hidden_meta_boxes que "anula la selección" del metabox (haciéndolo oculto) en cada carga de la página (pero no tendría que actualizar la base de datos). Si solo quieres desactivarlo para los usuarios de nuevos hasta que marquen la casilla ellos mismos, usa la respuesta de Rarst.

    
respondido por el WraithKenny 01.03.2013 - 18:00

Lea otras preguntas en las etiquetas