Какое действие я должен подключить при добавлении ролей и возможностей?

10

Я собираюсь использовать add_role () и $ role-> add_cap () для установки новой настраиваемой роли и добавления новой возможности к существующим ролям.

Мне интересно, где лучшее место для этого? Очевидно, я могу сделать это прямо внутри functions.php и покончить с этим. Но это лучшая практика? Нужно ли делать это только на admin_init? или я должен сделать это на init?

Я не совсем уверен, каковы лучшие практики использования ловушек действий инициализации, а не просто отбрасывания прямого вызова функции внутри functions.php.

спасибо за ваш вклад!

Том Оже
источник

Ответы:

10

При добавлении роли и возможностей вам нужно всего лишь запустить код один раз, так как роли и возможности сохраняются в базе данных при использовании add_roleили ->add_capфункций, так как Энди сказал, что вы можете использовать after_setup_themeдля такого рода действий, но добавьте какую-то проверку, чтобы она только запускается один раз, например, register_activation_hook или с использованием параметров:

add_action('after_setup_theme','my_add_role_function');

function my_add_role_function(){
    $roles_set = get_option('my_roles_are_set');
    if(!$roles_set){
        add_role('my_role', 'my_roleUser', array(
            'read' => true, // True allows that capability, False specifically removes it.
            'edit_posts' => true,
            'delete_posts' => true,
            'upload_files' => true 
        ));
        update_option('my_roles_are_set',true);
    }
}
Bainternet
источник
Спасибо за это. Правда ли, что add_role или add_cap ВСЕГДА используют базу данных? Когда я копался в исходном коде, казалось, что это не всегда так, то есть: в большинстве методов WP_Roles есть проверка для if ($ this-> use_db), что заставляет меня думать, что есть вероятность, что роли не всегда может храниться в БД.
Том Оджер
Кроме того, вместо того, чтобы устанавливать флаг с помощью параметров, которые не кажутся мне особенно масштабируемыми, разве нет способа просто запросить, была ли создана роль? Если это не удастся, какой вред это может принести для переопределения роли, если она уже есть? Получите ли вы двойную роль или просто проигнорируете? Посмотрев еще раз наabilities.php, я вижу это в add_role: if (isset ($ this-> role [$ role])) return; который, кажется, указывает на то, что он не будет дублировать роль, так что никакого вреда не будет.
Том Оджер
Не уверен, что вы имеете в виду, но значение по умолчанию находится $use_db = true;в классе WP_Roles. а что касается установки флага с помощью параметров, это пример, который вы можете использовать, register_activation_hookно идея в том, что ваш код будет выполняться только один раз, и таким образом вы сэкономите время простоя.
Bainternet
Я никогда не сталкивался с этим, но мне кажется, что, возможно, имеет смысл поместить смену ролей в плагин, а затем воспользоваться хуками активации / деактивации, чтобы вызвать изменения только один раз. Кто-нибудь когда-нибудь шел по этому маршруту?
mrwweb
@mrwweb, который тоже должен хорошо работать
Bainternet
7

Для плагинов, я имел успех, используя plugins_loadedдля этого. Для тем я бы использовал after_setup_theme.

Энди
источник