Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从WordPress数据库中获取高级自定义字段键?_Wordpress_Custom Fields_Advanced Custom Fields - Fatal编程技术网

如何从WordPress数据库中获取高级自定义字段键?

如何从WordPress数据库中获取高级自定义字段键?,wordpress,custom-fields,advanced-custom-fields,Wordpress,Custom Fields,Advanced Custom Fields,我正在使用post类型的高级自定义字段。我有一些选择自定义字段,我想显示每个字段的所有标签选择 我试过这种方法 $field = get_field_object('hair_color'); $hair = $field["choices"]; foreach($hair as $value){ 做一个 变量转储($field) 它看起来是空的: array(18) { ["key"] => string(16) "field_hair_color" ["lab

我正在使用post类型的高级自定义字段。我有一些选择自定义字段,我想显示每个字段的所有标签选择

我试过这种方法

$field = get_field_object('hair_color');
$hair = $field["choices"];
    foreach($hair as $value){
做一个

变量转储($field)

它看起来是空的:

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) 
}
让它充满的唯一方法是:

获取字段对象(“字段”51ac9d333d704)

但是我有3个环境,我不想硬编码字段键

有什么解决办法吗?
提前感谢。

按照ACF的工作方式,您确实应该使用钥匙

从()

“您可以而且应该100%使用$field_键

使用$field_name的问题在于,如果引用不存在,ACF将无法找到字段对象,也无法保存值。如果使用代码插入帖子,则会出现这种情况


此外,使用字段键作为更新字段函数中的第一个参数更有效,因为它绕过了参考查找。”

我只是自己尝试这样做,所以我做了一些调查。似乎ACF的每个字段和字段组都作为自定义post类型存储在数据库的wp_posts表中。字段为“acf字段”,组为“acf字段组”

我可以使用这个函数获取字段键,然后在还没有字段的帖子上使用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);
要更新已包含字段的帖子的字段,或者将字段及其键引用添加到尚未包含字段的帖子。

无法使用名称可靠地检索键,因为名称是元数据,因此可以更改,而键(至少在不手动编辑数据库的情况下)不是

但是,此函数将与最新版本的ACF一起使用,但有几个注意事项。ACF在post中创建字段组,作为ACF的自定义post类型,但是关于字段本身的所有数据都保存在post_元表中

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查找字段时,必须依赖通配符搜索,这可能会出错。只要你所有的田地都有完全不同的名字,你就可以了,但是如果你有一个叫做“农场”的田地,另一个叫做“农民”,这将是错误的,因为它会同时找到两个田地


更新字段的唯一可靠方法是手动编写密钥,尽管这是公认的笨拙,这正是我从这里开始的原因。

这里是@BFDatabaseAdmin提供的答案的修改版本,与“LIKE”中的确切meta_值匹配


ACF提供了一些简单的方法来帮助保持多个环境的同步-您可以使用PHP或本地JSON文件注册字段。这样做将允许您在多个环境中使用带有单个字段键的get_field_object()。见:

我通常使用用户界面进行ACF开发,然后将所有字段组导出为PHP以跨多个环境部署

用一个简单的例子更新: 您可以将其添加到functions.php或自定义插件中,以编程方式将字段添加到多个环境中。。然后在所有环境中使用公共字段键调用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',
                ),
            ),
        ),
    ));

}

我在组合中加入了另一个选项。我认为现有的答案是好的,但除非您查看父组,否则将永远无法获得可靠的字段键,因为字段名可以跨多个组存在

例如,假设您有两个自定义组—一个用于post-type书籍,另一个用于自定义post-type电影。两个组都添加了一个名为title的字段

在数据库中,两者都存储在
post\u except='title'
post\u type='acf field'
中。两个条目具有相同的
post\u except
,因此任何仅依赖
post\u except
的查询都将是错误的,无论是否为通配符

任何依赖于post id的查询也不是很好,因为post可能并不总是存在以便传入

因此,需要传入字段和组的组合,才能从名称中获取字段键。这段代码对我很有用:

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

也有同样的问题,最后也使用了key,这导致我进入了另一个死胡同,没有正常的方法来获取键值,但幸运的是遇到了这个问题

摘自—


其中,acf_updateValue模拟在您手动保存时acf本身是如何完成的。由于仅更新字段不足以容纳ACF列,正确的方法是使用
ACF\u maybe\u get\u field
函数,如下所示:

acf\u可能\u获取\u字段('field\u name',false,false)

参数有:
字段名
帖子id
(默认为当前帖子)和最重要的
严格的
,默认为
,但我们在这里将其设置为
,以获取该帖子尚未存在的字段对象


指我是这样做的:
$pageme=get_page_by_title('post_title',OBJECT,'post_type');$field=get\u field\u对象('hair\u color',$pageme->ID)$pais=$field[“choices”]工作正常。必须有一种方法可以从字段名称中找到字段密钥。我不使用field_键,因为它们在我的不同数据库中是不同的。没有可靠的方法,因为插件从键中获得名称,而不是相反;我发布了一个解决方案,其中包含一些(重要的)警告。@Phil_1984_我们使用WP Sync DB同步我们的单独环境以保持密钥不变,仅供参考。我认为您必须使用较旧版本的高级自定义字段-字段不再保留在posts表中,因此不幸的是,这不起作用。我使用的是最新版本。用于描述数据的数据
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));
    }
}
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
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);
}