add_role () se ejecuta 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 remove_role () 2) una vez que lo tiene correcto, 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 como estoy en desarrollo, también agregué un remove_role () antes de mi add_role, así puedo estar seguro de que si modifico mi lista de mayúsculas, surtirá efecto.

Pero claramente esto se está ejecutando cada vez que se accede a una página del blog. De acuerdo, podría ponerlo en una acción solo para administradores, 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.

No me imagino que haya un tipo de acción run_once ¿existe?

¿O es la mejor práctica simplemente agregar el rol y luego usar add_cap () varias 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 db. ¿Cuáles son tus mejores prácticas?

Tom Auger
fuente
¡Increíble! Gracias por esta pregunta ... Solo agregar la remove_role()función antes add_role()me ayudó.
beytarovski

Respuestas:

10

Las funciones y capacidades de los usuarios se guardan en la base de datos, por lo que una vez que las haya usado, las add_role()guardará y luego WordPress sabrá esa función al igual que las funciones integradas.

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_dbse establece en verdadero (que él es por defecto) para que pueda simplemente cambiarlo antes de llamar a su add_role()función y el rol no se guardará.

tratar:

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

Actualizar:

Si está en un entorno de prueba / desarrollo, no veo inconvenientes, pero si está en un entorno en vivo, ahorrará el tiempo necesario para crear ese rol en cada carga.

En cuanto a las mejores prácticas, ejecute una vez, si en un complemento debe usar register_activation_hooky para cualquier otra cosa, uso una función condicional simple y personalizada:

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
fuente
Aw mierda. Incluso sabía sobre eso también por un enraizamiento anterior sobre la clase WP_Roles. ¿Puedes pensar en alguna desventaja de NO usar la base de datos para roles? ¿Y hay una mejor práctica de WP para hacer algo solo una vez?
Tom Auger
Gracias por la actualización. Me gusta la simplicidad de la solución update_option
Tom Auger
No es realmente satisfactorio, pero parece ser la mejor solución 👍
Blackbam
Esta función run_onceaumenta demasiado las operaciones de la base de datos de lectura / escritura en cada carga de página. Por favor no uses esto.
Mayank Dudakiya