如何修改ACF自定义函数以跨页面获取重复器字段的值?
修改ACF区块字段获取函数以支持重复器字段
原函数仅能获取单个字段,且找到第一个匹配区块后就停止遍历。要支持重复器字段,我们可以调整逻辑,让函数既能返回重复器的数组数据,也保留对普通字段的支持,还能选择返回第一个匹配区块或所有匹配区块的内容:
function get_field_from_block( $selector, $post_id, $block_name, $return_all = false ) { if ( ! has_blocks( $post_id ) ) { return false; } $post_blocks = parse_blocks( get_the_content( '', false, $post_id ) ); $results = []; foreach ( $post_blocks as $block ) { // 匹配目标ACF区块 if ( isset( $block['blockName'] ) && $block['blockName'] === $block_name ) { // 检查目标字段是否存在 if ( isset( $block['attrs']['data'][$selector] ) ) { $field_value = $block['attrs']['data'][$selector]; // 不需要返回所有的话,直接返回第一个匹配值 if ( !$return_all ) { return $field_value; } // 需要返回所有的话,存入结果数组 $results[] = $field_value; } // 不再强制中断,继续检查后续同类型区块 } } // 请求返回所有则返回结果数组,否则返回false(未找到匹配) return $return_all ? $results : false; }
调用示例
1. 获取普通单个字段(与原用法一致)
$ticker = get_field_from_block('coin_ban_ticker', $post->ID, 'acf/coin-banner');
2. 获取单个区块的重复器字段
假设重复器字段名为coin_list,子字段包含coin_name和coin_price:
$coin_repeater = get_field_from_block('coin_list', $post->ID, 'acf/coin-banner'); // 遍历重复器数据 if ( $coin_repeater && is_array($coin_repeater) ) { foreach ( $coin_repeater as $item ) { echo '币种:' . $item['coin_name'] . ',价格:' . $item['coin_price'] . '<br>'; } }
3. 获取所有匹配区块的重复器字段
如果页面存在多个同类型ACF区块,想要获取所有区块的重复器数据,开启$return_all参数:
$all_coin_repeaters = get_field_from_block('coin_list', $post->ID, 'acf/coin-banner', true); if ( $all_coin_repeaters ) { foreach ( $all_coin_repeaters as $repeater ) { foreach ( $repeater as $item ) { echo '币种:' . $item['coin_name'] . ',价格:' . $item['coin_price'] . '<br>'; } } }
内容的提问来源于stack exchange,提问作者Katharine Kulikova
相关产品推荐
相关产品推荐

