如何在WordPress中对ACF字段recog-price的数值求和?
WordPress中ACF字段数值求和实现方案
问题背景
使用WP_Query查询car自定义文章类型的ACF字段recog-price,能正常输出字段值,但尝试用array_sum求和时无效。通过var_dump发现该字段的value为字符串类型的数值(如"200000")。
原查询代码:
<?php $income_query = new WP_Query( array( 'post_type' => 'car', 'post_status' => 'publish', 'posts_per_page' => '-1', 'orderby' => 'date', 'date_query' => array( 'after' => 'today', 'before' => 'tomorrow - 1 second', 'inclusive' => true, ), 'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1 ) ); ?> <?php if ($income_query->have_posts()): ?> <?php while ($income_query->have_posts()): $income_query->the_post(); ?> // Get field objects <?php $field = get_field_object('recog-price');?> // Echo field value key echo $field['value']; <?php endwhile; ?> <?php endif; ?>
var_dump($field)结果片段:
array(27) { // ... 其他字段省略 ["value"]=> string(6) "200000" // ... 其他字段省略 }
解决方案
方法一:循环内累加(适配现有代码)
在循环外初始化求和变量,每次循环将字符串类型的数值转换为整数后累加:
修改后的完整代码:
<?php $income_query = new WP_Query( array( 'post_type' => 'car', 'post_status' => 'publish', 'posts_per_page' => '-1', 'orderby' => 'date', 'date_query' => array( 'after' => 'today', 'before' => 'tomorrow - 1 second', 'inclusive' => true, ), 'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1 ) ); // 初始化求和变量 $total_price = 0; ?> <?php if ($income_query->have_posts()): ?> <?php while ($income_query->have_posts()): $income_query->the_post(); ?> <?php $field = get_field_object('recog-price'); // 将字符串转换为整数后累加 $price = intval($field['value']); $total_price += $price; // 保留原输出逻辑(可选) echo $field['value']; ?> <?php endwhile; ?> <!-- 输出总和 --> <p>总金额:<?php echo $total_price; ?> تومان</p> <?php endif; ?> <?php wp_reset_postdata(); // 重置查询数据,避免影响后续查询 ?>
方法二:直接查询数据库求和(性能更优)
无需循环所有帖子,直接通过$wpdb查询postmeta表计算总和,适合数据量较大的场景:
<?php global $wpdb; // 构建SQL查询,匹配car类型、发布状态、日期范围的recog-price字段总和 $total_price = $wpdb->get_var( $wpdb->prepare( "SELECT SUM(meta_value + 0) FROM {$wpdb->postmeta} JOIN {$wpdb->posts} ON {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID WHERE meta_key = %s AND post_type = %s AND post_status = %s AND post_date >= %s AND post_date < %s", 'recog-price', 'car', 'publish', date('Y-m-d 00:00:00'), // 今日开始时间 date('Y-m-d 23:59:59', strtotime('+1 day')) // 明日结束时间 ) ); // 输出总和 echo "<p>总金额:{$total_price} تومان</p>"; ?>
说明:meta_value + 0会自动将字符串类型的数值转换为整数,避免直接SUM(meta_value)导致字符串拼接而非数值求和。
内容的提问来源于stack exchange,提问作者Sirvav
相关产品推荐
相关产品推荐

