【问题标题】:Foreach get_field_object for ACFForeach 获取 ACF 的 get_field_object
【发布时间】:2014-09-19 20:51:50
【问题描述】:

我在 wordpress 上有一个自定义字段,它定义了一个选择选项

one : First
two : Second
three : Third
four : Fourth

我正在尝试以选择形式在前端调用这些选项,即

<select id="filters">
  <option value="*">show all</option>
  <option value="one">First</option>
  <option value="two">Two</option>
  <option value="three">Third</option>
  <option value="four"Fourth</option>
</select>

这是我到目前为止得到的,它似乎没有工作:

<?php 
$field_name = "team_category";
$field = get_field_object($field_name);

foreach($field){
  echo $field['label'] . ': ' . $field['value'];
}
?>

【问题讨论】:

    标签: php wordpress advanced-custom-fields


    【解决方案1】:

    The ACF documentation says get_field_object() can have up to three parameters,而第二个是 Post ID。如果没有使用 Post ID,它将使用当前 ID,您也可以使用 get_the_ID() 检索该 ID。

    但很可能,您希望将这些选项放在另一个页面上(例如,您开发的搜索页面)。假设您创建了一个页面模板。您要搜索的是带有 post_type 'teams' 的帖子。因此,post_type 'page' 没有名为“team_category”的自定义字段,并且当前的帖子 ID 不会返回任何对象。

    您需要的是实际包含搜索字段的帖子的帖子 ID。这应该是动态的。

    我们试试

    <?php
    global $wpdb;
    $field_name = "team_category";
    $sql = $wpdb->prepare( "select post_id from " . $wpdb->prefix . "postmeta where meta_key = %s limit 0,1 ", $field_name);
    $post = $wpdb->get_results( $sql );
    
    $field = get_field_object( $field_name, $post[0]->post_id );
    
    if( $field )
    {
        echo '<select name="' . $field['key'] . '">';
            foreach( $field['choices'] as $k => $v )
            {
                echo '<option value="' . $k . '">' . $v . '</option>';
            }
        echo '</select>';
    }
    ?>
    

    【讨论】:

      【解决方案2】:

      我认为这可能更接近您正在寻找的东西。

          foreach($field as $field_item){
          echo '<option value="'.$field_item['value'].'">' . $field_item['label'] . ': '</option>;
          }
      ?>
      

      【讨论】:

      • 这不起作用,我认为可能是查询本身不起作用。
      • 怎么没用?也许您可以提供更多信息。通常,在使用 ACF 时,我不使用 get_field_object() 函数。我通常只使用get_field() 或在转发器字段的情况下使用get_sub_field()。 ACF 网站有一些很棒的资源。 advancedcustomfields.com/resources/getting-started/…
      【解决方案3】:

      我知道这是一个老问题,但我想把我的答案抛给可能会发现这个问题的其他人。您的代码有几个问题:

      1. 根据ACF docs for get_field_object(),他们说“在某些情况下,可能需要通过其键加载字段,例如尚未保存值时。” 我发现在尝试检索循环外的字段对象时字段名称不起作用(这是您在此处尝试显示字段中的所有选项,而不仅仅是与特定选项相关的选项)发布)。

        另一个挑战是字段键可能因环境(本地、暂存、生产等)而异,除非您同步数据库。所以这里有一个函数,可以帮助你在任何时候需要在get_field_object()等函数中使用它,通过字段名找到字段键:

      if (! function_exists('acf_field_from_name')) {
      
         function acf_field_from_name($field, $group)
         {
             global $wpdb;
      
             return $wpdb->get_var($wpdb->prepare("
                 SELECT post.post_name as field_name
                 FROM $wpdb->posts AS post
                 LEFT JOIN $wpdb->posts AS parent
                     ON post.post_parent = parent.id
                 WHERE post.post_excerpt = %s
                     AND post.post_type = 'acf-field'
                     AND parent.post_excerpt = %s
                     AND parent.post_type = 'acf-field-group'
             ", $field, $group));
         }
      }
      

      将从名称和组返回字段键,如果不存在则返回 null。

      用法:

      acf_field_from_name('title', 'movie-fields'); // returns field_3333333333333
      
      acf_field_from_name('title', 'book-fields'); // returns field_4444444444444
      
      acf_field_from_name('plumbus', 'movie'); // returns null
      

      查看@Chris 的完整回答,了解为什么How to get Advanced Custom Fields field key from WordPress database? 中的组名很重要

      那么您的代码将是:

      $field_name = "team_category";
      $group_name = "team_fields";
      $field_key = acf_field_from_name($field_name, $group_name);
      $team_category_field = get_field_object($field_key);
      
      1. 第二个问题是选择、复选框和单选字段的选项作为数组存储在字段对象数组中的项内,键为choices。因此,要获得您需要使用的那些:
        $team_category_choices = $team_category_field['choices'];
      
      1. 第三个问题是你的foreach()函数不正确。您需要传递数组并定义其中的每个数组项键(选择值保存到 DB)和值(UI 中显示的选择标签)将如何在内部函数中被引用,如下所示:
      foreach($team_category_choices as $choice_value => $choice_label) {
        echo '<option value="' . $choice_value . '">' . $choice_label . '</option>';
      }
      

      【讨论】:

        猜你喜欢
        • 2019-06-03
        • 2020-06-02
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2019-07-16
        • 2021-11-09
        • 2023-03-08
        • 2019-09-28
        相关资源
        最近更新 更多