Capacidades de WordPress y current_user_can() en functions.php

3 minutos de lectura

He agregado una función a functions.php para redirigir a los usuarios a posts-new.php después de iniciar sesión y funciona. Sin embargo, solo quiero que esto suceda si el usuario que inicia sesión es un colaborador. Así que agregué lo siguiente:

/** Redirect after login */
    function mysite_login_redirect(){
        if ( current_user_can( 'manage_options' ) ) {
           return 'http://mysite.com/wp-admin/index.php';}
        else {
           return 'http://mysite.com/wp-admin/post-new.php';}
    }
add_action( 'login_redirect', 'mysite_login_redirect');

En este estado, tanto los colaboradores como los administradores son redirigidos a post-new.php. Para probarlo, modifiqué la función para que los usuarios sin la capacidad fueran redirigidos:

if ( !current_user_can( 'ma ...

cuando modifiqué la función, tanto los colaboradores como los administradores son redirigidos a index.php.

Entonces, la función parece funcionar, pero esto implica para mí que no está viendo la capacidad ‘manage_options’ para los administradores. Probé varias capacidades exclusivas de administrador con los mismos resultados. raro eh?

Debo decir que estoy usando el complemento editor de roles de usuario, pero lo deshabilité y probé las funciones con los mismos resultados.

También estoy usando Active Directory Integration y Admin Menu Editor.

Prueba esto:

if( current_user_can( 'administrator' ) ){} // only if administrator
if( current_user_can( 'editor' ) ){} // only if editor
if( current_user_can( 'author' ) ){} // only if author
if( current_user_can( 'contributor' ) ){} // only if contributor
if( current_user_can( 'subscriber' ) ){} // only if subscriber

O:

if( current_user_can( 'level_10' ) ){}
if( current_user_can( 'level_9' ) ){}
if( current_user_can( 'level_8' ) ){}
if( current_user_can( 'level_7' ) ){}
if( current_user_can( 'level_6' ) ){}
if( current_user_can( 'level_5' ) ){}
if( current_user_can( 'level_4' ) ){}
if( current_user_can( 'level_3' ) ){}
if( current_user_can( 'level_2' ) ){}
if( current_user_can( 'level_1' ) ){}
if( current_user_can( 'level_0' ) ){}

  • Intenté usar ‘administrador’ en lugar de ‘manage_options’ pero obtengo los mismos resultados. Si entiendo correctamente, la etiqueta current_user_can() solo se aplica a las capacidades y no a los roles de los usuarios.

    – Es George

    15 de noviembre de 2012 a las 20:17

  • Su argumento es una capacidad o un nombre de rol, por lo que debería funcionar (codex.wordpress.org/Function_Reference/current_user_can).

    – CE

    15 de noviembre de 2012 a las 22:42

  • Entonces, de cualquier manera, la función no funciona y el problema es que la función no reconoce correctamente ni los roles ni las capacidades. Si lo configuro en un rol específico de administrador, o simplemente ‘administrador’, debería usar la URL ‘si’ si inicio sesión como administrador, y la URL ‘si no’ si inicio sesión como colaborador. De cualquier manera, ya sea que configuro la función en ‘current_user_can’ o ‘!current_user_can’, el inicio de sesión del administrador y el inicio de sesión del colaborador se comportan igual como si las capacidades no fueran diferentes.

    – Es George

    16 de noviembre de 2012 a las 3:13

  • Cita de la definición de la función: Si bien se admite en parte la verificación de roles particulares en lugar de una capacidad, se desaconseja esta práctica, ya que puede producir resultados poco confiables.

    – Shivanand Sharma

    21 oct 2019 a las 11:32

Prueba esto:

$exclude_role="contributor";
        $roles = get_role( $exclude_role )->capabilities;
        foreach ( $roles as $cap ) {
            if ( current_user_can( $cap ) ) {
                ...
            }
        }

¿Ha sido útil esta solución?