Đối với trang WordPress có nhiều người dùng đăng ký, việc bổ sung thêm tính năng cho người dùng là việc cần thiết. Bài viết này hướng dẫn làm hệ thống kinh nghiệm và phân cấp độ cho người dùng.

Hệ thống Kinh Nghiệm và Cấp Độ cho tài khoản WordPress sử dụng ACF

Plugin cần thiết cho chức năng này là Advanced Custom Fields (ACF), tham khảo bài viết này:

Tạo dữ liệu

Bạn cần tạo một trường để lưu dữ liệu kinh nghiệm cho người dùng, chỉ có Administrator mới xem và chỉnh sửa được, như sau.

Phương thức xử lí

Tại functions.php, các bạn thêm các phương thức cộng kinh nghiệm và phân cấp cho thành viên như sau.

/*
 * Cộng kinh nghiệm
 */
function add_exp($quan) {
	$res = false;
	if (is_user_logged_in()) {
		$curr_user_id = get_current_user_id();
		$exp = get_field('exp', 'user_' . $curr_user_id);
		if (!$exp) $exp = 0;
		$exp += $quan;
		if ($exp < 0) $exp = 0;
		update_field('exp', $exp, 'user_' . $curr_user_id);
		$res = true;
	}
	return $res;
}

Mình tạo sẵn 70 cấp độ theo các mốc kinh nghiệm 1, 200, 500, 900, 1400, 2000, 2600, 3200, 3800, 4200, 4800, 5400, 6000, 6600, 7200, 7800, 8400, 9000, 9600, 10200, 10800, 11400, 12000, 12700, 13400, 14100, 14800, 15500, 16200, 16900, 17600, 18300, 19000, 19800, 20600, 21400, 22200, 23000, 23800, 24600, 25400, 26200, 27000, 27900, 28800, 29700, 30600, 31500, 32400, 33000, 33900, 34800, 35700, 36600, 37500, 38400, 39300, 40200, 41100, 42000, 43000, 44000, 45000, 46000, 47000, 48000, 49000, 50000, 51000, 52000 ở biến $lvl_point.

Bạn có thể tùy chỉnh tên cấp độ ở biến $lvl_label.

/*
 * Cấp độ thành viên theo kinh nghiệm
 */
function get_user_level($exp) {
	$lvl = [];
	$lvl_point = [1, 200, 500, 900, 1400, 2000, 2600, 3200, 3800, 4200, 4800, 5400, 6000, 6600, 7200, 7800, 8400, 9000, 9600, 10200, 10800, 11400, 12000, 12700, 13400, 14100, 14800, 15500, 16200, 16900, 17600, 18300, 19000, 19800, 20600, 21400, 22200, 23000, 23800, 24600, 25400, 26200, 27000, 27900, 28800, 29700, 30600, 31500, 32400, 33000, 33900, 34800, 35700, 36600, 37500, 38400, 39300, 40200, 41100, 42000, 43000, 44000, 45000, 46000, 47000, 48000, 49000, 50000, 51000, 52000];
	$lvl_label = ['Level 1', 'Level 2', 'Level 3', 'Level 4', 'Level 5', 'Level 6', 'Level 7', 'Level 8', 'Level 9', 'Level 10', 'Level 11', 'Level 12', 'Level 13', 'Level 14', 'Level 15', 'Level 16', 'Level 17', 'Level 18', 'Level 19', 'Level 20', 'Level 21', 'Level 22', 'Level 23', 'Level 24', 'Level 25', 'Level 26', 'Level 27', 'Level 28', 'Level 29', 'Level 30', 'Level 31', 'Level 32', 'Level 33', 'Level 34', 'Level 35', 'Level 36', 'Level 37', 'Level 38', 'Level 39', 'Level 40', 'Level 41', 'Level 42', 'Level 43', 'Level 44', 'Level 45', 'Level 46', 'Level 47', 'Level 48', 'Level 49', 'Level 50', 'Level 51', 'Level 52', 'Level 53', 'Level 54', 'Level 55', 'Level 56', 'Level 57', 'Level 58', 'Level 59', 'Level 60', 'Level 61', 'Level 62', 'Level 63', 'Level 64', 'Level 65', 'Level 66', 'Level 67', 'Level 68', 'Level 69', 'Level 70'];
	if ($exp < $lvl_point[1]) {
		$lvl[0] = 1;
		$lvl[1] = $lvl_label[0];
	} elseif ($exp < $lvl_point[2]) {
		$lvl[0] = 2;
		$lvl[1] = $lvl_label[1];
	} elseif ($exp < $lvl_point[3]) {
		$lvl[0] = 3;
		$lvl[1] = $lvl_label[2];
	} elseif ($exp < $lvl_point[4]) {
		$lvl[0] = 4;
		$lvl[1] = $lvl_label[3];
	} elseif ($exp < $lvl_point[5]) {
		$lvl[0] = 5;
		$lvl[1] = $lvl_label[4];
	} elseif ($exp < $lvl_point[6]) {
		$lvl[0] = 6;
		$lvl[1] = $lvl_label[5];
	} elseif ($exp < $lvl_point[7]) {
		$lvl[0] = 7;
		$lvl[1] = $lvl_label[6];
	} elseif ($exp < $lvl_point[8]) {
		$lvl[0] = 8;
		$lvl[1] = $lvl_label[7];
	} elseif ($exp < $lvl_point[9]) {
		$lvl[0] = 9;
		$lvl[1] = $lvl_label[8];
	} elseif ($exp < $lvl_point[10]) {
		$lvl[0] = 10;
		$lvl[1] = $lvl_label[9];
	} elseif ($exp < $lvl_point[11]) {
		$lvl[0] = 11;
		$lvl[1] = $lvl_label[10];
	} elseif ($exp < $lvl_point[12]) {
		$lvl[0] = 12;
		$lvl[1] = $lvl_label[11];
	} elseif ($exp < $lvl_point[13]) {
		$lvl[0] = 13;
		$lvl[1] = $lvl_label[12];
	} elseif ($exp < $lvl_point[14]) {
		$lvl[0] = 14;
		$lvl[1] = $lvl_label[13];
	} elseif ($exp < $lvl_point[15]) {
		$lvl[0] = 15;
		$lvl[1] = $lvl_label[14];
	} elseif ($exp < $lvl_point[16]) {
		$lvl[0] = 16;
		$lvl[1] = $lvl_label[15];
	} elseif ($exp < $lvl_point[17]) {
		$lvl[0] = 17;
		$lvl[1] = $lvl_label[16];
	} elseif ($exp < $lvl_point[18]) {
		$lvl[0] = 18;
		$lvl[1] = $lvl_label[17];
	} elseif ($exp < $lvl_point[19]) {
		$lvl[0] = 19;
		$lvl[1] = $lvl_label[18];
	} elseif ($exp < $lvl_point[20]) {
		$lvl[0] = 20;
		$lvl[1] = $lvl_label[19];
	} elseif ($exp < $lvl_point[21]) {
		$lvl[0] = 21;
		$lvl[1] = $lvl_label[20];
	} elseif ($exp < $lvl_point[22]) {
		$lvl[0] = 22;
		$lvl[1] = $lvl_label[21];
	} elseif ($exp < $lvl_point[23]) {
		$lvl[0] = 23;
		$lvl[1] = $lvl_label[22];
	} elseif ($exp < $lvl_point[24]) {
		$lvl[0] = 24;
		$lvl[1] = $lvl_label[23];
	} elseif ($exp < $lvl_point[25]) {
		$lvl[0] = 25;
		$lvl[1] = $lvl_label[24];
	} elseif ($exp < $lvl_point[26]) {
		$lvl[0] = 26;
		$lvl[1] = $lvl_label[25];
	} elseif ($exp < $lvl_point[27]) {
		$lvl[0] = 27;
		$lvl[1] = $lvl_label[26];
	} elseif ($exp < $lvl_point[28]) {
		$lvl[0] = 28;
		$lvl[1] = $lvl_label[27];
	} elseif ($exp < $lvl_point[29]) {
		$lvl[0] = 29;
		$lvl[1] = $lvl_label[28];
	} elseif ($exp < $lvl_point[30]) {
		$lvl[0] = 30;
		$lvl[1] = $lvl_label[29];
	} elseif ($exp < $lvl_point[31]) {
		$lvl[0] = 31;
		$lvl[1] = $lvl_label[30];
	} elseif ($exp < $lvl_point[32]) {
		$lvl[0] = 32;
		$lvl[1] = $lvl_label[31];
	} elseif ($exp < $lvl_point[33]) {
		$lvl[0] = 33;
		$lvl[1] = $lvl_label[32];
	} elseif ($exp < $lvl_point[34]) {
		$lvl[0] = 34;
		$lvl[1] = $lvl_label[33];
	} elseif ($exp < $lvl_point[35]) {
		$lvl[0] = 35;
		$lvl[1] = $lvl_label[34];
	} elseif ($exp < $lvl_point[36]) {
		$lvl[0] = 36;
		$lvl[1] = $lvl_label[35];
	} elseif ($exp < $lvl_point[37]) {
		$lvl[0] = 37;
		$lvl[1] = $lvl_label[36];
	} elseif ($exp < $lvl_point[38]) {
		$lvl[0] = 38;
		$lvl[1] = $lvl_label[37];
	} elseif ($exp < $lvl_point[39]) {
		$lvl[0] = 39;
		$lvl[1] = $lvl_label[38];
	} elseif ($exp < $lvl_point[40]) {
		$lvl[0] = 40;
		$lvl[1] = $lvl_label[39];
	} elseif ($exp < $lvl_point[41]) {
		$lvl[0] = 41;
		$lvl[1] = $lvl_label[40];
	} elseif ($exp < $lvl_point[42]) {
		$lvl[0] = 42;
		$lvl[1] = $lvl_label[41];
	} elseif ($exp < $lvl_point[43]) {
		$lvl[0] = 43;
		$lvl[1] = $lvl_label[42];
	} elseif ($exp < $lvl_point[44]) {
		$lvl[0] = 44;
		$lvl[1] = $lvl_label[43];
	} elseif ($exp < $lvl_point[45]) {
		$lvl[0] = 45;
		$lvl[1] = $lvl_label[44];
	} elseif ($exp < $lvl_point[46]) {
		$lvl[0] = 46;
		$lvl[1] = $lvl_label[45];
	} elseif ($exp < $lvl_point[47]) {
		$lvl[0] = 47;
		$lvl[1] = $lvl_label[46];
	} elseif ($exp < $lvl_point[48]) {
		$lvl[0] = 48;
		$lvl[1] = $lvl_label[47];
	} elseif ($exp < $lvl_point[49]) {
		$lvl[0] = 49;
		$lvl[1] = $lvl_label[48];
	} elseif ($exp < $lvl_point[50]) {
		$lvl[0] = 50;
		$lvl[1] = $lvl_label[49];
	} elseif ($exp < $lvl_point[51]) {
		$lvl[0] = 51;
		$lvl[1] = $lvl_label[50];
	} elseif ($exp < $lvl_point[52]) {
		$lvl[0] = 52;
		$lvl[1] = $lvl_label[51];
	} elseif ($exp < $lvl_point[53]) {
		$lvl[0] = 53;
		$lvl[1] = $lvl_label[52];
	} elseif ($exp < $lvl_point[54]) {
		$lvl[0] = 54;
		$lvl[1] = $lvl_label[53];
	} elseif ($exp < $lvl_point[55]) {
		$lvl[0] = 55;
		$lvl[1] = $lvl_label[54];
	} elseif ($exp < $lvl_point[56]) {
		$lvl[0] = 56;
		$lvl[1] = $lvl_label[55];
	} elseif ($exp < $lvl_point[57]) {
		$lvl[0] = 57;
		$lvl[1] = $lvl_label[56];
	} elseif ($exp < $lvl_point[58]) {
		$lvl[0] = 58;
		$lvl[1] = $lvl_label[57];
	} elseif ($exp < $lvl_point[59]) {
		$lvl[0] = 59;
		$lvl[1] = $lvl_label[58];
	} elseif ($exp < $lvl_point[60]) {
		$lvl[0] = 60;
		$lvl[1] = $lvl_label[59];
	} elseif ($exp < $lvl_point[61]) {
		$lvl[0] = 61;
		$lvl[1] = $lvl_label[60];
	} elseif ($exp < $lvl_point[62]) {
		$lvl[0] = 62;
		$lvl[1] = $lvl_label[61];
	} elseif ($exp < $lvl_point[63]) {
		$lvl[0] = 63;
		$lvl[1] = $lvl_label[62];
	} elseif ($exp < $lvl_point[64]) {
		$lvl[0] = 64;
		$lvl[1] = $lvl_label[63];
	} elseif ($exp < $lvl_point[65]) {
		$lvl[0] = 65;
		$lvl[1] = $lvl_label[64];
	} elseif ($exp < $lvl_point[66]) {
		$lvl[0] = 66;
		$lvl[1] = $lvl_label[65];
	} elseif ($exp < $lvl_point[67]) {
		$lvl[0] = 67;
		$lvl[1] = $lvl_label[66];
	} elseif ($exp < $lvl_point[68]) {
		$lvl[0] = 68;
		$lvl[1] = $lvl_label[67];
	} elseif ($exp < $lvl_point[69]) {
		$lvl[0] = 69;
		$lvl[1] = $lvl_label[68];
	} else {
		$lvl[0] = 70;
		$lvl[1] = $lvl_label[69];
	}
	return $lvl;
}

Các trường hợp cộng kinh nghiệm

Cộng kinh nghiệm khi gửi bình luận.

add_action('comment_post', 'action_function_name_6083', 10, 3);
function action_function_name_6083($comment_ID, $comment_approved, $commentdata) {
	if ($comment_approved == 1) {
		$a_e = add_exp(1);
	}
}

Tham khảo thêm:

Chúc các bạn thành công!

5/5 (5 bình chọn)