ZipArchive with ACF doesnt work correctly
-
I am trying to Zip up to 5 files and save them in an archive for each post. When I, for example, have 3 files and add another file the zip file will include the 3 files after I click on update. When I click again on update I then will have 4 files in my zip file. I cannot really figure out how to get it on the first click.
My guess is that the acf fields are updated last on update and that is why I get the old values instead of the new ones. Because I delete the complete zip file and then recreate it, which means that the function creates the exact same zip file as before, even though it should’ve been changed.
So I have tried to use different hooks: save_post, save_post_post, acf/save_post and publish_post. I got the same results no matter what. I also tried different priorities on each, 0,1, 999 and 99999. Still the same results.
I also tried getting the field values with $_POST[‘acf’] and get_fields. With $_POST[‘acf’] nothing works, I cannot even delete the zip file when using the post variable. I looked at all the data which I need for the zipping and deleting process and it is the same as my other solution.
In the following code I commented the code snippets that do not work at all and replaced it with the code snippets that do work but only create the zip I want when I click on update a second time.
I also tried adding the hook before the start of the function and after the function. Didnt seem to have an effect at all.
I know that deleting the complete zip file and reacreating it completly isnt the best practice, I also had a nice code snippet that would only delete the files that werent there anymore, but I dont know how many files will be needed, so it could be that there needs to be a custom fieldgroup for each post, with 20 files to upload or 2 files and I thought when I delete everything first it doesnt matter.
add_action(‘acf/save_post’ , ‘archive_upload’, 10, 3);
function archive_upload($post_ID){
$destination = ‘wp-content/uploads/archiv/’. hash(‘md5′, $post_ID).’.zip’;
$zip = new ZipArchive();
$zip->open( $destination, ZipArchive::CREATE );$fields = get_fields($post_ID);
//$fields = $_POST[‘acf’];
if($fields != ”){
$fieldslength = count($fields);
$i = 0;
while( $i < $fieldslength )
{
$zip->deleteIndex($i);$i++;
}
$zip->close();$zip = new ZipArchive();
$zip->open( $destination, ZipArchive::CREATE );if( count( $fields ) ) {
$i = 0;
foreach( $fields as $field ) {$info .= ” “.$field;
/*if($field){
$key = key($fields);
$upload = get_field($key);
$new_filename = $upload[‘filename’];
$url = get_attached_file($upload[‘id’]);
$info .= ” “.$key.” “.$url.” “.$new_filename;
$zip->addFile( $url, $new_filename );$i++;
}
next($fields);*/
$new_filename = $field[‘filename’];
$url = get_attached_file($field[‘id’]);
$info .= ” “.$url.” “.$new_filename;
$zip->addFile( $url, $new_filename );
}
}
//die($info);}
}
$zip->close();}
/*function custom_hook() {
do_action(‘custom_hook’);
}
add_action(‘custom_hook’, ‘archive_upload’);*/
- The topic ‘ZipArchive with ACF doesnt work correctly’ is closed to new replies.