我有一些自定义帖子类型“视频”,并向其中添加了一些自定义 ACF 字段(“video_path”、“author_name”和“audio_author”)。我正在以编程方式生成该类型的帖子,如下所示:
$video_post_params = array(
'post_title' => wp_strip_all_tags($video_title),
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'video'
);
$video_id = wp_insert_post( $video_post_params );
update_field('video_path', $video_path, $video_id);
update_field('author_name', $video_author, $video_id);
update_field('audio_author', $audio_author, $video_id);
所有值都插入得很好 - 当我在后端打开帖子时,一切都很好。但是,当我尝试使用这些值时,我什么也没得到?!?
我正在从这样的模板文件中读取值:
get_field('video_path', $video_id)
如果我打开帖子并保存它而不做任何更改,一切都会开始正常工作,之后我会正常获取帖子 ACF 字段。从后端手动创建的帖子一直运行良好。
我做错了什么?从代码生成帖子时是否需要一些额外的步骤?
但该解决方案显然对我不起作用 - 我的
update_field()
功能已经紧随 wp_insert_post()
之后。
找到了!
插入ACF字段值时必须使用字段键。如果像我一样使用键名,则乍一看一切都插入得很好,但在手动保存帖子之前值不可用。所以就像:
update_field('field_56e683ab6265f', $video_path, $video_id);
update_field('field_56e68415b5c4b', $video_author, $video_id);
update_field('field_56e6842d58740', $audio_author, $video_id);
真是一团糟......
如果想使用字段名而不是字段键,可以使用 add_post_meta
例如:
add_post_meta($video_id, 'video_path', $video_path, true);
add_post_meta($video_id, 'author_name', $video_author, true);
add_post_meta($video_id, 'audio_author', $audio_author, true);
您可以将其另存为附件,而不是将文件路径保存到数据库,如果将其另存为附件 ID,则 acf 可以很好地使用。请参阅下面的代码示例:-
function get_file_upload_attachment_id( $upload_path, $post_id ) {
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Upload file and attach to post
$attachment_id = wp_insert_attachment( array(
'post_mime_type' => mime_content_type( $upload_path ),
'post_title' => sanitize_file_name( basename( $upload_path ) ),
'post_content' => '',
'post_status' => 'inherit',
'post_author' => get_current_user_id(),
'post_type' => 'attachment',
'post_parent' => $post_id,
'guid' => $upload_path
), $upload_path, $post_id );
// Set uploaded image as featured image (post thumbnail)
if ( is_wp_error( $attachment_id ) ) {
return false;
}
return $attachment_id;
}
$attachment_id = get_file_upload_attachment_id($upload
_path, $post_id) // first parameter is upload path
update_field('custom_field_name', $attachment_id, $post_id);
现在您可以看到它在帖子页面中可见。
使用ACF5,你必须使用的不是帖子ID,而是帖子对象,湖:
update_field('field_56e683ab6265f', $video_path, $video);
update_field('field_56e68415b5c4b', $video_author, $video);
update_field('field_56e6842d58740', $audio_author, $video);
我遇到了同样的问题,我只需在脚本末尾添加
do_action('acf/save_post', $postID);
即可纠正它,仅此而已......