如何通过ACF post_object子字段值而非post_id查询自定义文章
解决方法
问题原因
ACF的post_object字段在数据库中默认存储的是关联文章的ID,而非关联文章的自定义字段值,所以你直接传入Rice这类文本值查询product的target_crop字段时,无法匹配到数据库里存储的ID数值,只有传入ID才能返回结果。
实现思路
调整查询逻辑分两步执行即可:
- 先根据传入的
target_crop文本值,查询到对应的target_crop类型文章的ID - 再用拿到的ID构造product的meta查询条件
完整代码示例
将以下代码添加到你的主题functions.php文件或者自定义插件中即可生效:
add_filter('rest_product_query', function($args, $request) { // 检查请求是否携带target_crop参数 $target_crop_val = $request->get_param('target_crop'); if (!empty($target_crop_val)) { // 第一步:查询匹配文本值的target_crop文章ID $crop_posts = get_posts([ 'post_type' => 'target_crop', 'posts_per_page' => 1, 'meta_query' => [ [ 'key' => 'target_crop', // target_crop类型的文本字段名 'value' => sanitize_text_field($target_crop_val), 'compare' => '=' ] ], 'fields' => 'ids' // 只返回ID,优化查询性能 ]); // 如果查到对应的crop文章ID,再构造product的查询条件 if (!empty($crop_posts)) { $args['meta_query'][] = [ 'key' => 'target_crop', // product的post_object字段名 'value' => $crop_posts[0], 'compare' => '=' ]; } else { // 没有匹配的crop时,直接返回空结果 $args['post__in'] = [0]; } } return $args; }, 10, 2);
验证
添加代码后请求{{url}}/product?target_crop=Rice,即可正常返回所有关联了target_crop值为Rice的product数据。
内容的提问来源于stack exchange,提问作者Danish Shaikh
相关产品推荐
相关产品推荐

