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?


¡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
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.