对非管理员隐藏某些高级自定义字段
Hide certain Advanced Custom Fields from non admins
我使用 ACF 的 "Flexible Content" 创建了一个相当高级的 "page builder",作者可以在其中创建一个 "section"(基本上只是一个带有 CSS class 名称和 ID),然后将我所有的灵活内容(图像、所见即所得等)添加到其中。
我想做的是为非管理员隐藏一些字段。我不希望任何旧编辑器能够进入并更改部分的 ID 或 class 名称(因为它会弄乱布局)。
我知道 ACF 管理中的 "Rules" 面板,您可以在其中选择仅向一种类型的用户角色显示特定的 字段组 ,但是我想要的是同样的东西,但对于个别领域。
它似乎无法从管理界面执行,但我想知道是否有人知道如何从我的 functions.php 文件中完成?也许我可以挂钩某些过滤器或操作并根据当前用户的角色禁用某些字段?
我附上了两个屏幕截图,显示了我想要隐藏的内容:
我想从 "Add row" 菜单中隐藏这些选项:
而且我希望这些面板对非管理员不可见:
编辑:当我们这样做时,我不介意也从可重复项中隐藏个别字段。您会注意到第一个屏幕截图中的 "Modifiers" 字段,对于非管理员来说也很不错。我想这两个问题的解决方案几乎相同?
我实际上隐藏这些字段,但我设法禁用了它们。不幸的是,仅在 acf/load_field
操作中将它们设置为禁用不足以将它们从下拉菜单中删除,因此我还在管理页面中添加了一些 CSS 以至少在视觉上隐藏它们。这已经足够好了,因为网站的编辑们不会竭尽全力破坏它。
<?php
/**
* Hide some "ACF Section" related custom fields
*/
add_action('acf/load_field', 'sleek_hide_acf_section_fields', 10, 1);
function sleek_hide_acf_section_fields ($field) {
$hide = array('section_name', 'section_modifiers', 'modifiers');
global $current_user;
if ((isset($field['_name']) and in_array($field['_name'], $hide)) and (is_admin() && is_user_logged_in() && !in_array('administrator', $current_user->roles))) {
$field['disabled'] = true;
}
return $field;
}
add_action('admin_head', 'sleek_hide_acf_section_fields_css');
function sleek_hide_acf_section_fields_css () {
$hide = array('section_name', 'section_modifiers', 'modifiers');
global $current_user;
if (is_admin() && is_user_logged_in() && !in_array('administrator', $current_user->roles)) {
echo '<style>';
foreach ($hide as $h) {
echo 'div.acf-fc-popup a[data-layout="' . $h . '"]{display: none}';
}
echo '</style>';
}
}
从 ACF 5.0.0 开始,有一种更简单的方法可以执行此操作,而无需禁用该字段或输出 CSS。如果您使用 acf/prepare_field
挂钩和 return false
字段将不会呈现。
<?php
function so37111468_hide_field( $field ) {
// hide the field if the current user is not able to save options within the admin
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
return $field;
}
add_filter( 'acf/prepare_field/key=MYFIELDKEY', 'so37111468_hide_field' );
?>
可在此处找到该过滤器的文档:https://www.advancedcustomfields.com/resources/acf-prepare_field/
我使用 ACF 的 "Flexible Content" 创建了一个相当高级的 "page builder",作者可以在其中创建一个 "section"(基本上只是一个带有 CSS class 名称和 ID),然后将我所有的灵活内容(图像、所见即所得等)添加到其中。
我想做的是为非管理员隐藏一些字段。我不希望任何旧编辑器能够进入并更改部分的 ID 或 class 名称(因为它会弄乱布局)。
我知道 ACF 管理中的 "Rules" 面板,您可以在其中选择仅向一种类型的用户角色显示特定的 字段组 ,但是我想要的是同样的东西,但对于个别领域。
它似乎无法从管理界面执行,但我想知道是否有人知道如何从我的 functions.php 文件中完成?也许我可以挂钩某些过滤器或操作并根据当前用户的角色禁用某些字段?
我附上了两个屏幕截图,显示了我想要隐藏的内容:
我想从 "Add row" 菜单中隐藏这些选项:
而且我希望这些面板对非管理员不可见:
编辑:当我们这样做时,我不介意也从可重复项中隐藏个别字段。您会注意到第一个屏幕截图中的 "Modifiers" 字段,对于非管理员来说也很不错。我想这两个问题的解决方案几乎相同?
我实际上隐藏这些字段,但我设法禁用了它们。不幸的是,仅在 acf/load_field
操作中将它们设置为禁用不足以将它们从下拉菜单中删除,因此我还在管理页面中添加了一些 CSS 以至少在视觉上隐藏它们。这已经足够好了,因为网站的编辑们不会竭尽全力破坏它。
<?php
/**
* Hide some "ACF Section" related custom fields
*/
add_action('acf/load_field', 'sleek_hide_acf_section_fields', 10, 1);
function sleek_hide_acf_section_fields ($field) {
$hide = array('section_name', 'section_modifiers', 'modifiers');
global $current_user;
if ((isset($field['_name']) and in_array($field['_name'], $hide)) and (is_admin() && is_user_logged_in() && !in_array('administrator', $current_user->roles))) {
$field['disabled'] = true;
}
return $field;
}
add_action('admin_head', 'sleek_hide_acf_section_fields_css');
function sleek_hide_acf_section_fields_css () {
$hide = array('section_name', 'section_modifiers', 'modifiers');
global $current_user;
if (is_admin() && is_user_logged_in() && !in_array('administrator', $current_user->roles)) {
echo '<style>';
foreach ($hide as $h) {
echo 'div.acf-fc-popup a[data-layout="' . $h . '"]{display: none}';
}
echo '</style>';
}
}
从 ACF 5.0.0 开始,有一种更简单的方法可以执行此操作,而无需禁用该字段或输出 CSS。如果您使用 acf/prepare_field
挂钩和 return false
字段将不会呈现。
<?php
function so37111468_hide_field( $field ) {
// hide the field if the current user is not able to save options within the admin
if ( ! current_user_can( 'manage_options' ) ) {
return false;
}
return $field;
}
add_filter( 'acf/prepare_field/key=MYFIELDKEY', 'so37111468_hide_field' );
?>
可在此处找到该过滤器的文档:https://www.advancedcustomfields.com/resources/acf-prepare_field/