我在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>;
}
?>
我知道这是一个老问题,但是我想把我的答案给那些可能会发现这个问题的人。你的代码有几个问题:
-
根据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
键下的字段对象数组中的项中。所以要获得这些你需要使用: - 第三个问题是你的foreach()函数不正确。您需要传递数组并定义如何在内部函数中引用其中的每个数组项键(保存到DB的选择值)和值(UI中显示的选择标签),如下所示:
foreach($team_category_choices as $choice_value => $choice_label) { echo '<option value="' . $choice_value . '">' . $choice_label . '</option>'; }
$team_category_choices = $team_category_field['choices'];