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. Existem duas implicações aqui, uma mais séria que a outra: 1) se você estiver em desenvolvimento e atualizar seu código add_role, primeiro remova_role () 2) depois de acertar, nunca precisará executar esse código novamente.

Então, normalmente, coloco meu add_role () dentro de um gancho 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 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 para administrador ou criar uma página de plug-in, talvez em Usuários ou Ferramentas, onde essa função pode ser criada uma vez. Acho que espero que exista uma solução mais simples e elegante por aí.

Eu não imagino que exista um tipo de ação run_once, existe?

Ou a melhor prática é apenas adicionar a função e usar add_cap () várias vezes? E mesmo assim, imagino que 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 as suas melhores práticas?

Tom Auger
fonte
Impressionante! Obrigado por esta pergunta .. Basta adicionar a remove_role()função antes add_role()me ajudou.
beytarovski

Respostas:

10

As funções e os recursos do usuário são salvos no banco de dados; assim que você os tiver add_role()salvo e depois carregar, o WordPress conhecerá esse papel, assim como os papéis internos.

Agora, se você observar a função add_role()mais especificamente na linha 141 , verá que ela só salva a função e os recursos no banco de dados se o var $use_dbestiver definido como true (que ele é por padrão), para que você possa simplesmente alterá-lo antes de ligar para o seu add_role()função e a função não será salva.

experimentar:

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

Atualizar:

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

Quanto às melhores práticas, execute uma vez, se em um plug-in você deve usar register_activation_hooke para qualquer outra coisa eu uso uma função condicional simples feita sob medida:

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
}
Bainternet
fonte
Aw crap. Eu também sabia disso também desde algumas pesquisas anteriores sobre a classe WP_Roles. Você consegue pensar em alguma desvantagem em NÃO usar o banco de dados para funções? E existe uma prática recomendada do WP para fazer algo apenas uma vez?
Tom Auger #
Agradecimentos para a atualização - Eu gosto da simplicidade da solução update_option
Tom Auger
Não realmente satisfatório, mas que parece ser a melhor solução 👍
Blackbam