Cum să dezactivez profile.php pentru utilizatori?
Folosesc WordPress 4.2.2 și ultima versiune de BuddyPress. Vreau ca toți utilizatorii mei să-și personalizeze profilul doar prin pagina de profil BuddyPress. Așadar, doresc să dezactivez profile.php pentru utilizatori. Am ascuns link-ul către profil din dashboard folosind plugin-ul WP admin UI customize. Dar când cineva introduce URL-ul mysite/wp-admin/profile.php, pagina încă se afișează în browser. Vreau să evit această problemă și să dezactivez profile.php pentru utilizatori. Ce ar trebui să fac pentru a rezolva această problemă?

Redirecționare de la profile.php
către dashboard
Iată o metodă de a face acest lucru:
add_action( 'load-profile.php', function() {
if( ! current_user_can( 'manage_options' ) )
exit( wp_safe_redirect( admin_url() ) );
} );
unde redirecționăm către dashboard dacă utilizatorul curent nu poate gestiona opțiuni.
Redirecționare de la profile.php
către pagina de membru a utilizatorului curent
Dacă doriți să redirecționați către pagina de profil a membrului, puteți încerca (netestat):
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() ) ) );
} );
Funcția bp_core_get_user_domain()
este menționată în acest răspuns, acum câțiva ani, de @BooneGorges.
Am verificat sursa BP și această funcție este încă disponibilă în BP 2.3 (vezi aici).
Pentru 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() ) );
}
și
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() ) ) );
}
dar ar trebui să luați în considerare actualizarea PHP dacă acesta este cazul.

Folosești PHP < 5.3? Dacă da, atunci funcțiile anonime nu sunt suportate, dar este ușor să le schimbi în funcții normale - te rog verifică răspunsul actualizat @azizul

Frate! Cele două coduri pentru PHP<5.3 funcționează!! Dar există o problemă - serverul meu (bluehost) cPanel arată versiunea PHP 5.4.24 și nu știu de ce funcționează acest cod. Va fi vreo problemă în viitor dacă folosesc acest cod?

Mă bucur că a funcționat pentru tine. E ciudat, dar ambele versiuni de cod ar trebui să fie sigure pentru viitor în PHP. Îmi plac funcțiile anonime, introduse în PHP 5.3 ;-) @azizul

Mulțumesc mult pentru ajutorul de mai sus. Mai am nevoie de un ajutor! Vreau să redirecționez și admin.php?page=jetpack pentru utilizatori. Cum pot face asta?

Următorul cod* va redirecționa utilizatorii non-administratori către o pagină personalizată de profil în front-end, deoarece în loc să le dezactivezi accesul, trebuie să îi redirecționezi către pagina ta personalizată. :)
<?php
add_action ('init' , 'wpse_redirect_profile_access');
function wpse_redirect_profile_access(){
//administratorii nu vor fi afectați
if (current_user_can('manage_options')) return '';
//dacă ne aflăm în pagina de profil admin profile.php
if (strpos ($_SERVER ['REQUEST_URI'] , 'wp-admin/profile.php' )) {
wp_redirect ( home_url( '/profilul-meu' )); // către o pagină precum: exemplu.com/profilul-meu/
exit();
}
}

@birgire ai dreptate. Nu am observat asta, mulțumesc mult. Am rezolvat acum. :)

ps: trebuie să fim atenți când folosim if
fără acolade. Funcționează pentru o singură expresie dar tu ai două. Momentan exit()
este în afara părții cu if
și va rula mereu. Așa că e mai bine să folosim sintaxa if(){ }
când avem de-a face cu două sau mai multe expresii ;-)

Îmi place această soluție. Poți adăuga pagini de administrare în array pentru a le redirecționa. Am configurat redirecționarea către Panoul de control mai jos, dar poți redirecționa și către URL-ul BuddyPress... Doar că nu sunt sigur care este acel URL deoarece nu folosesc BP foarte des.
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');
De asemenea, poți ascunde orice link-uri adiționale către profile.php folosind CSS simplu:
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);
De asemenea, acest lucru poate fi realizat și cu jQuery sau folosind PHP și output buffer.

Mă tem că nu va funcționa să folosești current_user_can()
în scope-ul global, deoarece wp_get_current_user()
nu este încă definit.

Salut @birgire, ai putea să dai un exemplu când acest lucru nu ar funcționa pe pagina de profil?

Verificarea cu current_user_can()
ar trebui să fie în interiorul callback-ului no_proflie_admin_pages_redirect
, pentru a evita eroarea de nedefinit.

Hei, mulțumesc pentru răspuns, birgire, abia acum am observat. Oricum, știi cumva când anume se poate întâmpla asta? Am folosit această metodă de câțiva ani și nu am avut nicio problemă, surprinzător nu am întâlnit nicio eroare sau mesaj de eroare... Se poate întâmpla doar pentru anumiți utilizatori?

Nu putem folosi current_user_can()
în scope-ul global, într-un plugin. Asta duce la Fatal error: Call to undefined function wp_get_current_user()
. Dar presupun că o folosești în fișierul functions.php
?

Aveai dreptate. Am testat asta într-un plugin în loc de functions.php
și am primit eroarea fatală!

Selectorul CSS poate fi simplificat la a[href$="profile.php"]
, ceea ce înseamnă că se potrivește cu sfârșitul valorii atributului href
.

Extinzând răspunsul lui @birgire, din care am considerat primul fragment de cod drept cel mai curat pe care l-am văzut pentru această situație, am vrut să adaug următoarele, deoarece cred că ar putea fi util pentru majoritatea oamenilor care ajung la acest subiect.
Dacă nu doriți ca utilizatorii să acceseze profilul lor în backend, cel mai probabil nu doriți nici să poată accesa panoul de control.
Scenariul este atunci când aveți abonați pe care nu doriți să acceseze deloc backend-ul. În mod implicit, aceștia pot accesa panoul de control și profilul lor, așa că haideți să evităm asta:
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' );
Observați că în acest caz am folosit capacitatea edit_posts
, deoarece vizez doar abonații și aceasta este o capacitate pe care o au toate rolurile, cu excepția abonaților.
Apoi folosesc site_url()
pentru a-i redirecționa către pagina de start, dar ați putea folosi și get_permalink($page_id)
utilizând id
-ul paginii unde ați creat o zonă "Contul meu" ca parametru.
Acțiunea load-{$page_hook}
este documentată în codex.
