I’ve used this to insert posts with ACF/postmeta data successfully, but please test it on a development site before deploying live, there might be some terrible assumptions. Generally, it assumes that you only have each name once, that is “myfield” doesn’t exist in two field groups with different meanings.
$mycustomvalue = 123;
$f_mycustomfield = get_acf_key_by_name("mycustomfield");
update_post_meta( $postid, "mycustomfield", $mycustomvalue );
update_post_meta( $postid, "_mycustomfield", $f_mycustomfield["key"] );
function load_acf_names2key() {
global $acf_names2key;
$acf_names2key = array();
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
foreach($posts as $fieldgroup) {
$fields = get_post_meta( $fieldgroup->ID );
foreach($fields as $fieldkey => $fieldmeta) {
if(substr($fieldkey, 0, 6) == "field_") {
$field = get_post_meta( $fieldgroup->ID, $fieldkey);
foreach($field as $subfield) {
if(!array_key_exists($subfield["name"], $acf_names2key)) $acf_names2key[ $subfield["name"] ] = array();
$subfield[ "group" ] = $fieldgroup->post_name;
array_push( $acf_names2key[ $subfield["name"] ], $subfield );
}
}
}
}
}
function get_acf_key_by_name($name, $options = array()) {
global $acf_names2key;
if(!$acf_names2key || !is_array($acf_names2key) || count($acf_names2key) == 0) {
load_acf_names2key();
}
if(!array_key_exists($name, $acf_names2key))
return false;
foreach($acf_names2key[ $name ] as $possible) {
foreach($options as $key => $val) {
if(preg_match("!^/.*/i?$!", $val)) {
if(!preg_match($val, $possible[ $key ])) {
continue 2;
}
}
else if($possible[ $key ] != $val) {
continue 2;
}
}
# no options? this will return the first one
# has options? will return the first item that
# satisfies all options
return $possible;
}
return false;
}
It’s been quite a while since I wrote this and memory fails me what exactly I wanted to do with those $options that can be passed to get_acf_key_by_name
(or if I just copy pasted that code from somewhere), but it always worked for me.
I haven’t tried to work with repeater fields, so that might be a challenge, but give it a try.