Se o seu plugin permite aos utilizadores submeterem dados – seja na Administração ou no lado Público – deve verificar as Capacidades do Utilizador.
Capacidades e Funções do Utilizador #Capacidades e Funções do Utilizador
O passo mais importante na criação de uma camada de segurança eficiente é ter um sistema de permissões do utilizador em vigor. O WordPress fornece isto na forma de Funções e Capacidades do Utilizador.
A cada utilizador ligado ao WordPress são automaticamente atribuídas capacidades específicas do Utilizador, dependendo da sua função.
As funções do Utilizador é apenas uma forma elegante de dizer a que grupo o utilizador pertence. Cada grupo tem um conjunto específico de capacidades pré-definidas.
Por exemplo, o utilizador principal do seu sítio web terá o papel de Administrador enquanto outros utilizadores poderão ter papéis como Editor ou Autor. Poderá ter mais do que um utilizador atribuído a uma função, ou seja, poderá haver dois Administradores para um sítio web.
As capacidades do utilizador são as permissões específicas que atribui a cada utilizador ou a uma função de Utilizador.
Por exemplo, os Administradores têm a capacidade de “gerir_opções” que lhes permite visualizar, editar e guardar opções para o sítio web. Os editores, por outro lado, carecem desta capacidade que os impedirá de interagir com as opções.
Estas capacidades são então verificadas em vários pontos dentro da Administração. Dependendo das capacidades atribuídas a uma função; menus, funcionalidade, e outros aspectos da experiência do WordPress podem ser adicionados ou removidos.
Como constrói um plugin, certifique-se de executar o seu código apenas quando o utilizador actual tiver as capacidades necessárias.
Hierarquia #Hierarquia
Quanto maior for a função do utilizador, mais capacidades o utilizador tem. Cada papel de utilizador herda os papéis anteriores na hierarquia.
Por exemplo, o “Administrador”, que é o papel de utilizador mais elevado numa instalação de um único sítio, herda os seguintes papéis e as suas capacidades: “Assinante”, “Contribuinte”, “Autor” e “Editor”.
Top
Exemplos #Exemplos
Top
Sem restrições #Sem restrições
O exemplo abaixo cria um link no front-end que dá a capacidade de lixar posts. Como este código não verifica as capacidades do utilizador, permite a qualquer visitante do site de colocar posts no lixo!
/** * 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 fonte completoColapsar código fonte completo
Top
Restrição a uma Capacidade Específica #Restrição a uma Capacidade Específica
O exemplo acima permite a qualquer visitante do site clicar no link “Eliminar” e lixar o post. No entanto, queremos apenas que os Editores e acima possam clicar no link “Apagar”.
Para o conseguir, vamos verificar se o utilizador actual tem a capacidade edit_others_posts
, que só os Editores ou acima teriam:
/** * 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 fonte completoColapsar código fonte completo