导入WordPress剧集帖子时,ACF自定义字段自动更新失效求助
问题分析与解决方案
你的代码在手动保存帖子时正常工作,但RSS导入插件触发时失效,核心原因及解决办法如下:
1. ACF钩子的触发场景限制
acf/save_post是ACF针对后台手动保存场景设计的钩子,多数RSS导入插件通过wp_insert_post()批量创建帖子时,不会主动调用ACF内部的保存逻辑,因此不会触发该钩子。
解决办法:改用WordPress原生save_post钩子save_post会在所有帖子创建/更新操作(包括导入插件调用wp_insert_post())时触发,替换原钩子即可适配批量导入场景:
function get_stream_from_audio_src($string){ preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match); if(empty($match[0][0])) return ''; $stream_url = substr($match[0][0], 0, strpos($match[0][0], "mp3")+3); return $stream_url; } function run_after_saving_episode( $post_id ) { // 跳过自动草稿、修订版本 if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) { return; } // 仅针对「剧集」分类的帖子执行 if ( ! has_term( '剧集', 'category', $post_id ) ) { return; } // 检查duration字段是否为空 if ( empty( get_post_meta( $post_id, 'duration', true ) ) ) { $stream_id = get_post_meta( $post_id, 'stream_id', true ); if ( empty( $stream_id ) ) return; $clean_url = get_stream_from_audio_src( $stream_id ); if ( empty( $clean_url ) ) return; $duration = get_MP3_Duration( $clean_url ); if ( $duration ) { update_post_meta( $post_id, 'duration', $duration ); } } } add_action( 'save_post', 'run_after_saving_episode', 100 );
2. 全局$post变量的冲突问题
原代码同时使用钩子传入的$post参数和global $post,批量导入场景中全局$post可能未正确初始化,导致$post->ID获取异常。修正后的代码直接使用钩子传入的$post_id,避免了全局变量依赖。
3. 导入插件的元数据写入时机
部分导入插件会先创建帖子主体,再批量添加元数据(如stream_id)。若钩子优先级过低,可能在stream_id写入前执行,导致获取不到数据。将钩子优先级设为100(高于默认的10),确保在元数据写入完成后再执行逻辑。
额外检查点
- 确认
get_MP3_Duration支持远程文件读取:导入时服务器可能禁用allow_url_fopen,可检查函数内部是否使用curl替代file_get_contents; - 查看导入插件的自定义钩子:部分高级导入插件提供专属的「导入完成」钩子,绑定到该钩子上能更精准地触发逻辑。
内容的提问来源于stack exchange,提问作者johnbell
相关产品推荐
相关产品推荐

