¿Cómo deshabilitar profile.php para los usuarios?
Estoy usando WordPress 4.2.2 y la última versión de BuddyPress. Quiero que todos mis usuarios personalicen su perfil en la página de perfil de BuddyPress. Por lo tanto, quiero deshabilitar profile.php para los usuarios. Oculté el enlace del perfil del panel usando el plugin WP admin UI customize. Pero cuando alguien escribe la URL misitio/wp-admin/profile.php aparece en el navegador. Quiero solucionar este problema y deshabilitar profile.php para los usuarios. ¿Qué debo hacer para lograrlo?

Redirección desde profile.php
al escritorio
Aquí hay una forma de hacerlo:
add_action( 'load-profile.php', function() {
if( ! current_user_can( 'manage_options' ) )
exit( wp_safe_redirect( admin_url() ) );
} );
donde redirigimos al escritorio en su lugar, si el usuario actual no puede gestionar opciones.
Redirección desde profile.php
a la página de miembro del usuario actual
Si deseas redirigir a la página de perfil del miembro, podrías probar (no testado):
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 función bp_core_get_user_domain()
se menciona en esta respuesta, hace algunos años, por @BooneGorges.
Acabo de verificar el código fuente de BP y esta función sigue disponible en BP 2.3 (ver aquí).
Para 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() ) );
}
y
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() ) ) );
}
pero deberías considerar actualizar tu PHP si ese es el caso.

Esto no está ayudando hermano. Cuando pego esos dos códigos me muestra una pantalla blanca.

¿Estás usando PHP < 5.3? Si es así, las funciones anónimas no son compatibles, pero es fácil cambiarlas a funciones normales - por favor revisa la respuesta actualizada @azizul

¡Hermano! Los dos códigos para PHP<5.3 están funcionando !! Pero hay un problema, mi servidor (bluehost) en cPanel muestra la versión PHP 5.4.24 y no sé por qué este código funciona. ¿Habrá algún problema en el futuro si uso este código?

Me alegra saber que funcionó para ti. Es extraño, pero ambas versiones del código deberían ser seguras para versiones futuras de PHP. Simplemente me gustan las funciones anónimas, introducidas en PHP 5.3 ;-) @azizul

Muchas gracias por la ayuda anterior. ¡Necesito otra ayuda! Quiero redirigir admin.php?page=jetpack también para los usuarios. ¿Cómo puedo hacerlo?

El siguiente código* redirigirá a los usuarios que no son administradores a una página de perfil personalizada en el front-end, ya que en lugar de deshabilitar el acceso, necesitas redirigirlos a tu página personalizada. :)
<?php
add_action ('init' , 'wpse_redirect_profile_access');
function wpse_redirect_profile_access(){
//los administradores no serán afectados
if (current_user_can('manage_options')) return '';
//si estamos en la página de perfil del administrador (profile.php)
if (strpos ($_SERVER ['REQUEST_URI'] , 'wp-admin/profile.php' )) {
wp_redirect ( home_url( '/mi-perfil' )); // a una página como: ejemplo.com/mi-perfil/
exit();
}
}

@birgire tienes razón. No me di cuenta de eso, muchas gracias. Corregido ahora. :)

ps: debemos tener cuidado al usar if
sin llaves. Funciona para una sola expresión pero tienes dos. Actualmente el exit()
está fuera de la parte del if
y siempre se ejecutará. Así que es mejor usar la sintaxis if(){ }
cuando manejamos dos o más expresiones ;-)

Me gusta esta opción. Puedes añadir páginas de administración al array para redirigirlas. Aquí la tengo configurada para redirigir al Escritorio, pero también podrías redirigir a una URL de BuddyPress... Simplemente no estoy seguro de cuál sería esa URL ya que no uso BP con frecuencia.
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');
También puedes ocultar cualquier enlace adicional a profile.php con CSS simple:
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);
Lo anterior también podría lograrse con jQuery o usando PHP y el buffer de salida.

Me temo que no funcionará tener current_user_can()
en el ámbito global, porque wp_get_current_user()
aún no estaría definido.

Hola @birgire, ¿podrías dar un ejemplo de cuándo esto no funcionaría con la página de perfil?

La verificación current_user_can()
debería estar dentro de la devolución de llamada no_proflie_admin_pages_redirect
, para evitar el error de indefinido.

Hola, gracias por la respuesta birgire, acabo de notarlo. De todos modos, ¿sabes específicamente cuándo podría ocurrir esto realmente? Llevo un par de años haciéndolo así y no he tenido ningún problema y sorprendentemente nunca me he encontrado con un problema ni he visto mensajes de error... ¿Ocurriría esto solo para ciertos usuarios?

No podemos usar current_user_can()
en el ámbito global, dentro de un plugin. Esto provoca Fatal error: Call to undefined function wp_get_current_user()
. Pero supongo que lo usas dentro del archivo functions.php
, ¿verdad?

¡Tenías razón! Probé esto en un plugin en lugar de en functions.php
y obtuve el error fatal.

El selector CSS se puede simplificar a a[href$="profile.php"]
, lo que significa que coincide con el final del valor del atributo href
.

Extendiendo la respuesta de @birgire, de la cual encontré que el primer fragmento de código es el más limpio que he visto para esto, quería agregar lo siguiente ya que creo que puede ser útil para la mayoría de las personas que llegan a este hilo.
Si no quieres que los usuarios accedan a su perfil en el backend, probablemente tampoco querrás que puedan acceder al escritorio.
El caso de uso es cuando tienes suscriptores a los que no quieres que accedan al backend en absoluto. Por defecto pueden acceder al escritorio y a su perfil, así que evitemos eso:
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 que en este caso he usado la capacidad edit_posts
, ya que solo estoy dirigiendo a suscriptores y esta es una capacidad que todos los roles tienen excepto los suscriptores.
Luego estoy usando site_url()
para redirigirlos a la página de inicio, pero también podrías usar get_permalink($page_id)
pasando el id
de la página donde has creado un área de "Mi cuenta" como parámetro.
El load-{$page_hook}
está documentado en el codex.
