Skip to content

Instantly share code, notes, and snippets.

@tmoitie
Last active April 18, 2024 18:56
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));
}
}
@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));
}

@alexandrac02
Copy link

alexandrac02 commented Apr 18, 2024

Hi! I have the same issue as some of the other users. I've tested all of these code snippets without success. My setup involves a GF list with 2 columns, one is text and the second column is a select. I used @mkormendy snippet as we also use Advanced Custom Post creation to make our listings. I am also using the Post Update Add-On – Gravity Forms for the form to update the rest of the field to ACF. How would I be able to post my double column list to the ACF repeater? Currently nothing happens with the code in the functions.php.

add_action('gform_advancedpostcreation_post_after_creation_2', '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 = 71;
  $acf_repeater_field_name = 'service_cities';

  $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));
}

My two GF list fields are City & State. The ID of the field is 71.
For the ACF repeater the field name is service_cities.
The two fields inside of the ACF repeater is City Name (city_name) and State (state). Would there be a way to make this auto update with the stack?

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