添加角色和功能时应该采取什么动作?


10

我将使用add_role()和$ role-> add_cap()设置新的自定义角色并将新功能附加到现有角色。

我想知道最好的地方在哪里?显然,我可以直接在functions.php中完成它并完成它。但这是最佳做法吗?我是否只需要在admin_init上执行此操作?还是应该在init上执行?

我不完全确定使用init动作挂钩有什么最佳实践,而不仅仅是将直接函数调用放在functions.php中。

感谢您的输入!

Answers:


10

添加角色和功能时,您只需要运行一次代码,因为在使用add_role->add_cap功能时,角色和功能已保存到数据库中,就像Andy所说的那样,您可以使用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);
    }
}

谢谢你 是add_role还是add_cap总是利用数据库?当我研究源代码时,似乎并非总是如此-即:在WP_Roles的大多数方法中,都会检查是否($ this-> use_db),这使我认为角色可能存在可能并不总是存储在数据库中。
Tom Auger

而且,除了使用选项设置标志(这不会给我带来特别好的可伸缩性)之外,还有没有办法简单地查询角色是否已创建?如果失败,重新定义角色(如果已经存在)会对您造成什么伤害?您会获得重复的角色还是会忽略?再次查看capabilities.php,我在add_role下看到了这一点:if(isset($ this-> roles [$ role]))return; 这似乎表明它不会重复角色,因此不会造成伤害。
Tom Auger

不确定您的意思,但默认值$use_db = true;在WP_Roles类中。至于使用options设置标志,这是一个示例,您可以使用,register_activation_hook但想法是您的代码只能运行一次,从而节省了执行时间。
Bainternet 2011年

我从没看过这一点,但是让我感到惊讶的是,将角色更改放入插件中,然后利用激活/停用钩子仅触发一次更改可能是有意义的。有人走过那条路线吗?
mrwweb

@mrwweb应该也可以正常工作
Bainternet

7

对于插件,我已经成功地plugins_loaded用于此。对于主题,我将使用after_setup_theme

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.