اگر افزونه شما به کاربران اجازه می دهد داده ها را ارسال کنند – چه در بخش مدیر و چه در قسمت عمومی – این باید قابلیت های کاربر را بررسی کند.
مهمترین مرحله در ایجاد یک لایه امنیتی کارآمد ، وجود سیستم دسترسی کاربر است. وردپرس این را به صورت نقش و قابلیت های دسترسی فراهم می کند.
به هر کاربری که وارد وردپرس می شود بسته به نقش کاربر خود به طور خودکار قابلیت های خاص کاربر اختصاص می یابد.
نقش های کاربر فقط یک روش فانتزی است که می گوید کاربر به کدام گروه تعلق دارد. هر گروه دارای مجموعه خاصی از قابلیت های از پیش تعریف شده است.
به عنوان مثال ، کاربر اصلی وب سایت شما نقش یک مدیر را دارد در حالی که سایر کاربران ممکن است نقش هایی مانند ویرایشگر یا نویسنده را داشته باشند. شما می توانید بیش از یک کاربر را به یک نقش اختصاص دهید ، یعنی ممکن است دو مدیر برای یک وب سایت وجود داشته باشد.
قابلیت های کاربر مجوزهای خاصی است که به هر کاربر یا نقش خاص خودش اختصاص می دهید.
به عنوان مثال ، سرپرست ها از قابلیت “manage_options” برخوردارند که به آنها امکان می دهد گزینه های وب سایت را مشاهده ، ویرایش و ذخیره کنند. از طرف دیگر سردبیران فاقد این قابلیت هستند که از تعامل آنها با گزینه ها جلوگیری می کند.
سپس این قابلیت ها در نقاط مختلف Admin بررسی می شود. بسته به قابلیت های اختصاص یافته به یک نقش ؛ منوها ، عملکردها و سایر جنبه های ممکن است تجربه وردپرس اضافه یا حذف شود.
هنگام ساخت یک افزونه ، مطمئن شوید که کد خود را فقط زمانی اجرا می کنید که کاربر فعلی توانایی های لازم را داشته باشد.
هرچه نقش کاربر بیشتر باشد ، کاربر قابلیت های بیشتری دارد. هر نقش کاربر نقش قبلی را در سلسله مراتب به ارث می برد. به عنوان مثال ، “مدیر” ، که بالاترین نقش کاربر در نصب یک سایت است ، نقش های زیر و قابلیت های آنها را به ارث می برد: “مشترک” ، “مشارکت کننده” ، “نویسنده” و “ویرایشگر”.
مثال زیر پیوندی را ایجاد می کند که امکان حذف سطل زباله پست ها را فراهم می کند. از آنجا که این کد قابلیت های کاربر را بررسی نمی کند ، به هر بازدید کننده سایت اجازه می دهد پست ها را حذف کند.
/** * 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 . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>'; } 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_post را دارد که فقط ویرایشگران یا بالاتر از آن برخوردار هستند:
/** * 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 . ' <a href="' . esc_url( $url ) . '">' . esc_html__( 'Delete Post', 'wporg' ) . '</a>'; } 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; } } 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' ); }