如何查询ACF Pro Repeater Field中引用了指定自定义文章ID的文章列表?
如何查询ACF Pro Repeater Field中引用了指定自定义文章ID的文章列表?
这绝对不是啥不可能的需求!完全能实现,我给你掰扯清楚怎么弄。
首先得搞懂ACF repeater字段的存储逻辑:它会把 repeater 里每一行的子字段单独存在文章的元数据里,键名格式是 [你的repeater字段名]_[行号]_[子字段名]。比如你的repeater叫recommended_books,存书ID的子字段是book_post,那对应的元键就会是recommended_books_0_book_post、recommended_books_1_book_post这类,行号从0开始往上数。
摸透这个逻辑后,咱们就可以用WordPress自带的WP_Query,配合通配符匹配所有行的目标子字段,找出所有元值等于当前书ID的文章。
具体代码实现(放到你的书的单页模板single.php里就行)
<?php // 获取当前书籍的ID $current_book_id = get_the_ID(); // 构建查询参数 $referencing_posts_args = array( 'post_type' => 'post', // 替换成你要查询的文章类型,比如自定义文章类型的slug 'posts_per_page' => -1, // 获取所有匹配的文章,不分页 'post_status' => 'publish', // 只查已发布的文章 'meta_query' => array( array( 'meta_key' => 'recommended_books_%_book_post', // 替换成你的repeater字段键+_%_+子字段键 'meta_value' => $current_book_id, 'type' => 'numeric', 'compare' => '=' ) ) ); // 执行查询 $referencing_posts = new WP_Query( $referencing_posts_args ); // 输出查询结果 if ( $referencing_posts->have_posts() ) : ?> <h3>这本书出现在以下文章中:</h3> <ul> <?php while ( $referencing_posts->have_posts() ) : $referencing_posts->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php else : ?> <p>暂时没有文章引用这本书哦~</p> <?php // 重置查询,避免影响后续内容 wp_reset_postdata(); endif; ?> ### 几个要注意的点 - 字段名一定要换对:把`recommended_books_%_book_post`换成你实际的repeater字段键 + `_%_` + 子字段键,比如你的repeater叫`related_books`,子字段叫`book_id`,那就是`related_books_%_book_id`(ACF的字段键都是小写下划线格式,别用后台显示的中文或带空格的名称)。 - 文章类型要对应:如果你的引用文章是自定义文章类型,比如叫`column`,就把`'post'`改成`'column'`。 - 性能小提示:如果网站文章量特别大(比如几千上万篇),这种带通配符的元查询可能会有点慢,因为没法给这种通配符元键建索引。这时候可以优化:每次更新文章时,把当前文章ID同步添加到所有引用书籍的元数据里(比如给书加个`referenced_posts`的字段存文章ID数组),之后查询直接查书的这个元字段就行,速度会快很多。 按这个方法来,你的《塘鹅暗杀令》页面就能显示它被引用在John Grisham专题和法律惊悚文里啦! 备注:内容来源于stack exchange,提问作者Jon Ewing
相关产品推荐
相关产品推荐

