add_role () ejecutado solo una vez?

11

Me sorprendió descubrir que add_role () modifica la base de datos y falla si el rol ya existe. Aquí hay dos implicaciones, una primera más seria que la otra: 1) si está en desarrollo y actualiza su código add_role, primero debe eliminar_role () 2) una vez que lo tenga bien, nunca debería tener que ejecutar ese código de nuevo.

Por lo general, he estado poniendo mi add_role () dentro de un gancho de acción wp_loaded. Y ya que estoy en desarrollo, también he agregado remove_role () antes de add_role, por lo que puedo estar seguro de que si modifico mi lista de mayúsculas, tendrá efecto.

Pero claramente esto se está ejecutando cada vez que se accede a una página del blog. Bien, podría ponerlo en una acción solo de administrador, o podría crear una página de complemento tal vez en Usuarios o Herramientas donde este rol se puede crear una vez. Supongo que espero que haya una solución más simple y elegante por ahí.

No creo que haya un tipo de acción run_once, ¿verdad?

¿O es la mejor práctica simplemente agregar el rol y luego usar add_cap () un montón de veces? E incluso entonces imagino que add_cap está accediendo a la base de datos.

Solo pensando en términos de la mejor manera de reducir el acceso innecesario a la base de datos. ¿Cuáles son sus mejores prácticas?

    
pregunta Tom Auger 11.08.2011 - 15:30

1 respuesta

8

Las funciones y capacidades del usuario se guardan en la base de datos, por lo que, una vez que haya usado add_role() , se guardará y, a continuación, WordPress reconocerá esa función igual que las funciones incorporadas.

Ahora, si observa la función add_role() más específicamente en la línea 141 verá que solo guarda el rol y las capacidades en la base de datos si var $use_db se establece en verdadero (que es el predeterminado), por lo que simplemente puede cambiarlo antes de llamar a su% La función add_role() y la función no se guardarán.

prueba:

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

Actualización:

Si está en un entorno de prueba / desarrollo, no veo ningún inconveniente, pero si estás en un entorno real, ahorras el tiempo que lleva crear ese rol en cada carga.

En cuanto a la práctica recomendada, ejecútela una vez, si en un complemento debe usar register_activation_hook y para cualquier otra cosa, yo uso una función condicional simple hecha a 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
}
    
respondido por el Bainternet 11.08.2011 - 19:20

Lea otras preguntas en las etiquetas