mirror of
https://github.com/10h30/ultimatemember.git
synced 2026-06-05 15:09:37 +09:00
- github fixes code review;
This commit is contained in:
+1040
-840
File diff suppressed because it is too large
Load Diff
+126
-112
@@ -1,120 +1,134 @@
|
||||
jQuery(document).ready(function() {
|
||||
|
||||
jQuery('.um-profile.um-viewing .um-profile-body .um-row').each(function(){
|
||||
var this_row = jQuery(this);
|
||||
if ( this_row.find('.um-field').length == 0 ) {
|
||||
this_row.prev('.um-row-heading').remove();
|
||||
this_row.remove();
|
||||
}
|
||||
});
|
||||
jQuery('.um-profile.um-viewing .um-profile-body .um-row').each(function(){
|
||||
var this_row = jQuery(this);
|
||||
if ( this_row.find('.um-field').length == 0 ) {
|
||||
this_row.prev('.um-row-heading').remove();
|
||||
this_row.remove();
|
||||
}
|
||||
});
|
||||
|
||||
if ( jQuery('.um-profile.um-viewing .um-profile-body').length && jQuery('.um-profile.um-viewing .um-profile-body').find('.um-field').length == 0 ) {
|
||||
jQuery('.um-row-heading,.um-row').remove();
|
||||
jQuery('.um-profile-note').show();
|
||||
}
|
||||
|
||||
jQuery(document).on('click', '.um-profile-save', function(e){
|
||||
e.preventDefault();
|
||||
jQuery(this).parents('.um').find('form').submit();
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery(document).on('click', '.um-profile-edit-a', function(e){
|
||||
jQuery(this).addClass('active');
|
||||
});
|
||||
|
||||
jQuery(document).on('click', '.um-cover a.um-cover-add, .um-photo a', function(e){
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery(document).on('click', '.um-photo-modal', function(e){
|
||||
e.preventDefault();
|
||||
var photo_src = jQuery(this).attr('data-src');
|
||||
um_new_modal('um_view_photo', 'fit', true, photo_src );
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery(document).on('click', '.um-reset-profile-photo', function(e){
|
||||
|
||||
jQuery('.um-profile-photo-img img').attr('src', jQuery(this).attr('data-default_src') );
|
||||
|
||||
user_id = jQuery(this).attr('data-user_id');
|
||||
metakey = 'profile_photo';
|
||||
|
||||
jQuery.ajax({
|
||||
url: wp.ajax.settings.url,
|
||||
type: 'post',
|
||||
data: {
|
||||
action:'um_delete_profile_photo',
|
||||
metakey: metakey,
|
||||
user_id: user_id,
|
||||
nonce: um_scripts.nonce
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
jQuery(document).on('click', '.um-reset-cover-photo', function(e){
|
||||
var obj = jQuery(this);
|
||||
jQuery('.um-cover-overlay').hide();
|
||||
jQuery('.um-cover-e').html('<a href="#" class="um-cover-add um-manual-trigger" data-parent=".um-cover" data-child=".um-btn-auto-width"><span class="um-cover-add-i"><i class="um-icon-plus um-tip-n" title="Upload a cover photo"></i></span></a>');
|
||||
jQuery('.um-dropdown').hide();
|
||||
|
||||
um_responsive();
|
||||
|
||||
user_id = jQuery(this).attr('data-user_id');
|
||||
metakey = 'cover_photo';
|
||||
|
||||
jQuery.ajax({
|
||||
url: wp.ajax.settings.url,
|
||||
type: 'post',
|
||||
data: {
|
||||
action: 'um_delete_cover_photo',
|
||||
metakey: metakey,
|
||||
user_id: user_id,
|
||||
nonce: um_scripts.nonce
|
||||
},
|
||||
success: function( response ) {
|
||||
obj.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
// Bio characters limit
|
||||
function um_update_bio_countdown() {
|
||||
if( typeof jQuery('textarea[id=um-meta-bio]').val() !== 'undefined' ){
|
||||
var um_bio_limit = jQuery('textarea[id=um-meta-bio]').attr( "data-character-limit" );
|
||||
var remaining = um_bio_limit - jQuery('textarea[id=um-meta-bio]').val().length;
|
||||
jQuery('span.um-meta-bio-character span.um-bio-limit').text( remaining );
|
||||
if( remaining < 5 ){
|
||||
jQuery('span.um-meta-bio-character').css('color','red');
|
||||
}else{
|
||||
jQuery('span.um-meta-bio-character').css('color','');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
um_update_bio_countdown();
|
||||
jQuery('textarea[id=um-meta-bio]').change(um_update_bio_countdown);
|
||||
jQuery('textarea[id=um-meta-bio]').keyup(um_update_bio_countdown);
|
||||
|
||||
jQuery('.um-profile-edit a.um_delete-item').click(function(e){
|
||||
e.preventDefault();
|
||||
var a = confirm('Are you sure that you want to delete this user?');
|
||||
if( ! a ){
|
||||
return false;
|
||||
if ( jQuery('.um-profile.um-viewing .um-profile-body').length && jQuery('.um-profile.um-viewing .um-profile-body').find('.um-field').length == 0 ) {
|
||||
jQuery('.um-row-heading,.um-row').remove();
|
||||
jQuery('.um-profile-note').show();
|
||||
}
|
||||
|
||||
});
|
||||
jQuery( document.body ).on( 'click', '.um-profile-save', function(e){
|
||||
e.preventDefault();
|
||||
jQuery(this).parents('.um').find('form').submit();
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery( document.body ).on( 'click', '.um-profile-edit-a', function(e){
|
||||
jQuery(this).addClass('active');
|
||||
});
|
||||
|
||||
jQuery( document.body ).on( 'click', '.um-cover a.um-cover-add, .um-photo a', function(e){
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery( document.body ).on('click', '.um-photo-modal', function(e){
|
||||
e.preventDefault();
|
||||
var photo_src = jQuery(this).attr('data-src');
|
||||
um_new_modal('um_view_photo', 'fit', true, photo_src );
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery(document.body).on('click', '.um-reset-profile-photo', function(e){
|
||||
|
||||
jQuery('.um-profile-photo-img img').attr('src', jQuery(this).attr('data-default_src') );
|
||||
|
||||
user_id = jQuery(this).attr('data-user_id');
|
||||
metakey = 'profile_photo';
|
||||
|
||||
jQuery.ajax({
|
||||
url: wp.ajax.settings.url,
|
||||
type: 'post',
|
||||
data: {
|
||||
action:'um_delete_profile_photo',
|
||||
metakey: metakey,
|
||||
user_id: user_id,
|
||||
nonce: um_scripts.nonce
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
jQuery(document.body).on('click', '.um-reset-cover-photo', function(e){
|
||||
var obj = jQuery(this);
|
||||
jQuery('.um-cover-overlay').hide();
|
||||
jQuery('.um-cover-e').html('<a href="#" class="um-cover-add um-manual-trigger" data-parent=".um-cover" data-child=".um-btn-auto-width"><span class="um-cover-add-i"><i class="um-icon-plus um-tip-n" title="Upload a cover photo"></i></span></a>');
|
||||
jQuery('.um-dropdown').hide();
|
||||
|
||||
um_responsive();
|
||||
|
||||
user_id = jQuery(this).attr('data-user_id');
|
||||
metakey = 'cover_photo';
|
||||
|
||||
jQuery.ajax({
|
||||
url: wp.ajax.settings.url,
|
||||
type: 'post',
|
||||
data: {
|
||||
action: 'um_delete_cover_photo',
|
||||
metakey: metakey,
|
||||
user_id: user_id,
|
||||
nonce: um_scripts.nonce
|
||||
},
|
||||
success: function( response ) {
|
||||
obj.hide();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/*function um_update_bio_countdown() {
|
||||
//
|
||||
jQuery(this)
|
||||
if ( typeof jQuery('textarea[id="um-meta-bio"]').val() !== 'undefined' ){
|
||||
var um_bio_limit = jQuery('textarea[id="um-meta-bio"]').attr( "data-character-limit" );
|
||||
var remaining = um_bio_limit - jQuery('textarea[id="um-meta-bio"]').val().length;
|
||||
jQuery('span.um-meta-bio-character span.um-bio-limit').text( remaining );
|
||||
if ( remaining < 5 ) {
|
||||
jQuery('span.um-meta-bio-character').css('color','red');
|
||||
} else {
|
||||
jQuery('span.um-meta-bio-character').css('color','');
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
//um_update_bio_countdown();
|
||||
//jQuery( 'textarea[id="um-meta-bio"]' ).change( um_update_bio_countdown ).keyup( um_update_bio_countdown ).trigger('change');
|
||||
|
||||
// Bio characters limit
|
||||
jQuery( document.body ).on( 'change, keyup', 'textarea[id="um-meta-bio"]', function() {
|
||||
if ( typeof jQuery(this).val() !== 'undefined' ) {
|
||||
var um_bio_limit = jQuery(this).attr( "data-character-limit" );
|
||||
var remaining = um_bio_limit - jQuery(this).val().length;
|
||||
jQuery( 'span.um-meta-bio-character span.um-bio-limit' ).text( remaining );
|
||||
if ( remaining < 5 ) {
|
||||
jQuery('span.um-meta-bio-character').css('color','red');
|
||||
} else {
|
||||
jQuery('span.um-meta-bio-character').css('color','');
|
||||
}
|
||||
}
|
||||
});
|
||||
jQuery( 'textarea[id="um-meta-bio"]' ).trigger('change');
|
||||
|
||||
|
||||
jQuery( '.um-profile-edit a.um_delete-item' ).click( function(e) {
|
||||
e.preventDefault();
|
||||
if ( ! confirm( 'Are you sure that you want to delete this user?' ) ) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Fix profile nav links for iPhone
|
||||
* @see https://www.html5rocks.com/en/mobile/touchandmouse/
|
||||
*/
|
||||
jQuery('.um-profile-nav a').on('touchend', function(e){
|
||||
e.currentTarget.click();
|
||||
});
|
||||
/**
|
||||
* Fix profile nav links for iPhone
|
||||
* @see https://www.html5rocks.com/en/mobile/touchandmouse/
|
||||
*/
|
||||
jQuery( '.um-profile-nav a' ).on( 'touchend', function(e) {
|
||||
e.currentTarget.click();
|
||||
});
|
||||
|
||||
});
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
jQuery(document).ready(function(){function e(){if(void 0!==jQuery("textarea[id=um-meta-bio]").val()){var e=jQuery("textarea[id=um-meta-bio]").attr("data-character-limit")-jQuery("textarea[id=um-meta-bio]").val().length;jQuery("span.um-meta-bio-character span.um-bio-limit").text(e),e<5?jQuery("span.um-meta-bio-character").css("color","red"):jQuery("span.um-meta-bio-character").css("color","")}}jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um").find("form").submit(),!1}),jQuery(document).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){return e.preventDefault(),!1}),jQuery(document).on("click",".um-photo-modal",function(e){e.preventDefault();var t=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,t),!1}),jQuery(document).on("click",".um-reset-profile-photo",function(e){jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}})}),jQuery(document).on("click",".um-reset-cover-photo",function(e){var t=jQuery(this);jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html('<a href="#" class="um-cover-add um-manual-trigger" data-parent=".um-cover" data-child=".um-btn-auto-width"><span class="um-cover-add-i"><i class="um-icon-plus um-tip-n" title="Upload a cover photo"></i></span></a>'),jQuery(".um-dropdown").hide(),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){t.hide()}})}),e(),jQuery("textarea[id=um-meta-bio]").change(e),jQuery("textarea[id=um-meta-bio]").keyup(e),jQuery(".um-profile-edit a.um_delete-item").click(function(e){if(e.preventDefault(),!confirm("Are you sure that you want to delete this user?"))return!1})});
|
||||
jQuery(document).ready(function(){jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document.body).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um").find("form").submit(),!1}),jQuery(document.body).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document.body).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){return e.preventDefault(),!1}),jQuery(document.body).on("click",".um-photo-modal",function(e){e.preventDefault();var t=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,t),!1}),jQuery(document.body).on("click",".um-reset-profile-photo",function(e){jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}})}),jQuery(document.body).on("click",".um-reset-cover-photo",function(e){var t=jQuery(this);jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html('<a href="#" class="um-cover-add um-manual-trigger" data-parent=".um-cover" data-child=".um-btn-auto-width"><span class="um-cover-add-i"><i class="um-icon-plus um-tip-n" title="Upload a cover photo"></i></span></a>'),jQuery(".um-dropdown").hide(),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){t.hide()}})}),jQuery(document.body).on("change, keyup",'textarea[id="um-meta-bio"]',function(){if(void 0!==jQuery(this).val()){var e=jQuery(this).attr("data-character-limit")-jQuery(this).val().length;jQuery("span.um-meta-bio-character span.um-bio-limit").text(e),e<5?jQuery("span.um-meta-bio-character").css("color","red"):jQuery("span.um-meta-bio-character").css("color","")}}),jQuery('textarea[id="um-meta-bio"]').trigger("change"),jQuery(".um-profile-edit a.um_delete-item").click(function(e){if(e.preventDefault(),!confirm("Are you sure that you want to delete this user?"))return!1}),jQuery(".um-profile-nav a").on("touchend",function(e){e.currentTarget.click()})});
|
||||
@@ -1,16 +1,13 @@
|
||||
jQuery(window).load(function() {
|
||||
|
||||
jQuery( window ).on( 'load',function() {
|
||||
um_responsive();
|
||||
um_modal_responsive();
|
||||
|
||||
});
|
||||
|
||||
jQuery(window).resize(function() {
|
||||
jQuery(window).on( 'resize', function() {
|
||||
responsive_Modal();
|
||||
|
||||
|
||||
jQuery('img.cropper-hidden').cropper('destroy');
|
||||
|
||||
|
||||
um_responsive();
|
||||
um_modal_responsive();
|
||||
|
||||
});
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
jQuery(window).load(function(){um_responsive(),um_modal_responsive()}),jQuery(window).resize(function(){responsive_Modal(),jQuery("img.cropper-hidden").cropper("destroy"),um_responsive(),um_modal_responsive()});
|
||||
jQuery(window).on("load",function(){um_responsive(),um_modal_responsive()}),jQuery(window).on("resize",function(){responsive_Modal(),jQuery("img.cropper-hidden").cropper("destroy"),um_responsive(),um_modal_responsive()});
|
||||
+2683
-5
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -1008,57 +1008,57 @@ if ( ! class_exists( 'um\core\Access' ) ) {
|
||||
/**
|
||||
* Disable comments if user has not permission to access this post
|
||||
*
|
||||
* @param mixed $open
|
||||
* @param int $count
|
||||
* @param int $post_id
|
||||
* @return boolean
|
||||
*/
|
||||
public function disable_comments_open_number( $open, $post_id ) {
|
||||
public function disable_comments_open_number( $count, $post_id ) {
|
||||
static $cache_number = array();
|
||||
|
||||
if ( isset( $cache_number[ $post_id ] ) ) {
|
||||
return $cache_number[ $post_id ] ? $open : false;
|
||||
return $cache_number[ $post_id ];
|
||||
}
|
||||
|
||||
$post = get_post( $post_id );
|
||||
$restriction = $this->get_post_privacy_settings( $post );
|
||||
|
||||
if ( ! $restriction ) {
|
||||
$cache_number[ $post_id ] = $open;
|
||||
return $open;
|
||||
$cache_number[ $post_id ] = $count;
|
||||
return $count;
|
||||
}
|
||||
|
||||
if ( '1' == $restriction['_um_accessible'] ) {
|
||||
|
||||
if ( is_user_logged_in() ) {
|
||||
if ( ! current_user_can( 'administrator' ) ) {
|
||||
$open = false;
|
||||
$count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
} elseif ( '2' == $restriction['_um_accessible'] ) {
|
||||
if ( ! is_user_logged_in() ) {
|
||||
$open = false;
|
||||
$count = 0;
|
||||
} else {
|
||||
if ( ! current_user_can( 'administrator' ) ) {
|
||||
$custom_restrict = $this->um_custom_restriction( $restriction );
|
||||
|
||||
if ( empty( $restriction['_um_access_roles'] ) || false === array_search( '1', $restriction['_um_access_roles'] ) ) {
|
||||
if ( ! $custom_restrict ) {
|
||||
$open = false;
|
||||
$count = 0;
|
||||
}
|
||||
} else {
|
||||
$user_can = $this->user_can( get_current_user_id(), $restriction['_um_access_roles'] );
|
||||
|
||||
if ( ! isset( $user_can ) || ! $user_can || ! $custom_restrict ) {
|
||||
$open = false;
|
||||
$count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$cache_number[ $post_id ] = $open;
|
||||
return $open;
|
||||
$cache_number[ $post_id ] = $count;
|
||||
return $count;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -376,7 +376,6 @@ function um_prepare_user_query_args( $query_args, $args ) {
|
||||
|
||||
if ( isset( $sortby ) ) {
|
||||
|
||||
|
||||
if ( $sortby == 'other' && $sortby_custom ) {
|
||||
|
||||
$query_args['meta_key'] = $sortby_custom;
|
||||
@@ -448,9 +447,18 @@ add_filter( 'um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2 );
|
||||
*/
|
||||
function um_sortby_last_login( $query_args, $sortby ) {
|
||||
if ( $sortby == 'last_login' ) {
|
||||
$query_args['orderby'] = 'meta_value_num';
|
||||
$query_args['order'] = 'desc';
|
||||
$query_args['meta_key'] = '_um_last_login';
|
||||
$query_args['orderby'] = array( 'um_last_login' => 'DESC' );
|
||||
$query_args['meta_query']['um_last_login'] = array(
|
||||
'relation' => 'OR',
|
||||
array(
|
||||
'key' => '_um_last_login',
|
||||
'compare' => 'EXISTS',
|
||||
),
|
||||
array(
|
||||
'key' => '_um_last_login',
|
||||
'compare' => 'NOT EXISTS',
|
||||
),
|
||||
);
|
||||
}
|
||||
return $query_args;
|
||||
}
|
||||
|
||||
+9
-3
@@ -5,8 +5,8 @@ Contributors: ultimatemember, champsupertramp, nsinelnikov
|
||||
Donate link:
|
||||
Tags: community, member, membership, user-profile, user-registration
|
||||
Requires at least: 4.7
|
||||
Tested up to: 5.0
|
||||
Stable tag: 2.0.40
|
||||
Tested up to: 5.1
|
||||
Stable tag: 2.0.41
|
||||
License: GNU Version 2 or Any Later Version
|
||||
License URI: http://www.gnu.org/licenses/gpl-3.0.txt
|
||||
|
||||
@@ -133,10 +133,11 @@ The plugin works with popular caching plugins by automatically excluding Ultimat
|
||||
|
||||
= Important: UM2.0+ is a significant update to the code base from 1.3.88. Please make sure you take a full-site backup with restore point before updating the plugin =
|
||||
|
||||
= 2.0.40: March XX, 2019 =
|
||||
= 2.0.41: March XX, 2019 =
|
||||
|
||||
* Enhancements:
|
||||
- Clear temp directory on upload process 1 day files old
|
||||
- Updated custom scrollbar JS library to jQuery 3 support
|
||||
|
||||
* Bugfixes:
|
||||
- Fixed Edit Row settings
|
||||
@@ -146,7 +147,12 @@ The plugin works with popular caching plugins by automatically excluding Ultimat
|
||||
- Fixed unique filename issue, upload avatar with high case extension
|
||||
- Fixed member directory filter title
|
||||
- Fixed duplicate delete user handler
|
||||
- Fixed sorting by Last Login date for users without meta
|
||||
|
||||
= 2.0.40: March 12, 2019 =
|
||||
|
||||
* Bugfixes:
|
||||
- Fixed security issue on user Account Update
|
||||
|
||||
= 2.0.39: February 11, 2019 =
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
Plugin Name: Ultimate Member
|
||||
Plugin URI: http://ultimatemember.com/
|
||||
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
|
||||
Version: 2.0.40
|
||||
Version: 2.0.41
|
||||
Author: Ultimate Member
|
||||
Author URI: http://ultimatemember.com/
|
||||
Text Domain: ultimate-member
|
||||
|
||||
Reference in New Issue
Block a user