WordPress.org

Se il vostro plugin permette agli utenti di inviare dati – sia sul lato Admin che su quello pubblico – dovrebbe controllare le capacità degli utenti.

Ruoli e capacità degli utenti #User Roles and Capabilities

Il passo più importante nella creazione di un efficiente livello di sicurezza è avere un sistema di permessi utente in atto. WordPress lo fornisce sotto forma di Ruoli Utente e Capacità.

Ogni utente loggato in WordPress è automaticamente assegnato a specifiche Capacità Utente a seconda del suo Ruolo Utente.

I ruoli utente sono solo un modo elegante per dire a quale gruppo l’utente appartiene. Ogni gruppo ha un insieme specifico di capacità predefinite.

Per esempio, l’utente principale del tuo sito web avrà il ruolo di Amministratore mentre altri utenti potrebbero avere ruoli come Editor o Autore. Potresti avere più di un utente assegnato a un ruolo, cioè ci potrebbero essere due amministratori per un sito web.

Le capacità degli utenti sono i permessi specifici che assegni a ciascun utente o a un ruolo utente.

Per esempio, gli amministratori hanno la capacità “manage_options” che permette loro di visualizzare, modificare e salvare le opzioni per il sito web. I redattori, invece, non hanno questa capacità che impedisce loro di interagire con le opzioni.

Queste capacità sono poi controllate in vari punti dell’Admin. A seconda delle capacità assegnate a un ruolo; menu, funzionalità e altri aspetti dell’esperienza di WordPress possono essere aggiunti o rimossi.

Come costruisci un plugin, assicurati di eseguire il tuo codice solo quando l’utente corrente ha le capacità necessarie.

Gerarchia #Hierarchy

Più alto è il ruolo utente, più capacità l’utente ha. Ogni ruolo utente eredita i ruoli precedenti nella gerarchia.

Per esempio, l'”Amministratore”, che è il ruolo utente più alto su una singola installazione del sito, eredita i seguenti ruoli e le loro capacità: “Subscriber”, “Contributor”, “Author” e “Editor”.

Top

Esempi #Esempi

Top

No Restrictions #No Restrictions

L’esempio seguente crea un link sul frontend che dà la possibilità di cestinare i post. Poiché questo codice non controlla le capacità dell’utente, permette a qualsiasi visitatore del sito di cestinare i 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(, 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' );

Expand full source codeCollapse full source code

Top

Restricted to a Specific Capability #Restricted to a Specific Capability

L’esempio precedente permette a qualsiasi visitatore del sito di cliccare sul link “Delete” e cestinare il post. Tuttavia, vogliamo che solo i redattori e superiori possano cliccare sul link “Elimina”.

Per fare questo, controlleremo che l’utente attuale abbia la capacità edit_others_posts, che solo i redattori o superiori avrebbero:

/** * 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' );}

Expand full source codeCollapse full source code

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *