Si su plugin permite que los usuarios envíen datos -ya sea en el lado de los administradores o en el público- debería comprobar las capacidades de los usuarios.
Roles y capacidades de los usuarios #Roles y capacidades de los usuarios
El paso más importante para crear una capa de seguridad eficiente es tener un sistema de permisos de los usuarios. WordPress lo proporciona en forma de Roles y Capacidades de Usuario.
A cada usuario que inicia sesión en WordPress se le asignan automáticamente capacidades de usuario específicas en función de su rol de usuario.
Los roles de usuario son sólo una forma elegante de decir a qué grupo pertenece el usuario. Cada grupo tiene un conjunto específico de capacidades predefinidas.
Por ejemplo, el usuario principal de su sitio web tendrá el rol de Usuario de un Administrador mientras que otros usuarios podrían tener roles como Editor o Autor. Usted podría tener más de un usuario asignado a un rol, es decir, podría haber dos Administradores para un sitio web.
Las capacidades de los usuarios son los permisos específicos que usted asigna a cada usuario o a un rol de Usuario.
Por ejemplo, los Administradores tienen la capacidad «manage_options» que les permite ver, editar y guardar opciones para el sitio web. Los editores, por otro lado, carecen de esta capacidad, lo que les impedirá interactuar con las opciones.
Estas capacidades se comprueban en varios puntos dentro del Admin. Dependiendo de las capacidades asignadas a un rol; los menús, la funcionalidad y otros aspectos de la experiencia de WordPress pueden ser añadidos o eliminados.
Cuando construya un plugin, asegúrese de ejecutar su código sólo cuando el usuario actual tenga las capacidades necesarias.
Herarquía #Hierarchy
Cuanto más alto sea el rol de usuario, más capacidades tendrá el usuario. Cada rol de usuario hereda los roles anteriores en la jerarquía.
Por ejemplo, el «Administrador», que es el rol de usuario más alto en una instalación de un sitio, hereda los siguientes roles y sus capacidades: «Suscriptor», «Colaborador», «Autor» y «Editor».
Top
Ejemplos #Ejemplos
Top
Sin Restricciones #Sin Restricciones
El ejemplo que se muestra a continuación crea un enlace en el frontend que da la posibilidad de borrar publicaciones. Debido a que este código no comprueba las capacidades del usuario, ¡permite que cualquier visitante del sitio pueda tirar los posts a la basura!
/** * 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(, 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 ) && 'wporg_frontend_delete' === $_GET ) {// Verify we have a post id.$post_id = ( isset( $_GET ) ) ? ( $_GET ) : ( 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' );
Expandir código fuente completoColapsar código fuente completo
Top
Restringido a una capacidad específica #Restringido a una capacidad específica
El ejemplo de arriba permite a cualquier visitante del sitio hacer clic en el enlace «Eliminar» y tirar a la basura el post. Sin embargo, queremos que sólo los Editores y superiores puedan hacer clic en el enlace «Eliminar».
Para conseguirlo, comprobaremos que el usuario actual tiene la capacidad edit_others_posts
, que sólo tendrían los Editores o superiores:
/** * 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(, 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 ) && 'wporg_frontend_delete' === $_GET ) {// Verify we have a post id.$post_id = ( isset( $_GET ) ) ? ( $_GET ) : ( 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' );}
Expandir código fuente completoColapsar código fuente completo