我正在尝试压缩最多5个文件,并将其保存在每个帖子的存档中。例如,当我有3个文件并添加另一个文件时,单击更新后,zip文件将包括3个文件。当我再次单击更新时,我的zip文件中将有4个文件。 我真的不知道如何在第一次点击时获得它。
我的猜测是acf字段在更新时最后更新,这就是为什么我得到旧值而不是新值的原因。 因为我删除了完整的zip文件,然后重新创建,这意味着该函数将创建与以前完全相同的zip文件,即使它应该已更改。
所以我尝试使用不同的钩子:save_post,save_post_post,acf / save_post和publish_post。无论如何,我都得到相同的结果。 我还分别对0、1、9、999和99999尝试了不同的优先级。结果仍然相同。
我还尝试使用$ _POST ['acf']和get_fields获取字段值。 使用$ _POST ['acf']无效,使用post变量时,我什至无法删除zip文件。 我查看了压缩和删除过程所需的所有数据,它与我的其他解决方案相同。
在下面的代码中,我注释了根本不起作用的代码段,并用有效但仅在第二次单击“更新”时创建所需的zip的代码段替换了它。
我还尝试在函数开始之前和之后添加钩子。似乎根本没有作用。
我知道删除完整的zip文件并完全重新创建它不是最佳实践,我还有一个不错的代码段,该代码段将仅删除那里不再存在的文件,但是我不知道需要多少文件,所以可能是每个帖子都需要有一个自定义字段组,要上传20个文件或2个文件,我想当我首先删除所有内容时不要紧。
add_action('acf / save_post','archive_upload',10,3);
函数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');*/