从自定义字段同步WooCommerce可下载文件遇更新延迟问题
解决WooCommerce + ACF Post Object字段自动填充下载文件延迟生效的问题
我懂你遇到的这个头疼问题——修改ACF的Post Object字段后,第一次保存产品时可下载文件根本没更新,得再点一次保存才生效。这本质是钩子触发时机的冲突,咱们来把它理顺:
问题根源
你当前用的woocommerce_admin_process_product_object钩子,执行时机早于ACF保存字段值的时机。第一次保存产品时,ACF还没把新选的专辑ID写入数据库,get_field()拿到的还是旧数据,自然不会更新下载文件;第二次保存时,ACF已经完成了字段更新,这时候才能拿到新值生效。
修复方案:换用ACF专属钩子
我们改用ACF的acf/save_post钩子,把优先级设为20(高于ACF默认的10),确保ACF先保存好新的字段值,再执行下载文件的同步逻辑。修改后的代码如下:
add_action( 'acf/save_post', 'mysite_sync_product_downloads_from_albums', 20 ); function mysite_sync_product_downloads_from_albums( $post_id ) { // 只处理WooCommerce产品类型,跳过其他文章 if ( ! wc_get_product( $post_id ) ) { return; } // 获取ACF更新后的最新专辑数据 $selected_albums = get_field( 'mysite_select_albums', $post_id ); $downloads = array(); if ( $selected_albums ) { foreach ( $selected_albums as $album ) { // 跳过无效的文章ID,避免报错 $album_post = get_post( $album ); if ( ! $album_post ) { continue; } $file_title = $album_post->post_title; // 这里可以替换成专辑对应的实际文件URL,比如从专辑的ACF字段获取 $file_url = "http://changingthinstosimplify.com/"; $file_md5 = md5( $file_url ); $download = new WC_Product_Download(); $download->set_name( $file_title ); $download->set_id( $file_md5 ); $download->set_file( $file_url ); $downloads[ $file_md5 ] = $download; } } // 同步下载文件到产品并保存 $product = wc_get_product( $post_id ); $product->set_downloads( $downloads ); $product->save(); }
额外注意事项
- 记得删除原来的
woocommerce_admin_process_product_object钩子代码,避免重复执行逻辑。 - 如果你的专辑文件URL是存在专辑的ACF字段里的,把
$file_url改成类似get_field( '你的专辑文件字段名', $album )的形式,替换成你实际的字段键。 - 测试时修改Post Object字段后直接保存,下载文件应该就能即时更新了。
内容的提问来源于stack exchange,提问作者Tim Green
相关产品推荐
相关产品推荐

