Home › Forums › ACF PRO › Retrieve most recent front-end edited fields? › Reply To: Retrieve most recent front-end edited fields?
Sometimes I find things interesting and believe it or not, this type of coding is what I do to relax. I’ve done this in OOP because it’s the way I think.
I’m not sure if there are any errors, I have not tested this. It’s not meant to be exact but it’s easier to give a code example than to explain all the details.
<?php
/*
store updated values for a repeater
so they can easily be used elsewhere
This specific class will save new values
for new images added to a repeater
there should only be 1 image field in the repeater
*/
new for_kkranzo_store_recent();
class for_kkranzo_store_recent {
// this will store any updates that are made
private $new_content = array();
// a WP option name value were you can store updated content
private $option_name = 'for_kkranzo_store_recent';
// this will hold images that were added in the past
private $old_images = array();
// set the maximum number of entries to save in recently added
private $max = 10;
// name and key of the repeater field
private $repeater = array(
'name' => 'my_repeater_field',
'key' => 'field_XXXXXXXXXXXXX'
);
// name and key of the image sub field
private $image_field = array(
'name' => 'my_image_field',
'key' => 'field_XXXXXXXXXXXXX'
);
// sub field key => name pairs
// don't include the image field
private $sub_fields = array(
'field_XXXXXXXXXXXXX' => 'my_field_1',
'field_XXXXXXXXXXXXX' => 'my_field_2'
// etc...
);
// array of all of the sub fields you want to store
public function __construct() {
// add a filter that runs before ACF saves values
add_filter('acf/save_post', array($this, 'before_acf'), 1);
} // end public function __construct
public function before_acf($post_id) {
// this filter will be called before ACF saves new values
// first make sure the repeater is set in $_POST
// if not the we don't need to do anything
if (empty($_POST['acf'][$this->repeater['key']])) {
return;
}
// get all the existing images for this post
// and store them to compare against
$rows = get_field($this->repeater['name'], $post_id, false); // no formatting
foreach ($values as $row) {
$this->old_images[] = $row[$this->image_field['name']];
} // end foreach rows
// now loop trough the submitted values to see if there are new ones
foreach ($_POST['acf'][$this->repeater['key']] as $row) {
// see if this image is old
// if it is then continue to the next one
$image = intval($row[$this->image_field['key']]);
if (in_array($image, $this->old_images)) {
continue;
}
// new image - save it
$new = array(
'post_id' => $post_id,
'attachment_id' => $image
);
foreach ($this->sub_fields as $key => $name) {
$new[$name] = $row[$key];
} // end foreach sub field
// add the new content to the list
$this->new_content[] = $new;
} // end foreach row
// if there was nothing new then bail
if (empty($this->new_content)) {
return;
}
// get the old option, if anything
$option = get_options($this->option_name, array());
// merge the old array onto the new array
$option = array_merge($this->new_content, $option);
// strip it down to the max number to save
$option = array_slice($option, 0, $this->max);
// save the new option
update_option($option, $value);
// now wherever you want to show the new values
// you can get this option and you have a reference to
// the post id, the attachment id and any of the other
// field values you want to display
} // end public function before_acf
} // end class for_kkranzo_store_recent
?>
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!
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 Privacy Policy. If you continue to use this site, you consent to our use of cookies.