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

use*_*966 20 wordpress custom-fields advanced-custom-fields

我正在使用带有post-type的高级自定义字段.我有一些选择自定义字段,我想显示每个字段的所有标签选项.

我试过这种方式.

$field = get_field_object('hair_color');
$hair = $field["choices"];
    foreach($hair as $value){
Run Code Online (Sandbox Code Playgroud)

做一个

后续代码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) 
}
Run Code Online (Sandbox Code Playgroud)

让它满满的唯一方法是:

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) 
}
Run Code Online (Sandbox Code Playgroud)

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

有什么解决方案吗?提前致谢.

小智 8

以下是@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);
}
Run Code Online (Sandbox Code Playgroud)


aar*_*ini 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';
    ");
}
Run Code Online (Sandbox Code Playgroud)

然后我就可以使用:

update_field(get_acf_key('my_field_name'), 'some value', $post_id);
Run Code Online (Sandbox Code Playgroud)

要为已经拥有它的帖子更新字段,要么添加字段,并且它是对尚未包含该字段的帖子的关键引用.

  • 版本5.3.7(2016年4月)(专业版)在wp_posts中包含acf-field作为post_type. (3认同)
  • 我正在使用最新版本。用于描述字段的数据在帖子表中作为自定义帖子类型。具有相关数据的字段存储在postmeta表中。最初的问题只是如何获取命名字段的密钥。 (2认同)

Chr*_*ris 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

将返回名称和组中的字段键;如果不存在,则返回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
Run Code Online (Sandbox Code Playgroud)


loc*_*omo 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',
                ),
            ),
        ),
    ));

}
Run Code Online (Sandbox Code Playgroud)


小智 3

ACF 的工作方式确实应该使用密钥。

来自(http://www.advancedcustomfields.com/resources/get_field_object/

“您可以而且应该 100% 地使用 $field_key。

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

此外,使用 field_key 作为 update_field 函数中的第一个参数会更有效,因为它绕过了引用查找。”

  • 必须有一种方法可以从 field_name 中找出 field_key。我不使用 field_keys,因为它们在我的不同数据库中是不同的。 (4认同)