我正在使用带有后期类型的高级自定义字段。我有一些选择自定义字段,我想显示每个字段的所有标签选择。
我试过这种方式。
$field = get_field_object('hair_color');
$hair = $field["choices"];
foreach($hair as $value){
做一个
的var_dump($场)
它显示为空:
array(18) {
["key"] => string(16) "field_hair_color"
["label"] => string(0) ""
["name"] => string(10) "hair_color"
["_name"] => string(10) "hair_color"
["type"]=> string(4) "text"
["order_no"]=> int(1)
["instructions"]=> string(0) ""
["required"]=> int(0)
["id"] => string(20) "acf-field-hair_color"
["class"] => string(4) "text"
["conditional_logic"] => array(3) {
["status"] => int(0)
["allorany"]=> string(3) "all"
["rules"]=> int(0)
}
["default_value"] => string(0) ""
["formatting"] => string(4) "html"
["maxlength"] => string(0) ""
["placeholder"] => string(0) ""
["prepend"] => string(0) ""
["append"] => string(0) ""
["value"] => bool(false)
}
获得满满的唯一方法是:
get_field_object( 'field_51ac9d333d704');
array(17) {
["key"] => string(19) "field_51ac9d333d704"
["label"] => string(13) "Color de pelo"
["name"] => string(10) "hair_color"
["_name"] => string(10) "hair_color"
["type"] => string(6) "select"
["order_no"] => int(9)
["instructions"] => string(27) "Selecciona el color de pelo"
["required"] => int(0)
["id"] => string(20) "acf-field-hair_color"
["class"] => string(6) "select"
["conditional_logic"] => array(3) {
["status"] => int(0)
["rules"] => array(1) {
[0] => array(3) {
["field"] => string(19) "field_5195ef9879361"
["operator"] => string(2) "=="
["value"] => string(5) "small"
}
}
["allorany"] => string(3) "all"
}
["choices"] => array(5) {
["bald"] => string(5) "Calvo"
["brown"] => string(8) "Castaño"
["brunette"] => string(6) "Moreno"
["red"] => string(9) "Pelirrojo"
["blonde"] => string(5) "Rubio"
}
["default_value"] => string(0) ""
["allow_null"] => int(1)
["multiple"] => int(0)
["field_group"] => int(90679)
["value"]=> bool(false)
}
但我有3个环境,我不想对字段键进行硬编码。
有什么解决方案吗? 提前谢谢。
答案 0 :(得分:7)
我自己试图这样做,所以我做了一些调查。似乎ACF的每个字段和字段组都存储在数据库的wp_posts表中作为自定义帖子类型。字段是'acf-field',组是'acf-field-group'。
我能够使用此函数获取字段键,然后在没有该字段的帖子上使用update_field($ field_key,$ value)。
function get_acf_key($field_name){
global $wpdb;
return $wpdb->get_var("
SELECT post_name
FROM $wpdb->posts
WHERE post_type='acf-field' AND post_excerpt='$field_name';
");
}
然后我就可以使用:
update_field(get_acf_key('my_field_name'), 'some value', $post_id);
要么为已经拥有该帖子的帖子更新字段,要么添加该字段,并且它是对尚未包含该字段的帖子的关键引用。
答案 1 :(得分:7)
以下是@BFDatabaseAdmin提供的答案的修改版本,该答案与“LIKE”中的确切meta_value相匹配
function get_acf_key($field_name) {
global $wpdb;
$length = strlen($field_name);
$sql = "
SELECT `meta_key`
FROM {$wpdb->postmeta}
WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%\"name\";s:$length:\"$field_name\";%';
";
return $wpdb->get_var($sql);
}
答案 2 :(得分:6)
我在混音中抛出另一个选项。我认为现有的答案是好的,但除非您查看父组,否则您永远不会获得可靠的字段键,因为字段名称可以存在于多个组中。
例如,假设您有两个自定义组 - 一个用于帖子类型书籍,另一个用于自定义帖子类型电影。两个小组都添加了一个名为title的字段。
在数据库中,两者都存储有post_except = 'title'
和post_type = 'acf-field'
。两个条目具有相同的post_except
,因此在post_except
上仅依赖 的任何查询都将是错误的,不管是否为通配符。
依赖帖子ID的任何查询都不是很好,因为传入的帖子可能并不总是存在。
因此,您需要传入字段和组的组合以从名称中获取字段键。这段代码对我很有用:
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
答案 3 :(得分:5)
ACF提供了一些简单的方法来帮助保持多个环境同步 - 您可以使用PHP或本地JSON文件注册字段。这样做可以让您在多个环境中使用带有单个字段键的get_field_object()。参见:
http://www.advancedcustomfields.com/resources/register-fields-via-php/
http://www.advancedcustomfields.com/resources/local-json/
我通常使用用户界面进行ACF开发,然后将所有字段组导出为PHP,以便在多个环境中进行部署。
更新一个简单示例: 您可以将它添加到functions.php或自定义插件中,以便以编程方式将您的字段添加到多个环境中。然后在所有环境中使用公共field_key调用get_field_object()
add_action('acf/init', 'wp123_add_local_acf_fields');
function wp123_add_local_acf_fields() {
acf_add_local_field_group(array(
'key' => 'group_1',
'title' => 'My Group',
'fields' => array (
array (
'key' => 'field_51ac9d333d704',
'label' => 'Color de pelo',
'name' => 'hair_color',
'type' => 'select',
'instructions' => 'Selecciona el color de pelo'
'required' => 0,
'choices' => array (
'bald' => 'Calvo',
'brown' => 'Castaño',
'brunette' => 'Moreno',
'red' => 'Pelirrojo',
'blonde' => 'Rubio',
),
'default_value' => array (
),
'allow_null' => 1,
'multiple' => 0,
)
),
'location' => array (
array (
array (
'param' => 'post_type',
'operator' => '==',
'value' => 'post',
),
),
),
));
}
答案 4 :(得分:3)
ACF的工作方式你应该使用密钥。
来自(http://www.advancedcustomfields.com/resources/get_field_object/)
“你可以而且应该100%使用$ field_key。
使用$ field_name的问题是,如果引用尚不存在,ACF将无法找到字段对象,也无法保存该值。如果您使用代码插入帖子,则会出现这种情况。
此外,使用field_key作为update_field函数中的第一个参数更有效率,因为它绕过了参考查找。“
答案 5 :(得分:2)
没有办法使用名称可靠地检索密钥,因为名称是元数据,因此可以更改,而密钥(至少不手动编辑数据库)则不然。
但是,此功能适用于最新版本的ACF,但需要注意几点。 ACF在帖子中创建字段组作为自定义帖子类型的ACF,但有关字段本身的所有数据都保存在post_meta表中。
function get_acf_key($field_name) {
global $wpdb;
return $wpdb->get_var("
SELECT `meta_key`
FROM $wpdb->postmeta
WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%$field_name%';
");
}
警告: 因为字段名称存储为数组的一部分,当通过SQL查找时,您必须依赖通配符搜索,该搜索是错误。只要你的所有字段都有完全不同的名字,你就可以了,但是如果你有一个名为“farm”的字段而另一个名为“farmer”,则会出错,因为它会找到两个字段。
更新字段的唯一可靠方法是手动对密钥进行编码,尽管这无疑是笨拙的,这就是我在这里开始的原因。
答案 6 :(得分:1)
正确的方法是使用acf_maybe_get_field
函数,就像这样:
acf_maybe_get_field( 'field_name', false, false );
自变量为:field name
,post id
(默认为当前帖子)和最重要的strict
,默认为true
,但我们将其设置为 false
在此处获取字段对象,即使该字段尚不存在。
答案 7 :(得分:-1)
遇到同样的问题,最终也使用了密钥,导致我陷入了另一种死胡同,无法正常获取密钥值,但是幸运的是遇到了这个问题。
来自-https://wordpress.stackexchange.com/questions/248006/acf-add-fields-values-to-newly-inserted-post
function acf_getValue($fieldname, $post_id){
if(($value = get_field($fieldname, $post_id)))
return $value;
$value = get_post_meta($post_id, $fieldname);
return $value[0];
}
function acf_updateValue($fieldname, $value, $post_id){
$field_key = 'field_' . uniqid();
update_post_meta($post_id, $fieldname, $value);
update_post_meta($post_id, '_'.$fieldname, $field_key);
update_field($field_key, $value, $post_id);
}
在其中acf_updateValue模拟您手动保存时ACF自身如何完成。由于仅update_field不足以容纳ACF列