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

20

Eu adoraria poder ocultar as caixas meta usando as opções da tela, em vez de removê-las ou restringi-las às funções do usuário, o objetivo é apenas "desmarcar" a caixa meta para o usuário.

Vejo como isso seria complicado, pois qualquer código que faria uma alteração no banco de dados de um usuário não teria permissão para executar toda vez que ele atingisse a página, porque ela seria redefinida. Mas pessoas mais inteligentes do que eu codifico o núcleo, então talvez haja uma maneira. E se houver, estou morrendo de vontade de saber.

Alguma ideia?

developdaly
fonte
Por nome de usuário, você teria que criar seu próprio tipo de plug-in que preenche todos os usuários com uma caixa de seleção ao lado do nome e se conecta a um filtro para mostrar meta boxes ou várias meta boxes.
quer
Por padrão, você quer dizer que eles devem ser aplicados uma vez quando um novo usuário é criado, correto?
Rarst

Respostas:

25

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

Para isso, você não precisa de um plug-in, basta soltar o seguinte no 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 conectado no momento, você está alterando alguns meta_values ​​salvos na tabela wp_usermeta.

Existem duas maneiras de usar essa função: você pode conectar-se ao 'user_register' ou conectar-se ao 'admin_init'.

A vantagem de usar 'user_register' é que essa função será acionada apenas quando um novo usuário for registrado (portanto, menor sobrecarga). No entanto, ele 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.

drebabels
fonte
15
Este não é um trabalho temático e não pertence a um functions.php.
fuxia
6
@toscho Eu realmente não concordo com isso. Naturalmente, você pode colocar isso em um plug-in, mas se, por exemplo, você está criando um tema para si ou para um cliente que não precisa ver determinadas caixas, por que adicionar a sobrecarga de gerenciamento adicional que inclui a inclusão em um plug-in? Ao soltá-lo no arquivo functions.php, você garante que a experiência do tema seja consistente sem ter que garantir que um plug-in esteja instalado e ativado.
drebabels
10
Não sobrecarga usando um plug-in. Esse é um mito que tem que morrer instantaneamente. Além disso, sua restrição de uso não fazia parte da questão. Sua resposta é lida por milhares de iniciantes. Você os ajudará com o melhor código que puder escrever, não com algo que funcione em algumas situações específicas. :)
fuxia
+1 Boa resposta - às vezes você deseja defini-las explicitamente. É uma boa base e, é claro, esse código pode ser modificado facilmente para ser chamado quando necessário (adicionando um novo usuário, por exemplo), para que você realmente esteja definindo as opções "padrão" e não forçando as opções nos usuários que as alteram. Eu adicionarei esse código ao functions.phparquivo do meu tema porque as opções padrão são para um projeto específico, que é representado / abrigado pelo tema que estou desenvolvendo.
Cwd
11
Alguns meses após a redação desta resposta, os filtros foram adicionados ao núcleo, tornando essa resposta obsoleta.
precisa saber é o seguinte
16

Existe um default_hidden_meta_boxesfiltro get_hidden_meta_boxes()que permite modificar o que não é mostrado, desde que o usuário não tenha modificado suas preferências nas opções da tela.

Rarst
fonte
7

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

Eles apresentam uma opção abaixo do ideal: substitua a opção da caixa de seleção Opções de tela do usuário; ou respeite-o, mas ignore seu código se o usuário alterar 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 da meta_box foram alterados pelo usuário e respeitar isso. Não, eu não escrevi esse código! Deve ser fácil ... :)

As três soluções postadas:

1. A hidden_meta_boxessolução do WraithKenny é a que substitui a opção do usuário. Observe que ele abrange todos os tipos de postagem ('postagem', 'página', 'link', 'anexo' e qualquer tipo de postagem personalizada). Tudo bem, a menos que você queira que seja específico. Você especificou o post_type em suas add_meta_box()chamadas. Você pode tentar igualá-los ou apenas alterá-lo, pois os que não corresponderem serão ignorados. Se você deseja conhecer o post_type no filtro, pode usar o screenparâmetro 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 Rarst diz, default_hidden_meta_boxesrespeita a opção do usuário. Assim como hidden_meta_boxesvocê pode usar o parâmetro $ screen para distinguir post_types.

3. A função set_user_metaboxes () do Drebabels também respeita a opção do usuário. Observe que está codificado para a tela de edição 'pós'. Para lidar com a tela de edição da 'página' 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_metadeveria ser get_user_option. Para sites únicos, isso não importa, e mesmo para sites múltiplos, provavelmente não. Veja wp-admin / includes / ajax-actions.php para saber por que: update_user_optionpossui o parâmetro global 'true'.

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

Também existe um hidden_meta_boxesfiltro que "desmarca" o metabox (tornando-o oculto) a cada carregamento da página (mas não precisa atualizar o banco de dados). Se você apenas deseja desativá -lo para novos usuários até que eles marquem a caixa, use a resposta da Rarst.

WraithKenny
fonte