Foreach get_field_object for ACF



我在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'];
}
?>

ACF文档说get_field_object()最多可以有三个参数,第二个参数是Post ID。如果没有使用Post ID,它将使用当前的Post ID,您也可以使用get_the_ID()检索当前的Post ID。

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

您需要的是一个帖子的Post 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>';
}
?>

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

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

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

  1. 根据get_field_object()的ACF文档,他们说"在某些情况下,可能需要按键加载字段,例如当值尚未保存时。"我发现当试图在循环之外检索字段对象时,字段名不起作用(这就是您在这里所做的,试图显示字段内的所有选项,而不仅仅是与特定帖子相关的选项)。

    另一个挑战是,除非您同步数据库,否则字段键可能在不同环境(本地、登台、生产等)中有所不同。这里有一个函数,可以帮助你根据字段名找到字段键在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));
   }
}

将返回name和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关于如何从WordPress数据库获得高级自定义字段字段键中为什么组名很重要的完整答案?

那么你的代码将是:

$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);
  • 第二个问题是选择、复选框和单选字段的选项被存储为一个数组,在choices键下的字段对象数组中的项中。所以要获得这些你需要使用:
  •   $team_category_choices = $team_category_field['choices'];
    
  • 第三个问题是你的foreach()函数不正确。您需要传递数组并定义如何在内部函数中引用其中的每个数组项键(保存到DB的选择值)和值(UI中显示的选择标签),如下所示:
    foreach($team_category_choices as $choice_value => $choice_label) {
      echo '<option value="' . $choice_value . '">' . $choice_label . '</option>';
    }
    
  • 相关内容

    • 没有找到相关文章

    最新更新