如何计算WordPress近30天文章自定义字段distance的总和?
解决WordPress近30天跑步/骑行总里程计算问题
思路说明
你之前用query_posts获取文章的方式更适合内容展示,做聚合求和效率偏低,推荐两种更直接的实现方案:
方案一:循环文章累加里程(适合数据量小的场景)
用官方推荐的WP_Query替代query_posts,获取目标文章后逐个提取自定义字段值累加:
<?php // 初始化总里程为0 $total_distance = 0; // 构建查询参数 $args = array( 'post_type' => 'post', // 若用自定义文章类型,替换为你的类型名称(比如'activity') 'posts_per_page' => -1, // 取出所有符合条件的文章 'date_query' => array( array( 'after' => '-30 days', 'inclusive' => true, ), ), 'meta_key' => 'distance', // 指定目标自定义字段 ); $query = new WP_Query($args); // 循环累加里程 if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); // 获取字段值,默认0避免空值报错 $distance = get_post_meta(get_the_ID(), 'distance', true); $total_distance += is_numeric($distance) ? floatval($distance) : 0; } wp_reset_postdata(); // 重置查询上下文 } // 输出结果 echo '近30天总里程:' . $total_distance . ' 公里'; ?>
方案二:直接SQL查询求和(高效,适合数据量大的场景)
通过数据库聚合查询一次性计算总里程,省去循环过程:
<?php global $wpdb; // 计算30天前的时间戳 $thirty_days_ago = date('Y-m-d H:i:s', strtotime('-30 days')); // 执行聚合查询,注意表前缀如果不是wp_需替换 $total_distance = $wpdb->get_var( $wpdb->prepare( "SELECT SUM(meta_value) FROM {$wpdb->postmeta} INNER JOIN {$wpdb->posts} ON {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID WHERE meta_key = %s AND post_date > %s AND post_status = 'publish'", 'distance', $thirty_days_ago ) ); // 处理空值情况 $total_distance = $total_distance ? floatval($total_distance) : 0; // 输出结果 echo '近30天总里程:' . $total_distance . ' 公里'; ?>
注意事项
- 确保
distance自定义字段存储的是纯数字(整数/小数),非数字内容会导致求和错误,方案一的is_numeric判断可过滤这类情况。 - 若使用自定义文章类型,方案一需修改
post_type参数;方案二可在SQL中添加AND post_type = '你的类型名称'条件。
内容的提问来源于stack exchange,提问作者kaeand
相关产品推荐
相关产品推荐

