Come disabilitare profile.php per gli utenti?

23 lug 2015, 14:13:43
Visualizzazioni: 13.7K
Voti: 9

Sto utilizzando WordPress 4.2.2 e l'ultima versione di BuddyPress. Voglio che tutti i miei utenti personalizzino il loro profilo nella pagina del profilo di BuddyPress. Quindi voglio disabilitare profile.php per gli utenti. Ho nascosto il link del profilo dalla dashboard tramite il plugin WP admin UI customize. Ma quando qualcuno digita l'URL mysite/wp-admin/profile.php appare nel browser. Quindi voglio risolvere questo problema e disabilitare profile.php per gli utenti. Cosa devo fare per ottenere questo?

0
Tutte le risposte alla domanda 4
7
16

Reindirizzamento da profile.php alla dashboard

Ecco un modo per farlo:

add_action( 'load-profile.php', function() {
    if( ! current_user_can( 'manage_options' ) )
        exit( wp_safe_redirect( admin_url() ) );
} );

dove reindirizziamo alla dashboard invece, se l'utente corrente non può gestire le opzioni.

Reindirizzamento da profile.php alla pagina membro dell'utente corrente

Se vuoi reindirizzare alla pagina profilo del membro, potresti provare (non testato):

add_action( 'load-profile.php', function() {
    if( ! current_user_can( 'manage_options' ) && function_exists( 'bp_core_get_user_domain' ) )
        exit( wp_safe_redirect( bp_core_get_user_domain( get_current_user_id() ) ) );
} );

La funzione bp_core_get_user_domain() è menzionata in questa risposta, alcuni anni fa, da @BooneGorges.

Ho appena controllato il codice sorgente di BP e questa funzione è ancora disponibile in BP 2.3 (vedi qui).

Per PHP < 5.3

add_action( 'load-profile.php', 'wpse_195353_profile_redirect_to_dashboard' );
function wpse_195353_profile_redirect_to_dashboard()
{
    if( ! current_user_can( 'manage_options' ) )
        exit( wp_safe_redirect( admin_url() ) );
}

e

add_action( 'load-profile.php', 'wpse_195353_profile_redirect_to_member_page' );
function wpse_195353_profile_redirect_to_member_page()
{
    if( ! current_user_can( 'manage_options' ) && function_exists( 'bp_core_get_user_domain' ) )
        exit( wp_safe_redirect( bp_core_get_user_domain( get_current_user_id() ) ) );
}

ma dovresti considerare di aggiornare il tuo PHP se è questo il caso.

23 lug 2015 17:00:59
Commenti

Questo non aiuta fratello. Quando incollo quei due codici mi mostra una schermata bianca.

akarim akarim
24 lug 2015 05:44:42

Stai usando PHP < 5.3? In tal caso le funzioni anonime non sono supportate, ma è facile cambiarle in funzioni normali - per favore controlla la risposta aggiornata @azizul

birgire birgire
24 lug 2015 06:33:31

Fratello! I due codici per PHP<5.3 funzionano!! Ma c'è un problema che il mio server (bluehost) cPanel mostra la versione PHP 5.4.24 Non so perché questo codice funzioni. Ci saranno problemi in futuro se uso questo codice?

akarim akarim
24 lug 2015 09:50:32

Felice di sapere che ha funzionato per te. È strano ma entrambe le versioni del codice dovrebbero essere sicure per il futuro in PHP. Personalmente preferisco le funzioni anonime, introdotte in PHP 5.3 ;-) @azizul

birgire birgire
24 lug 2015 12:51:25

Grazie mille per l'aiuto sopra. Ho bisogno di un altro aiuto! Vorrei reindirizzare anche admin.php?page=jetpack per gli utenti. Come posso farlo?

akarim akarim
28 lug 2015 19:42:01

Forse sarebbe meglio porlo come una nuova domanda? @azizul

birgire birgire
30 lug 2015 00:34:27

+1, Grazie mille!

Ryan Ryan
16 mar 2019 01:15:11
Mostra i restanti 2 commenti
4

Il seguente codice* reindirizzerà gli utenti non amministratori a una pagina personalizzata nel front end, invece di disabilitare l'accesso, li reindirizzerà alla tua pagina personalizzata. :)

<?php
add_action ('init' , 'wpse_redirect_profile_access');

function wpse_redirect_profile_access(){
        //gli amministratori non saranno interessati
        if (current_user_can('manage_options')) return '';

        //se siamo nella pagina admin profile.php
        if (strpos ($_SERVER ['REQUEST_URI'] , 'wp-admin/profile.php' )) {
            wp_redirect ( home_url( '/my-profile' )); // a una pagina come: example.com/my-profile/
            exit();
        }

}

*Fonte^

23 lug 2015 15:06:25
Commenti

Sembra che manchi un exit();, dopo la parte di reindirizzamento.

birgire birgire
24 lug 2015 12:57:19

@birgire hai ragione. Non me n'ero accorto, grazie mille. Ora è sistemato. :)

Mayeenul Islam Mayeenul Islam
26 lug 2015 10:51:47

ps: dobbiamo fare attenzione quando usiamo if senza parentesi graffe. Funziona per una singola espressione ma qui ne hai due. Attualmente l'exit() è al di fuori della parte if e verrà sempre eseguito. Quindi è meglio usare la sintassi if(){ } quando abbiamo a che fare con due o più espressioni ;-)

birgire birgire
26 lug 2015 13:55:47

@birgire L'ho perso di nuovo. Grazie mille ancora. :)

Mayeenul Islam Mayeenul Islam
26 lug 2015 14:04:25
8

Mi piace questa soluzione. Puoi aggiungere pagine di amministrazione all'array per reindirizzarle. Qui sotto ho impostato il reindirizzamento alla Dashboard, ma puoi anche reindirizzare all'URL di BuddyPress... semplicemente non sono sicuro di quale sia quell'URL dato che non uso BP molto spesso.

   function no_proflie_admin_pages_redirect() {
      global $pagenow;
      if(!current_user_can('manage_options')) {
          $admin_redirects = array(
                    'profile.php'
                );
          if(in_array($pagenow, $admin_redirects)){
            wp_redirect( admin_url('/') ); exit;
          }
      }
    }
    add_action('admin_init', 'no_proflie_admin_pages_redirect');
  

Puoi anche nascondere eventuali link aggiuntivi a profile.php con del semplice CSS:

function hide_any_profile_links() { ?>
    <style type="text/css">
        a[href="http://example.com/wp-admin/profile.php"], a[href="profile.php"]{
            display: none!important;
        }
    </style>
<?php }
add_action('admin_head', 'hide_any_profile_links', 999);

Quanto sopra potrebbe essere ottenuto anche con jQuery o utilizzando PHP e il buffer di output.

24 lug 2015 09:24:01
Commenti

Temo che non funzionerà avere current_user_can() nello scope globale, perché wp_get_current_user() non è ancora definito.

birgire birgire
24 lug 2015 13:04:16

Ciao @birgire, potresti fare un esempio di quando questo non funzionerebbe con la pagina del profilo?

Bryan Willis Bryan Willis
26 lug 2015 09:04:40

Il controllo current_user_can() dovrebbe essere all'interno della callback no_proflie_admin_pages_redirect, per evitare l'errore di undefined.

birgire birgire
26 lug 2015 22:16:28

Ehi grazie per la risposta birgire, ho appena notato. Comunque, sai di preciso quando potrebbe effettivamente succedere? Lo faccio in questo modo da un paio d'anni ormai e non ho mai avuto problemi e sorprendentemente non mi sono mai imbattuto in un problema o visto alcun messaggio di errore... Succederebbe solo per certi utenti?

Bryan Willis Bryan Willis
2 ott 2015 08:57:31

Non possiamo usare current_user_can() nello scope globale, all'interno di un plugin. Questo porta a Fatal error: Call to undefined function wp_get_current_user(). Ma immagino che tu lo usi nel file functions.php?

birgire birgire
2 ott 2015 11:43:45

Avevi ragione. Ho testato questo in un plugin invece che in functions.php e ho ricevuto l'errore fatale!

Bryan Willis Bryan Willis
9 gen 2016 21:35:11

Il selettore CSS può essere semplificato in a[href$="profile.php"], che significa che corrisponde alla fine del valore dell'attributo href.

Raptor Raptor
21 ott 2019 05:05:27

Ottima osservazione @Raptor

Bryan Willis Bryan Willis
24 ott 2019 17:08:50
Mostra i restanti 3 commenti
0

Estendendo la risposta di @birgire, da cui ho trovato che il primo snippet è il più pulito che abbia visto per questo scopo, volevo aggiungere quanto segue poiché penso possa essere utile per la maggior parte delle persone che arrivano a questa discussione.

Se non vuoi che gli utenti accedano al loro profilo nel backend, molto probabilmente non vorrai neanche che possano accedere alla dashboard.

Il caso d'uso è quando hai degli iscritti a cui non vuoi permettere l'accesso al backend. Di default possono accedere alla dashboard e al loro profilo, quindi evitiamolo:

function redirect_subscribers () {
    if( ! current_user_can( 'edit_posts' ) ) {
        exit( wp_safe_redirect( site_url() ) );
    }
}
add_action( 'load-index.php', 'redirect_subscribers' );
add_action( 'load-profile.php', 'redirect_subscribers' );

Nota che in questo caso ho usato la capability edit_posts, poiché sto solo mirando agli iscritti e questa è una capability che tutti i ruoli hanno tranne gli iscritti.

Poi sto usando site_url() per reindirizzarli alla homepage, ma potresti anche usare get_permalink($page_id) passando come parametro l'id della pagina dove hai creato un'area "Il mio account".

L'azione load-{$page_hook} è documentata nel codex.

25 apr 2022 17:59:05