add_role () запустити лише один раз?


11

Я з подивом виявив, що add_role () модифікує базу даних і не працює, якщо роль вже існує. Тут є два наслідки, один перший більш серйозний, ніж інший: 1) якщо ви розробляєте та оновлюєте свій код add_role, спочатку ви повинні видалити_роле () 2), як тільки ви це зробите правильно, вам ніколи не доведеться запускати цей код знову.

Тому, як правило, я кладу свою add_role () всередину гачка дій wp_loaded. А оскільки я перебуваю в розробці, я також додав remove_role () перед моїм add_role, так що я можу бути впевнений, що якщо я зміню мій список обмежень, він дійсно набуде чинності.

Але очевидно, що це зараз запускається кожного разу, коли доступ до сторінки блогу. Гаразд, я міг би поставити його в дію лише для адміністратора, або я міг би створити сторінку плагіна, можливо, в розділі Користувачі або Інструменти, де цю роль можна створити один раз. Напевно, я сподіваюся, що там є більш просте, елегантне рішення.

Я не уявляю, що існує така операція run_once?

Або найкраща практика просто додати роль, а потім використати add_cap () купу разів? І навіть тоді я думаю, що add_cap отримує доступ до db.

Подумайте з точки зору найкращого способу зменшити доступ до зайвих db. Які ваші найкращі практики?


Дивовижно! Дякую за це запитання .. Просто додавання remove_role()функції, перш ніж add_role()мені допомогло.
бейтаровські

Відповіді:


10

Ролі та можливості користувача зберігаються в базі даних, тож як тільки ви скористаєтеся add_role()збереженим, а потім наступне завантаження WordPress буде знати цю роль так само, як і вбудовані ролі.

Тепер якщо ви подивитеся на функцію add_role()конкретніше у рядку 141, ви побачите, що вона зберігає лише роль та можливості в базі даних, якщо для параметра var $use_dbвстановлено значення true (яке він є за замовчуванням), тож ви можете просто змінити його, перш ніж зателефонувати на add_role()функція, і роль не буде збережена.

спробуйте:

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

Оновлення:

Якщо його в тестовому / розробному середовищі, то я не бачу недоліків, але якщо ви перебуваєте в реальному житті, то ви економите час, необхідний для створення цього на роль кожного навантаження.

Що стосується найкращої практики, запустіть один раз, якщо у плагіні ви повинні використовувати, register_activation_hookа для будь-якої іншої речі я використовую просту на замовлення умовну функцію:

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
}

Ау дерьмо. Я навіть про це теж знав з попередніх вкорінень про клас WP_Roles. Чи можете ви придумати якийсь мінус, щоб НЕ використовувати базу даних для ролей? І чи є найкраща практика WP для того, щоб робити щось лише один раз?
Том Оже

Дякую за оновлення - мені подобається простота рішення update_option
Tom Auger

Не дуже задоволення, але, здається, це найкраще рішення the
Blackbam

Ця функція run_onceзбільшує занадто багато операцій з базою даних для читання / запису на кожному завантаженні сторінки. Будь ласка, не використовуйте це.
Mayank Dudakiya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.