Skip to content

Instantly share code, notes, and snippets.

@tmoitie
Last active September 20, 2022 20:37
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save tmoitie/9808555 to your computer and use it in GitHub Desktop.
Save tmoitie/9808555 to your computer and use it in GitHub Desktop.
Wordpress: Gravity Forms List to ACF Repeater post save
<?php
add_action('gform_after_submission', 'gfToAcfListToRepeater', 10, 2);
function gfToAcfListToRepeater($entry, $form)
{
foreach ($form['fields'] as $field) {
if (!($field['type'] == 'post_custom_field' && $field['inputType'] == 'list' && $field['enableColumns'] == true)) {
continue;
}
$id = $field['id'];
$postId = $entry['post_id'];
$acfFields = unserialize($entry[$id]);
$fieldName = $field['postCustomFieldName'];
$count = 0;
foreach ($acfFields as $item) {
foreach ($item as $key => $value) {
$acfKey = str_replace(' ', '_', strtolower($key));
$acfFieldName = $fieldName . '_' . $count . '_' . $acfKey;
update_post_meta($postId, $acfFieldName, $value);
}
$count++;
};
update_post_meta($postId, $fieldName, count($acfFields));
}
}
@andy-d-guru
Copy link

Did anyone actually get it to work? Can someone help with it? My custom repeater field name is "app_lvl_data".
Shall I replace it here: $fieldName = $field['postCustomFieldName']; ?

@ktrusak
Copy link

ktrusak commented Dec 4, 2019

Here is a much simpler solution that uses the ACF functions:

`add_action( 'gform_after_submission_36', 'list_field_to_acf_accolades', 10, 2 );
function list_field_to_acf_accolades( $entry, $form ){

$id = $entry['post_id'];
$acfFields = maybe_unserialize( rgar( $entry, '77' ) );
$val = array();

foreach ( (array)$acfFields as $key => $data) {
	$description = array();
	$description['description'] = $data; 
	$val[] = $description;	
}		
update_field( 'accolades', $val, $id ); 

}`

@incognitozen
Copy link

incognitozen commented Apr 19, 2020

I had the same issues as others and here is updated simple code with instructions

// Change the number in the following line with the id of your form. --- >  gform_after_submission_3. For me the form had id 3
add_action( 'gform_after_submission_3', 'list_field_to_acf_accolades', 10, 2 );
function list_field_to_acf_accolades( $entry, $form ){
$id = $entry['post_id'];
// Change the number 2 in ( rgar( $entry, '2' ) );  with the id of the list field in your gravity form. For me this was number 2. Also pros is the name of my repeater field. My subfield is also called pros.
$acfFields = maybe_unserialize( rgar( $entry, '2' ) );
$val = array();
foreach ( (array)$acfFields as $key => $data) {
$description = array();
$description['pros'] = $data;
$val[] = $description;
}
update_field( 'pros', $val, $id ); 
}

@klkwebservices
Copy link

Incognitozen, could you clarify what your 'pros' is? Is it a CPT slug or is it the field name in Gravity Forms (name assigned to your list field =2 )?

Does anyone know of anything special for a multiple-column repeater field?

Thanks!

@incognitozen
Copy link

Incognitozen, could you clarify what your 'pros' is? Is it a CPT slug or is it the field name in Gravity Forms (name assigned to your list field =2 )?

Does anyone know of anything special for a multiple-column repeater field?

Thanks!

pros is the name of my repeater field. My subfield is also called pros.

@dustpickle
Copy link

@icognitozen How would you modify this to use a 2 column repeater?

My ACF Repeater is:

Repeater: links
Subfield Col1 = link_title
Subfield Col2 = link_url

@mkormendy
Copy link

mkormendy commented Nov 22, 2021

I prefer the @EMembrillas version, because:

  1. there's less ACF cruft made in your wp_postmeta table that ACF doesn't absolutely need (it rebuilds it all on re-saving the created post in the backend anyhow if you choose to do so);
  2. it uses the default WordPress methods for adding a post custom fields in a well formed multi-column key naming structure that doesn't necessarily have to be used for ACF, but is compatible regardless;
  3. it handles the duplicate issue mentioned.

In my experience, I noticed that the $post_id wasn't available when using the 'gform_after_submission' action. Instead, you can use the 'gform_after_create_post' (or 'gform_after_create_post_FORMID') action hook to make sure you can get the $post_id (if Post Fields exist in your form).

I am also using the Advanced Post Creation GF add-on; it too has an action called 'gform_advancedpostcreation_post_after_creation' (or 'gform_advancedpostcreation_post_after_creation_FORMID') which makes sure the $post_id is available.

I didn't have to go and grab $post_id from the $entry array passed in to the $entry parameter – I was able to use it directly in the code.

add_action('gform_advancedpostcreation_post_after_creation_68', 'partners_list_field_to_acf_repeater', 10, 4);
function partners_list_field_to_acf_repeater($post_id, $feed, $entry, $form) {

  // set these based on form fields and acf/postmeta fields
  $gf_list_field_id = 12;
  $acf_repeater_field_name = 'contacts_list';

  $acf_fields = maybe_unserialize(rgar($entry, $gf_list_field_id));
  $count = 0;
  foreach ($acf_fields as $item) {
    foreach ($item as $key => $value) {
      $acf_key = str_replace(' ', '_', strtolower($key));
      $postmeta_field_name = $acf_repeater_field_name . '_' . $count . '_' . $acf_key;
      update_post_meta($post_id, $postmeta_field_name, $value);
    }
    $count++;
    delete_post_meta($post_id, $acf_repeater_field_name, $value);
  };
  add_post_meta($post_id, $acf_repeater_field_name, count($acf_fields));
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment