ACF:如何通过字段键获取完整的字段名(META_KEY)?

时间:2022-01-22 作者:David Wolf

在高级自定义字段中:我可以使用哪个函数通过字段键获取字段的完整元键?

所以,如果我有一个名为some_field 和字段键field_sd54hfs5df: 如何通过键获取名称?

我找到了函数acf_get_fields()acf_get_field(), 但当使用字段类型时,如group, flexibel_contentrepeater 返回数组中的名称不是存储在元数据库表中的全名。

例如,当组的名称为some_group 以及现场some_field 上述函数仅返回some_groupsome_field, 但不是全部meta_key, 这是some_group_some_field.

不幸的是,这种字段类型的子字段没有返回,因此我看不到一个选项来重新格式化返回的数组,以递归方式组合数组来构建完整的元键名称。


我编写了以下方法来获取存储在_some-field… ACF提供的元数据,但在使用垃圾元数据和旧记录的环境中工作时,这会获取多个记录,因此这不是一个解决方案。

/**
 * Get a meta key name by a ACF field key
 * 
 * @since 1.0.22
 * 
 * @param string $key
 * @return null|string
 */
public function getUserMetaKey(string $key): ?string
{
    global $wpdb;
    $select = "SELECT distinct meta_key FROM $wpdb->usermeta WHERE meta_value = \'$key\' AND meta_key NOT LIKE \'acfe_form_actions_%\'";
    // Debug::log($select);
    $usermeta = $wpdb->get_results($select);
    // Debug::log($usermeta);
    if (count($usermeta) > 0) {
        $metaKey = $usermeta[0]->meta_key;
        $metaKey = ltrim($metaKey, \'_\');
        return $metaKey;
    }
    return null;
}

1 个回复
最合适的回答,由SO网友:Adam 整理而成

There\'s a few ways to achieve this but here\'s one which supports an unknown depth of children, for example where you have nested groups within groups.

Given the field key "field_{some_hash}" of the field, this function will retrieve the field, and its parent most field, and so on until we reach the top of the field tree.


function custom_acf_get_field_name_by_key( $key ) {

    $field = acf_maybe_get_field( $key );

    if ( empty( $field ) || ! isset( $field[\'parent\'], $field[\'name\'] ) ) {
        return $field;
    }

    $ancestors = array();

    while ( ! empty( $field[\'parent\'] ) && ! in_array( $field[\'name\'], $ancestors ) ) {

        $parent = acf_get_field( $field[\'parent\'] );

        $ancestors[] = $field[\'name\'];

        $field = $parent;

    }

    $formatted_key = array_reverse( $ancestors );
    $formatted_key = implode( \'_\', $formatted_key );

    return "_$formatted_key";

}


Assume a case where I have a nested group:

 - dev_group_test | field_61ecf308ded3e | group
   ∟ title        | field_61ecf316ded3f | text
   ∟ location     | field_61ecf31cded40 | text
   ∟ sub_group    | field_61ecfa1fe5894 | group
     ∣
     ∟ sub_group_title | field_61ecfa2de5895 | text

If I want the full key of sub_group_title:

$meta_key = custom_acf_get_field_name_by_key( \'field_61ecfa2de5895\' );
// result = _dev_group_test_sub_group_sub_group_title

If I want the full key of location:

$meta_key = custom_acf_get_field_name_by_key( \'field_61ecf31cded40\' );
// result = _dev_group_test_location

NOTE: there may be more efficient ways to do this

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在