为一个用户禁用用户配置文件编辑

时间:2014-04-18 作者:prepu

我一直在互联网上寻找如何在Wordpress中为用户禁用编辑个人资料的选项,但我没有找到一个好方法。问题是,我希望95%的用户可以编辑他们的个人资料(地址、电话等)但还有5%我不想让他们访问配置文件部分。对我来说,最好的解决方案是手动选择要禁用的用户,但我也考虑创建一个角色或一组用户来管理它。

这方面没有插件,我唯一发现的是下面的代码,但它不起作用。

add_action(\'admin_init\', \'user_profile_fields_disable\');

function user_profile_fields_disable() {

    global $pagenow;

    // apply only to user profile or user edit pages
    if ($pagenow!==\'profile.php\' && $pagenow!==\'user-edit.php\') {
        return;
    }

    // do not change anything for the administrator
    if (current_user_can(\'administrator\')) {
    return;
    }
    if (current_user_can(\'custom_role\') {
      add_action( \'admin_footer\', \'user_profile_fields_disable_js\' );
    }      
}
/**
 * Disables selected fields in WP Admin user profile (profile.php, user-edit.php)
 */
function user_profile_fields_disable_js() {
?>
    <script>
        jQuery(document).ready( function($) {
            var fields_to_disable = [\'email\', \'role\'];
            for(i=0; i<fields_to_disable.length; i++) {
                if ( $(\'#\'+ fields_to_disable[i]).length ) {
                    $(\'#\'+ fields_to_disable[i]).attr("disabled", "disabled");
                }
            }
        });
    </script>
<?php
}
您必须将“custom\\u role”替换为我分配给用户的角色的名称。那代码是过时的还是错误的?你知道怎么解决吗?

非常感谢通用汽车公司。!这是一个伟大而完美的解决方案。我忘了告诉你我正在使用Woocommerce插件,我在“我的帐户”页面中仍然存在个人资料编辑问题。

你能给上面的插件添加一些东西来删除“编辑”链接吗?我不介意用户可以阅读他的个人资料,但不允许编辑。

以下是我所说的(一些字段是西班牙语):enter image description here

再次感谢您的工作!

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

如果您想完全消除用户访问配置文件的可能性,您可以

允许管理员选择哪些用户可以访问配置文件,哪些用户不能访问配置文件从菜单和管理栏中删除配置文件链接,确保即使通过手动键入地址直接访问配置文件,也无法访问配置文件第1步第一点很容易使用\'personal_options\', \'edit_user_profile_update\' 挂钩:

add_action( \'personal_options\', \'rpa_profile_ban_field\' );
add_action( \'edit_user_profile_update\', \'rpa_profile_ban_field_save\' );

function rpa_profile_ban_field( \\WP_User $user ) {
  $current = wp_get_current_user();
  if ( ! is_admin() || $user->ID === $current->ID ) return;
  if ( ! user_can( $current, \'edit_users\' ) ) return;
  $target = new WP_User( $user->ID ); 
  if ( $target->exists() &&  ! user_can( $target, \'edit_users\' ) ) {
    $banned = (int) get_user_meta( $user->ID, \'_profile_banned\', TRUE );
  ?>
  <table class="form-table"><tbody><tr>
  <th scope="row">Profile Ban</th><td>
  <input<?php checked(1, $banned); ?> name="_profile_banned" value="1" type="checkbox">
  Ban user to enter profile?
  </td></tr></tbody></table>
  <?php
  }
}

function rpa_profile_ban_field_save( $userid ) {
  $current = wp_get_current_user();
  if ( ! is_admin() || $user->ID === $current->ID ) return;
  if ( ! user_can( $current, \'edit_users\' ) ) return;
  $target = new WP_User( $userid );
  if ( ! $target->exists() || user_can( $target, \'edit_users\' ) ) return; 
  $ban = filter_input( INPUT_POST, \'_profile_banned\', FILTER_SANITIZE_NUMBER_INT );
  if ( (int) $ban > 0 ) {
    update_user_meta( $userid, \'_profile_banned\', 1 );
  } elseif ( get_user_meta( $userid, \'_profile_banned\', TRUE ) ) {
    delete_user_meta( $userid, \'_profile_banned\' );
  }
}
使用此代码,管理员可以访问每个用户并禁用对配置文件页面的访问。这是代码的输出:

Ban user fields

第2步

从菜单中删除配置文件链接很容易使用remove_menu_page:

add_action( \'admin_menu\', \'rpa_profile_menu_remove\' );

function rpa_profile_menu_remove(){
  $remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
  if ( ! current_user_can( \'edit_users\' ) && (int) $remove > 0 ) {
    remove_menu_page( \'profile.php\' );
  } 
}
从管理栏中删除配置文件链接稍微复杂一些,或者更好一些,完全删除右上角的用户菜单很容易使用$wp_admin_bar->remove_menu(\'my-account\') (参见WP_Admin_Bar docs), 但这是“不美观的”,而且您也可以删除注销的可能性。因此,更好的解决方案是只删除到概要文件的链接:

add_action( \'wp_before_admin_bar_render\', \'rpa_profile_adminbar_remove\' );

function rpa_profile_adminbar_remove() {
  $remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
  if ( (int) $remove !== 1 || current_user_can( \'edit_users\' ) ) return;
  global $wp_admin_bar;
  $account = (array) $wp_admin_bar->get_node(\'my-account\');
  $info = (array) $wp_admin_bar->get_node(\'user-info\');
  $logout = (array) $wp_admin_bar->get_node(\'logout\');
  $account[\'href\'] = $info[\'href\'] = \'#\';
  $wp_admin_bar->remove_node(\'my-account\');
  $wp_admin_bar->remove_node(\'user-info\');
  $wp_admin_bar->remove_node(\'edit-profile\');
  $wp_admin_bar->remove_node(\'logout\');
  $wp_admin_bar->add_node($account);
  $wp_admin_bar->add_node($info);
  $wp_admin_bar->add_node($logout);
}

步骤3

使用上面的所有代码,用户再也看不到概要文件的链接,但是,只需键入http://www.example.com/wp-admin/profile.php 并显示配置文件页面。这很容易解决:

add_action( \'load-profile.php\', \'rpa_profile_banned_check\' );
add_action( \'load-index.php\', \'rpa_profile_banned_msg\' );
add_action( \'all_admin_notices\', \'rpa_profile_banned_msg\' );

function rpa_profile_banned_check() {
  $remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
  if ( (int) $remove === 1 && ! current_user_can( \'edit_users\' ) ) {
    wp_redirect( add_query_arg( array( \'pbanned\' => 1), admin_url(\'index.php\') ) );
    exit();
  }
}

function rpa_profile_banned_msg() {
  if ( current_user_can( \'edit_users\' ) ) return;
  static $show = false;
  if ( current_filter() === \'load-index.php\' ) {
    $msg = (int) filter_input( INPUT_GET, \'pbanned\', FILTER_SANITIZE_NUMBER_INT);
    $banned = (int) get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
    $show = ( $msg === $banned && $banned === 1 );    
  } elseif ( current_filter() === \'all_admin_notices\' && $show ) {
    echo \'<div class="error"><p>Sorry, you are not allowed to edit your profile.</p></div>\';
  }
}
前面的代码检查在加载配置文件页面时是否禁止用户,如果是,则将用户重定向到仪表板,在url中添加一个变量,允许显示一条消息,通知用户不允许查看配置文件。

这是消息的显示方式:

Admin notices for user not allowed to see profile

所有代码,作为插件,在Gist中提供here.

SO网友:prepu

有人帮我在Woocommerce 2.0中获得了同样的功能。XX。首先要安装上面的G.M.插件。然后,我编辑了文件/插件/woocommerce/模板/我的帐户/我的地址。php,您必须在第28行中添加:

$checkProfile =  get_user_meta( $customer_id, \'_profile_banned\', TRUE );
还必须在第45行中替换:

<a href="<?php echo esc_url( add_query_arg(\'address\', $name, get_permalink(woocommerce_get_page_id( \'edit_address\' ) ) ) ); ?>" class="edit"><?php _e( \'Edit\', \'woocommerce\' ); ?></a>
使用:

<?php 
if (!empty($checkProfile) && $checkProfile==1) {
echo \'\';
} else {
echo \'<a href="\', esc_url( add_query_arg(\'address\', $name, get_permalink(woocommerce_get_page_id( \'edit_address\' ) ) ) ), \'" class="edit">\', _e( \'Edit\', \'woocommerce\' ), \'</a>\';
}
?>

结束

相关推荐

GET_USERS()ORDER BY不工作

我不确定问题出在哪里,但下面的代码没有按ID降序排序的效果。$args[\'role\'] = \'subscriber\'; $args[\'orderby\'] = \'ID\'; $args[\'order\'] = \'DESC\'; $args[\'fields\'] = \'all_with_meta\'; $args[\'meta_query\'] = $meta_query; // $meta_query is an array specifie