Como definir opções de tela padrão?

19

Adoraria poder ocultar caixas meta usando opções de tela, em vez de removê-las ou restringi-las a funções do usuário. O objetivo é apenas "desmarcar" a caixa meta do usuário.

Eu vejo como isso seria complicado, já que qualquer código que fizesse uma alteração de banco de dados para um usuário não poderia ser executado toda vez que ele acessasse a página, porque seria redefinido. Mas pessoas mais inteligentes do que eu codifico o núcleo, então talvez haja um jeito. E se houver, estou morrendo de vontade de saber.

Alguma idéia?

    
por developdaly 22.04.2011 / 04:18

4 respostas

23

Você está se referindo aos metaboxes na tela de postagem do admin, certo?

Para isso você não precisa de um plugin, apenas coloque o seguinte em seu arquivo 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 );
    }
}

Basicamente, o que está acontecendo é que, para o usuário atualmente logado, você está alterando alguns meta_values salvos na tabela wp_usermeta.

Existem duas maneiras de usar esta função, você pode conectar-se a 'user_register' ou conectar-se a 'admin_init'.

A vantagem de usar 'user_register' é que esta função só será disparada quando um novo usuário for registrado (portanto, menor sobrecarga). No entanto, não funcionará para usuários que já existem.

Se você deseja que ele funcione para usuários que já existem, conecte-se a 'admin_init'. A desvantagem, é claro, é que agora essa função é acionada toda vez que um usuário acessa a página de administração.

    
por drebabels 14.06.2011 / 10:32
16

default_hidden_meta_boxes filtro em get_hidden_meta_boxes() que permite modificar os que não são mostrados enquanto o usuário não tiver modificou suas preferências nas opções de tela.

    
por Rarst 24.08.2011 / 17:22
6

Eu tenho comentários de código sobre três soluções já postadas, mas também um comentário geral

Eles apresentam uma escolha abaixo do ideal: ou sobrescrevem a opção de caixa de seleção Opções de tela do usuário; ou respeite-o, mas ignore seu código se o usuário já tiver alterado as caixas de seleção, mesmo para outras meta_boxes, ou antes de seu código estar no WP. Parece que a escolha respeitosa só é útil se todos os seus usuários forem novos. A melhor solução seria definir uma opção de usuário personalizada para determinar se seus padrões específicos de meta_box foram alterados pelo usuário e respeitá-lo. Não, eu não escrevi esse código! Deve ser fácil ...:)

As três soluções publicadas:

1. A solução hidden_meta_boxes do WraithKenny é a que substitui a user_option. Observe que abrange todos os tipos de postagens ('post', 'page', 'link', 'attachment' e qualquer tipo de post personalizado). Tudo bem, a menos que você queira que seja específico. Você especificou o post_type nas suas add_meta_box() chamadas. Você pode tentar combiná-los, ou apenas usá-los, pois os que não corresponderem serão ignorados. Se você quiser saber o post_type no filtro, use o 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 diz Rarst, default_hidden_meta_boxes respeita a user_option. Assim como com hidden_meta_boxes , você pode usar o parâmetro $ screen para distinguir post_types.

3. A função set_user_metaboxes () do Drebabels também respeita a user_option. Observe que ele é codificado para a tela de edição 'post'. Para lidar com a tela de edição 'page' e outros post_types, envolva o código neste 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 );
       }
    }
 }

Sim, get_user_meta deve ser get_user_option . Para um único site, não importa, e mesmo para o multi-site, provavelmente não. Veja wp-admin / includes / ajax-actions.php para o porquê: update_user_option tem o parâmetro global 'true'.

    
por 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;
}

Há também hidden_meta_boxes filter que "desmarca" o metabox (tornando-o oculto) em cada carregamento de página (mas não precisa atualizar o banco de dados). Se você quiser que os usuários novos apenas façam a caixa, use a resposta da Rarst.

    
por WraithKenny 01.03.2013 / 18:00

Tags