ユーザーの役割と権限

効率的なセキュリティ層を作成する上で最も重要なステップは、ユーザー権限システムを整備することです。WordPressはこれをユーザーの役割と権限の形で提供しています。

WordPressにログインしているすべてのユーザーは、そのユーザーの役割に応じて特定のユーザー権限が自動的に割り当てられます。

ユーザーの役割は、ユーザーがどのグループに属しているかを示す言い回しです。各グループには特定の事前定義された権限のセットがあります。

例えば、あなたのウェブサイトの主なユーザーは管理者のユーザー役割を持ち、他のユーザーはエディターや著者のような役割を持つかもしれません。役割に割り当てられたユーザーが複数いることも可能で、つまり、ウェブサイトに2人の管理者がいるかもしれません。

ユーザー権限は、各ユーザーまたはユーザー役割に割り当てる特定の権限です。

例えば、管理者は「manage_options」権限を持っており、これによりウェブサイトのオプションを表示、編集、保存することができます。一方、エディターはこの権限を持っていないため、オプションに対して操作を行うことができません。

これらの権限は、管理画面内のさまざまなポイントでチェックされます。役割に割り当てられた権限に応じて、メニュー、機能、およびWordPressの体験の他の側面が追加または削除されることがあります。

プラグインを構築する際は、現在のユーザーが必要な権限を持っている場合にのみコードを実行するようにしてください。

階層

ユーザーの役割が高いほど、ユーザーの権限も多くなります。各ユーザーの役割は、階層内の前の役割を継承します。

例えば、「管理者」は単一サイトインストールにおける最も高いユーザー役割であり、次の役割とその権限を継承します:「購読者」、「寄稿者」、「著者」、「エディター」。

制限なし

以下の例は、フロントエンドにリンクを作成し、投稿をゴミ箱に移動する能力を与えます。このコードはユーザー権限をチェックしないため、サイトの訪問者は誰でも投稿をゴミ箱に移動できるのです!

  1. /**
  2. * Generate a Delete link based on the homepage url.
  3. *
  4. * @param string $content Existing content.
  5. *
  6. * @return string|null
  7. */
  8. function wporg_generate_delete_link( $content ) {
  9. // Run only for single post page.
  10. if ( is_single() && in_the_loop() && is_main_query() ) {
  11. // Add query arguments: action, post.
  12. $url = add_query_arg(
  13. [
  14. 'action' => 'wporg_frontend_delete',
  15. 'post' => get_the_ID(),
  16. ], home_url()
  17. );
  18. return $content . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>';
  19. }
  20. return null;
  21. }
  22. /**
  23. * Request handler
  24. */
  25. function wporg_delete_post() {
  26. if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) {
  27. // Verify we have a post id.
  28. $post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null );
  29. // Verify there is a post with such a number.
  30. $post = get_post( (int) $post_id );
  31. if ( empty( $post ) ) {
  32. return;
  33. }
  34. // Delete the post.
  35. wp_trash_post( $post_id );
  36. // Redirect to admin page.
  37. $redirect = admin_url( 'edit.php' );
  38. wp_safe_redirect( $redirect );
  39. // We are done.
  40. die;
  41. }
  42. }
  43. /**
  44. * Add the delete link to the end of the post content.
  45. */
  46. add_filter( 'the_content', 'wporg_generate_delete_link' );
  47. /**
  48. * Register our request handler with the init hook.
  49. */
  50. add_action( 'init', 'wporg_delete_post' );

特定の権限に制限

上記の例では、サイトの訪問者が「削除」リンクをクリックして投稿をゴミ箱に移動できるようになっています。しかし、私たちはエディター以上のユーザーだけが「削除」リンクをクリックできるようにしたいのです。

これを実現するために、現在のユーザーがedit_others_postsの権限を持っているかどうかを確認します。この権限はエディター以上のユーザーだけが持つものです:

  1. /**
  2. * Generate a Delete link based on the homepage url.
  3. *
  4. * @param string $content Existing content.
  5. *
  6. * @return string|null
  7. */
  8. function wporg_generate_delete_link( $content ) {
  9. // Run only for single post page.
  10. if ( is_single() && in_the_loop() && is_main_query() ) {
  11. // Add query arguments: action, post.
  12. $url = add_query_arg(
  13. [
  14. 'action' => 'wporg_frontend_delete',
  15. 'post' => get_the_ID(),
  16. ], home_url()
  17. );
  18. return $content . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>';
  19. }
  20. return null;
  21. }
  22. /**
  23. * Request handler
  24. */
  25. function wporg_delete_post() {
  26. if ( isset( $_GET['action'] ) && 'wporg_frontend_delete' === $_GET['action'] ) {
  27. // Verify we have a post id.
  28. $post_id = ( isset( $_GET['post'] ) ) ? ( $_GET['post'] ) : ( null );
  29. // Verify there is a post with such a number.
  30. $post = get_post( (int) $post_id );
  31. if ( empty( $post ) ) {
  32. return;
  33. }
  34. // Delete the post.
  35. wp_trash_post( $post_id );
  36. // Redirect to admin page.
  37. $redirect = admin_url( 'edit.php' );
  38. wp_safe_redirect( $redirect );
  39. // We are done.
  40. die;
  41. }
  42. }
  43. /**
  44. * Add delete post ability
  45. */
  46. add_action('plugins_loaded', 'wporg_add_delete_post_ability');
  47. function wporg_add_delete_post_ability() {
  48. if ( current_user_can( 'edit_others_posts' ) ) {
  49. /**
  50. * Add the delete link to the end of the post content.
  51. */
  52. add_filter( 'the_content', 'wporg_generate_delete_link' );
  53. /**
  54. * Register our request handler with the init hook.
  55. */
  56. add_action( 'init', 'wporg_delete_post' );
  57. }
  58. }