# 用户角色和能力 # 用户角色和能力 如果您的插件允许用户提交数据(无论是在管理员端还是公共端),它应该检查用户功能。 #### 用户角色和能力 创建高效安全层的最重要步骤是建立用户权限系统。[WordPress 以用户角色和功能](https://developer.wordpress.org/plugins/users/roles-and-capabilities/)的形式提供这一点。 每个登录 WordPress 的用户都会根据其用户角色自动分配特定的用户功能。 **用户角色**只是一种表示用户属于哪个组的奇特方式。每个组都有一组特定的预定义功能。 例如,网站的主要用户将具有管理员的用户角色,而其他用户可能具有编辑者或作者等角色。您可以为一个角色分配多个用户,即一个网站可能有两个管理员。 **用户能力**是您分配给每个用户或用户角色的特定权限。 例如,管理员具有“manage\_options”功能,允许他们查看、编辑和保存网站的选项。另一方面,编辑者缺乏这种能力,这将阻止他们与选项进行交互。 然后在管理中的各个点检查这些功能。取决于分配给角色的能力;菜单、功能和 WordPress 体验的其他方面可能会被添加或删除。 **当您构建插件时,请确保仅在当前用户具有必要的功能时才运行您的代码。** #### 等级制度 用户角色越高,用户拥有的能力越多。每个用户角色都会继承层次结构中先前的角色。 例如,“管理员”是单个站点安装中的最高用户角色,它继承以下角色及其功能:“订阅者”、“贡献者”、“作者”和“编辑者”。 #### 例子 #### 无限制 下面的示例在前端创建一个链接,该链接提供了垃圾帖子的功能。因为此代码不检查用户能力,所以**它允许该网站的任何访问者删除帖子!**
```php /** * Generate a Delete link based on the homepage url. * * @param string $content Existing content. * * @return string|null */ function wporg_generate_delete_link( $content ) { // Run only for single post page. if ( is_single() && in_the_loop() && is_main_query() ) { // Add query arguments: action, post. $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' ' . esc_html__( 'Delete Post', 'wporg' ) . ''; } return null; } /** * Request handler */ function wporg_delete_post() { if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) { // Verify we have a post id. $post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null ); // Verify there is a post with such a number. $post = get_post( (int) $post_id ); if ( empty( $post ) ) { return; } // Delete the post. wp_trash_post( $post_id ); // Redirect to admin page. $redirect = admin_url( 'edit.php' ); wp_safe_redirect( $redirect ); // We are done. die; } } /** * Add the delete link to the end of the post content. */ add_filter( 'the_content', 'wporg_generate_delete_link' ); /** * Register our request handler with the init hook. */ add_action( 'init', 'wporg_delete_post' ); ``` 受限于特定能力 上面的示例允许该网站的任何访问者单击“删除”链接并删除该帖子。但是,我们只希望编辑及以上级别能够单击“删除”链接。 为了实现这一点,我们将检查当前用户是否具有该能力`edit_others_posts`,只有编辑者或以上人员才具有:
```php /** * Generate a Delete link based on the homepage url. * * @param string $content Existing content. * * @return string|null */ function wporg_generate_delete_link( $content ) { // Run only for single post page. if ( is_single() && in_the_loop() && is_main_query() ) { // Add query arguments: action, post. $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' ' . esc_html__( 'Delete Post', 'wporg' ) . ''; } return null; } /** * Request handler */ function wporg_delete_post() { if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) { // Verify we have a post id. $post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null ); // Verify there is a post with such a number. $post = get_post( (int) $post_id ); if ( empty( $post ) ) { return; } // Delete the post. wp_trash_post( $post_id ); // Redirect to admin page. $redirect = admin_url( 'edit.php' ); wp_safe_redirect( $redirect ); // We are done. die; } } /** * Add delete post ability */ add_action('plugins_loaded', 'wporg_add_delete_post_ability'); function wporg_add_delete_post_ability() { if ( current_user_can( 'edit_others_posts' ) ) { /** * Add the delete link to the end of the post content. */ add_filter( 'the_content', 'wporg_generate_delete_link' ); /** * Register our request handler with the init hook. */ add_action( 'init', 'wporg_delete_post' ); } } ```