Разрешить администратору обойти обязательные поля в определенных ситуациях с ACF?
Я создал форму внешнего интерфейса ACF, используя acf_form; эти поля добавляются в запись пользователя на сервере; однако, поскольку эта форма имеет обязательные поля, это означает, что администратор не может вносить базовые изменения в пользователя на сервере, если пользователь не заполнил эту форму.
Поэтому мне интересно, возможно ли в определенных ситуациях разрешить администратору обходить обязательное заполнение обязательных полей, и если да, то как мне это сделать?
1 ответ
Хорошо, нашел способ сделать это - это способ сделать это для экрана пользователя, он может отличаться для других типов сообщений.
Нам нужно не только отключить проверку на стороне сервера, но и проверку на стороне клиента, чтобы сделать это, мы делаем что-то вроде этого:
add_action('acf/input/admin_head', 'my_acf_admin_head');
function my_acf_admin_head() {
if (!function_exists('get_current_screen')) {
return;
}
// Get current page/screen
$screen = get_current_screen();
// Get current user
$user = wp_get_current_user();
if (is_object($screen) and is_a($screen, 'WP_Screen')) {
if (($screen->id == 'user-edit' or ($screen->id == 'user' and $screen->action == 'add')) and in_array('administrator', $user->roles)) {
?>
<script type="text/javascript">
window.acf.validation.active = false;
</script>
<?php
}
}
}
Это добавит Javascript на любую страницу, соответствующую нашим критериям, чтобы отключить проверку ACF на стороне клиента.
Теперь, чтобы отключить проверку бэкэнда, мы делаем что-то вроде этого:
add_action('acf/validate_save_post', 'my_acf_validate_save_post', 10, 0);
function my_acf_validate_save_post() {
if (!function_exists('get_current_screen')) {
return;
}
// Get current page/screen
$screen = get_current_screen();
// Get current user
$user = wp_get_current_user();
if (is_object($screen) and is_a($screen, 'WP_Screen')) {
if (($screen->id == 'user-edit' or ($screen->id == 'user' and $screen->action == 'add')) and in_array('administrator', $user->roles)) {
// clear all errors so they can bypass validation for user data
acf_reset_validation_errors();
}
}
}
Обратите внимание, что, потому что get_current_screen()
не всегда доступны, эти методы не поддерживают интерфейсные формы.
Также обратите внимание, что этот код определенно можно улучшить, чтобы он был намного более СУХИМ, но я оставлю это на ваше усмотрение.:)