add_role () é executado apenas uma vez?

11

Fiquei surpreso ao descobrir que add_role () modifica o banco de dados e falha se a função já existir. Há duas implicações aqui, uma primeira mais séria que a outra: 1) se você está em desenvolvimento e atualiza seu código add_role, você deve primeiro remover_role () 2) uma vez que você acertou, você nunca deveria ter que rodar esse código novamente.

Então, eu tenho colocado meu add_role () dentro de um hook de ação wp_loaded. E como estou em desenvolvimento, também adicionei um remove_role () antes do meu add_role para ter certeza de que, se eu modificar minha lista de limites, ele realmente entrará em vigor.

Mas claramente isso agora está sendo executado toda vez que uma página do blog está sendo acessada. Ok, eu poderia colocá-lo em uma ação somente de administrador, ou eu poderia criar uma página de plugin, talvez em Usuários ou Ferramentas, onde esta função pode ser criada uma vez. Acho que espero que haja uma solução mais simples e elegante por aí.

Eu não imagino que haja uma ação tipo run_once?

Ou a melhor prática é apenas adicionar a função e usar add_cap () várias vezes? E mesmo assim eu imagino que o add_cap está acessando o banco de dados.

Apenas pensando em termos da melhor maneira de reduzir o acesso desnecessário ao banco de dados. Quais são suas melhores práticas?

    
por Tom Auger 11.08.2011 / 15:30

1 resposta

8

As funções e os recursos do usuário são salvos no banco de dados. Assim, depois de usar o add_role() , ele é salvo e, em seguida, o WordPress passa a conhecer esse papel, assim como as funções integradas.

Agora, se você olhar para a função add_role() mais especificamente na linha 141 você verá que apenas salva a função e os recursos no banco de dados se o var $use_db estiver definido como true (que ele é por padrão), portanto você pode simplesmente alterá-lo antes de chamar seu add_role() function e o papel não será salvo.

tente:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

Atualização:

Se estiver em um ambiente de teste / desenvolvimento, não vejo desvantagem, mas se você estiver em um ambiente ao vivo, economizará o tempo necessário para criar essa função em cada carga.

Quanto às melhores práticas, execute uma vez, se em um plugin você deve usar register_activation_hook e para qualquer outra coisa eu uso uma função condicional customizada simples:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}
    
por Bainternet 11.08.2011 / 19:20