【问题标题】:Hide certain Advanced Custom Fields from non admins对非管理员隐藏某些高级自定义字段
【发布时间】:2016-09-03 20:01:35
【问题描述】:

我使用 ACF 的“灵活内容”创建了一个相当先进的“页面构建器”,作者可以在其中创建一个“部分”(基本上只是一个带有 CSS 类名称和 ID 的包装元素),然后添加我所有的灵活内容(图像,所见即所得等)。

我想做的是为非管理员隐藏一些字段。我不希望任何旧编辑器能够进入并更改部分的 ID 或类名(因为它会弄乱布局)。

我知道 ACF 管理员中的“规则”面板,您可以在其中选择仅向一种类型的用户角色显示某个 字段组,但我想要的是同样的东西但对于个别领域。

从管理界面似乎不可行,但我想知道是否有人知道如何从我的 functions.php 文件中完成?也许我可以根据当前用户的角色挂钩并禁用某些字段的过滤器或操作?

我附上了两张截图,显示了我想要隐藏的内容:

我想从“添加行”菜单中隐藏这些选项:

我希望这些面板对非管理员不可见:

编辑:当我们这样做时,我不介意将单个字段也隐藏在可重复项中。您会在第一个屏幕截图中注意到“修饰符”字段,对非管理员隐藏也很不错。我想这两个问题的解决方案几乎相同?

【问题讨论】:

    标签: php wordpress advanced-custom-fields


    【解决方案1】:

    从 ACF 5.0.0 开始,有一种更简单的方法可以做到这一点,而无需禁用字段或输出 CSS。如果您使用acf/prepare_field 挂钩并返回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/

    【讨论】:

      【解决方案2】:

      我没有设法真正隐藏这些字段,但我设法禁用它们。不幸的是,仅仅在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>';
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 2011-11-18
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多