Quản lý truy cập các trường trong ACF

acf banner
Xem trực tiếp
function manage_acf_field_access($value, $post_id, $field) {
$readonly_fields = [
'dia_chi',
'sdt',
'ten_mien',
'ngay_dang_ky',
'ngay_het_han',
'ngay_dang_ky_host',
'ngay_het_han_host'
];

// Kiểm tra xem người dùng hiện tại có phải là quản trị viên không
if (!current_user_can('administrator')) {
// Nếu đang cập nhật giá trị (acf/update_value)
if (current_filter() === 'acf/update_value') {
if (in_array($field['name'], $readonly_fields)) {
// Trả về giá trị cũ của trường để ngăn người dùng cập nhật
return get_field($field['name'], $post_id);
}
}
// Nếu đang tải giá trị (acf/load_value)
elseif (current_filter() === 'acf/load_value') {
if (in_array($field['name'], $readonly_fields)) {
// Thêm thuộc tính readonly vào trường
add_filter('acf/load_field/name=' . $field['name'], function($field) {
$field['readonly'] = true;
return $field;
});
}
}
}

return $value;
}

add_filter('acf/load_value', 'manage_acf_field_access', 10, 3);
add_filter('acf/update_value', 'manage_acf_field_access', 10, 3);

Giải thích:

  • Dán dòng code vào file function.php
  • Dòng kiểm tra quyền: Mã kiểm tra xem người dùng hiện tại có phải là quản trị viên hay không. acf/update_value: Nếu người dùng cố gắng cập nhật giá trị của trường, mã sẽ kiểm tra xem trường đó có nằm trong danh sách các trường chỉ đọc không. Nếu có, giá trị cũ của trường sẽ được trả về để ngăn chặn người dùng cập nhật. acf/load_value: Khi tải giá trị của trường, mã sẽ kiểm tra xem trường đó có nằm trong danh sách chỉ đọc không và nếu có, thêm thuộc tính readonly vào trường đó.
  • Code này sẽ đảm bảo rằng các trường trong danh sách $readonly_fields sẽ chỉ có thể được chỉnh sửa bởi quản trị viên và sẽ bị khóa (chỉ đọc) đối với người dùng khác.
  • Nếu người dùng vẫn có thể nhập vào trường sau khi thêm thuộc tính disabled, có thể là do thuộc tính này chưa được áp dụng đúng cách hoặc bị ghi đè. Để đảm bảo rằng người dùng không thể tương tác với các trường cụ thể, bạn có thể sử dụng cả thuộc tính readonly và disabled cùng với một đoạn JavaScript để tăng cường khả năng ngăn chặn tương tác.
  • Dưới đây là cách bạn có thể làm:
function manage_acf_field_access($value, $post_id, $field) {
$readonly_fields = [
'dia_chi',
'sdt',
'ten_mien',
'ngay_dang_ky',
'ngay_het_han',
'ngay_dang_ky_host',
'ngay_het_han_host'
];

// Kiểm tra xem người dùng hiện tại có phải là quản trị viên không
if (!current_user_can('administrator')) {
if (in_array($field['name'], $readonly_fields)) {
// Thêm thuộc tính readonly và disabled vào trường
add_filter('acf/load_field/name=' . $field['name'], function($field) {
$field['readonly'] = true;
$field['disabled'] = true;
return $field;
});
}
// Ngăn chặn cập nhật giá trị của trường
if (current_filter() === 'acf/update_value') {
return get_field($field['name'], $post_id);
}
}

return $value;
}

add_filter('acf/load_value', 'manage_acf_field_access', 10, 3);
add_filter('acf/update_value', 'manage_acf_field_access', 10, 3);

Thêm JavaScript Code:

  • Thêm đoạn mã JavaScript này vào phần footer của trang quản trị (hoặc qua hàm acf/input/admin_footer):
function disable_acf_fields_script() {
?>
<script type="text/javascript">
(function($) {
$(document).ready(function() {
var readonlyFields = [
'input[name="acf[dia_chi]"]',
'input[name="acf[sdt]"]',
'input[name="acf[ten_mien]"]',
'input[name="acf[ngay_dang_ky]"]',
'input[name="acf[ngay_het_han]"]',
'input[name="acf[ngay_dang_ky_host]"]',
'input[name="acf[ngay_het_han_host]"]'
];

readonlyFields.forEach(function(selector) {
$(selector).attr('readonly', true).attr('disabled', true).css('pointer-events', 'none');
});
});
})(jQuery);
</script>
<?php
}

add_action('acf/input/admin_footer', 'disable_acf_fields_script');

Giải thích:
readonly và disabled: Thuộc tính này đảm bảo rằng trường không thể nhập liệu hoặc thay đổi.
JavaScript: JavaScript đảm bảo rằng ngay cả khi thuộc tính disabled hoặc readonly bị bỏ qua bởi trình duyệt hoặc các lý do khác, trường vẫn bị khóa và không thể tương tác. Cụ thể, thuộc tính pointer-events: none sẽ vô hiệu hóa mọi tương tác chuột với trường.

  • Với cách tiếp cận này, bạn có thể chắc chắn rằng người dùng không thể nhập liệu hoặc tương tác với các trường đã được chỉ định.