如何通过WordPress API批量更新员工ACF自定义图片字段
解决WordPress API更新ACF图片字段及批量更新员工头像问题
1. 通过POST请求更新ACF自定义图片字段
ACF图片字段默认存储的是媒体库附件ID(而非直接存储URL),因此需要分两步完成更新:
步骤1:上传图片到媒体库获取附件ID
使用WordPress REST API的wp/v2/media端点上传图片,需携带认证信息(应用密码或JWT令牌),示例curl请求:
curl -X POST https://你的站点域名/wp-json/wp/v2/media \ -H "Authorization: Basic 你的认证凭证" \ -H "Content-Disposition: attachment; filename=\"员工头像.jpg\"" \ --data-binary "@本地图片路径/员工头像.jpg"
成功响应会返回包含id字段的JSON数据,该值就是后续要用到的附件ID。
步骤2:用附件ID更新ACF字段
假设员工是自定义文章类型team_member,目标文章ID为123,ACF字段键为employee_avatar,发送POST请求更新:
curl -X POST https://你的站点域名/wp/v2/team_member/123 \ -H "Authorization: Basic 你的认证凭证" \ -H "Content-Type: application/json" \ -d '{ "meta": { "employee_avatar": 刚才获取的附件ID } }'
注:若ACF字段设置为存储URL或数组,需调整请求中的值格式,但推荐使用附件ID存储,兼容性和稳定性更强。
2. 批量更新所有员工头像(图片按名称存于指定文件夹)
通过自定义PHP脚本实现批量处理,逻辑为:遍历指定文件夹的图片→匹配员工名称→自动上传至媒体库→更新对应ACF字段。
实现脚本
将以下代码保存为batch-update-avatars.php,放在WordPress根目录:
<?php // 加载WordPress核心环境 require_once('wp-load.php'); // 配置项 $image_folder = '/服务器上图片文件夹的绝对路径/'; $post_type = 'team_member'; // 员工对应的自定义文章类型 $acf_field_key = 'employee_avatar'; // ACF头像字段的键 // 遍历图片文件夹 $files = scandir($image_folder); foreach ($files as $file) { // 过滤非图片文件和系统默认目录 $allowed_ext = ['jpg', 'jpeg', 'png', 'gif']; $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (!in_array($file_ext, $allowed_ext) || in_array($file, ['.', '..'])) { continue; } // 提取员工名称(去掉文件扩展名,处理命名中的下划线/连字符) $employee_name = pathinfo($file, PATHINFO_FILENAME); $employee_name = str_replace(['_', '-'], ' ', $employee_name); // 查询匹配名称的员工文章 $args = [ 'post_type' => $post_type, 'post_status' => 'publish', 'title' => $employee_name, 'posts_per_page' => 1 ]; $employee_query = new WP_Query($args); if ($employee_query->have_posts()) { $employee_query->the_post(); $post_id = get_the_ID(); // 上传图片到WordPress媒体库 $image_path = $image_folder . $file; $upload = wp_upload_bits($file, null, file_get_contents($image_path)); if (!$upload['error']) { // 创建媒体附件记录 $attachment = [ 'post_mime_type' => $upload['type'], 'post_title' => sanitize_file_name($file), 'post_content' => '', 'post_status' => 'inherit' ]; $attachment_id = wp_insert_attachment($attachment, $upload['file'], $post_id); // 生成图片缩略图等元数据 require_once(ABSPATH . 'wp-admin/includes/image.php'); $attachment_meta = wp_generate_attachment_metadata($attachment_id, $upload['file']); wp_update_attachment_metadata($attachment_id, $attachment_meta); // 更新ACF头像字段 update_field($acf_field_key, $attachment_id, $post_id); echo "已更新员工 {$employee_name} 的头像\n"; } else { echo "上传图片 {$file} 失败:{$upload['error']}\n"; } } else { echo "未找到名称为 {$employee_name} 的员工\n"; } }
执行说明
- 确保脚本有读取图片文件夹的权限,服务器PHP内存和执行时间足够(可临时在脚本顶部添加
ini_set('memory_limit', '256M'); ini_set('max_execution_time', 300);)。 - 通过浏览器访问
https://你的站点域名/batch-update-avatars.php执行,或用命令行运行php batch-update-avatars.php。 - 执行完成后删除该脚本,避免安全风险。
补充:若员工是WordPress用户(而非自定义文章类型),将查询逻辑改为$user = get_user_by('display_name', $employee_name);,更新ACF字段时使用update_field($acf_field_key, $attachment_id, 'user_' . $user->ID);。
内容的提问来源于stack exchange,提问作者Major
相关产品推荐
相关产品推荐

