I’m injecting and ACF Pro field group into an existing WP Job Manager job submission form:
/**
* Inject ACF fields into route submission form.
* This example uses the WP Job Manager Field Editor hook
* field to fire job_manager_field_actionhook_prefix_acf_repeater
*
* @param array $field settings for field
* @param string $key field key
*/
add_action( 'job_manager_field_actionhook_prefix_acf_repeater', 'prefix_acf_repeater', 10, 2 );
function prefix_acf_repeater( $field, $key ) {
// We only want to add this on the front end.
// The back end does not need custom display and saving.
if ( is_admin() ) {
return;
}
// Insert ACF group field
acf_form( [
'new_post' => true,
'post_id' => 'new_post', // Prevent old form values from being persistent
'fields'=> [ 'field_5c9bf22960ed8'],
'return' => '', // No return value for WPJM compat. // https://support.advancedcustomfields.com/forums/users/jamesryder/replies/
'form' => false,
'honeypot' => false,
] );
}
I am not calling acf_form_head()
because it conflicts with the WP Job Manager submission process. I am however, enqueueing acf_enqueue_scripts()
so that the JS and CSS are loaded.
add_action( 'init', 'prefix_acf_enqueue_scripts_manually', 1 );
function prefix_acf_enqueue_scripts_manually() {
acf_enqueue_scripts();
}
I’ve created a callback function for save_post_job_listing
(code at the end of this post) which allows me to look at $_POST
and save my repeater fields, but this required building a complex custom save function which will break if the field structure is modified.
Does ACF have a built in function that will allow me to manually trigger the saving of this group field? Or alternatively a more straight forward way of getting ACF and WPJM to work together?
It’s my understanding that the acf_update_{thing}()
functions only work for fields that have already been saved and that these functions do not work with $_POST
, but it also seems like there’s a better way of going about this than what I’m doing.
Here’s the custom save function:
add_action( 'save_post_job_listing', 'prefix_save_group');
function prefix_save_group( $post_id ) {
$fields = tsr_acf_route_field_ids_days();
$fields = [];
$fields['days'] = [
'id' => 'field_5c9bf22960ed8',
'name' => '_tsr_route_days'
];
$fields['stops'] = [
'id' => 'field_5c9bf22962649',
'name' => 'stops'
];
$fields['stop_name'] = [
'id' => 'field_5c9bf229635e9',
'name' => 'stop_name'
];
$fields['day_notes'] = [
'id' => 'field_5c9bf25a6c3e0',
'name' => 'day_notes'
];
// Get array of days data from $_POST
$days_data = isset( $_POST['acf'][ $fields['days']['id'] ] )
? $_POST['acf'][ $fields['days']['id'] ]
: null;
// Bail if we have no data.
if ( null === $days_data ) {
return;
}
// Day repeater (stores number of rows)
$days_data_count = count( $days_data );
$meta_key = $fields['days']['name'];
update_post_meta( $post_id, '_' . $meta_key, $fields['days']['id'] );
update_post_meta( $post_id, $meta_key, $days_data_count );
// Loop through days data and save it.
$day_counter = 0;
// Days
foreach ( $days_data as $day ) {
// Day
foreach ( $day as $day_field => $day_field_value ) {
// Day Stops
if ( $day_field === $fields['stops']['id'] ) {
// Number of stops
$stops = $day_field_value;
$stops_count = count( $stops );
$meta_key = $fields['days']['name'] . '_' .
$day_counter . '_' .
$fields['stops']['name'];
update_post_meta( $post_id, '_' . $meta_key, $day_field );
update_post_meta( $post_id, $meta_key, $stops_count );
$stop_counter = 0;
// Stop fields
foreach ( $stops as $stop ) {
// Stop field
foreach ( $stop as $stop_field => $stop_value ) {
// Stop Name
if ( $stop_field === $fields['stop_name']['id'] ) {
$meta_key = $fields['days']['name'] . '_' .
$day_counter . '_' .
$fields['stops']['name'] . '_' .
$stop_counter . '_' .
$fields['stop_name']['name'];
update_post_meta( $post_id, '_' . $meta_key, $stop_field );
update_post_meta( $post_id, $meta_key, $stop_value );
}
// Stop Notes
if ( $stop_field === $fields['stop_notes']['id'] ) {
$meta_key = $fields['days']['name'] . '_' .
$day_counter . '_' .
$fields['stops']['name'] . '_' .
$stop_counter . '_' .
$fields['stop_notes']['name'];
update_post_meta( $post_id, '_' . $meta_key, $stop_field );
update_post_meta( $post_id, $meta_key, $stop_value );
}
}
$stop_counter++;
} // Day stop
} // Day stops
// Day Notes
if ( $day_field === $fields['day_notes']['id'] ) {
$meta_key = $fields['days']['name'] . '_' .
$day_counter . '_' .
$fields['day_notes']['name'];
update_post_meta( $post_id, '_' . $meta_key, $day_field );
update_post_meta( $post_id, $meta_key, $day_field_value );
} // Day notes
} // Day
$day_counter++;
} // Days
}
Just following up…
(And sorry for the double post of the question. My post disappeared when editing, then re-appeared)
I figured out that triggering do_action( 'acf/save_post', $post_id );
is the key. This means that creating a custom save function is not necessary.
add_filter( 'job_manager_update_job_data', 'my_acf_save_repeater_data', 10, 2 );
function my_acf_save_repeater_data( $post_id, $route_data ) {
do_action( 'acf/save_post', $post_id );
return $route_data;
}
You must be logged in to reply to this topic.
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
Accordions are a great way to group related information while allowing users to interactively show and hide content. In this video, Damon Cook goes in-depth on how to create an accessible accordion block using ACF PRO’s Repeater field.https://t.co/RXT0g25akN
— Advanced Custom Fields (@wp_acf) March 2, 2023
© 2023 Advanced Custom Fields.
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Cookie Policy. If you continue to use this site, you consent to our use of cookies.