WordPress REST API端点调用ACF add_row函数失效问题求助
解决ACF重复器字段在REST API端点中无法添加行的问题
直接在functions.php调用函数正常但REST回调失效,核心原因是REST请求上下文的权限限制、ACF初始化状态或数据持久化逻辑差异,以下是针对性的解决步骤:
1. 给REST端点添加权限验证
REST API默认权限不足以修改ACF字段,必须确保请求用户拥有编辑目标帖子的权限。注册端点时指定权限回调:
register_rest_route( 'your-namespace/v1', '/add-direction', array( 'methods' => 'POST', 'callback' => 'add_row_to_direction', 'permission_callback' => function() { // 验证当前用户是否能编辑ID为365的帖子 return current_user_can( 'edit_post', 365 ); } ) );
2. 优化函数逻辑,确保数据持久化
REST请求中ACF的初始化流程和后台请求不同,add_row执行后可能需要手动触发帖子保存来完成数据写入,下面提供两种可行方案:
方案一:保留add_row并手动触发帖子更新
function add_row_to_direction( WP_REST_Request $request ) { // 先验证目标帖子是否存在 if ( ! get_post( 365 ) ) { return new WP_Error( 'invalid_post', '目标帖子不存在', array( 'status' => 404 ) ); } $row = array( 'title' => "Test Title", 'directions_group' => array( array( 'direction' => "Test Direction" ) ) ); // 调用add_row添加新行 $added = add_row( "directions", $row, 365 ); if ( $added ) { // 手动更新帖子,确保ACF数据写入数据库 wp_update_post( array( 'ID' => 365 ) ); return array( 'status' => 'success', 'message' => '行添加成功' ); } else { return new WP_Error( 'add_row_failed', '添加行失败', array( 'status' => 500 ) ); } }
方案二:直接使用acf_update_value更新重复器字段
如果add_row仍不生效,可以直接获取现有重复器数据,追加新行后用acf_update_value强制写入:
function add_row_to_direction( WP_REST_Request $request ) { $post_id = 365; if ( ! get_post( $post_id ) ) { return new WP_Error( 'invalid_post', '目标帖子不存在', array( 'status' => 404 ) ); } // 获取现有重复器数据,为空则初始化为数组 $existing_rows = get_field( 'directions', $post_id ) ?: array(); // 构造新行并追加到现有数据 $new_row = array( 'title' => "Test Title", 'directions_group' => array( array( 'direction' => "Test Direction" ) ) ); $existing_rows[] = $new_row; // 写入更新后的数据 $updated = acf_update_value( $existing_rows, $post_id, 'directions' ); if ( $updated ) { return array( 'status' => 'success', 'message' => '行添加成功' ); } else { return new WP_Error( 'update_failed', '更新字段失败', array( 'status' => 500 ) ); } }
3. 开启调试排查深层问题
如果以上方法都无效,开启WordPress调试模式查看具体报错:
在wp-config.php中添加:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true );
然后查看wp-content/debug.log,排查是否存在ACF字段不存在、权限不足或其他运行时错误。
内容的提问来源于stack exchange,提问作者BenBuaron
相关产品推荐
相关产品推荐

