tiredofit
Member
Posted 2 years ago #
I used custom fields to log the amount of distance I travel per day via a bicycle. I was wondering if there was a way that I could display the total amount of distance that I had travelled by addiing all the values in each of the posts on my home page in PHP.
Sum miles from all posts with Custom Field my_miles
<?php
$total_miles=0;
$meta_key = 'my_miles';//set this to your custom field meta key
$allmiles=$wpdb->get_col($wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key));
foreach ($allmiles as $miles) {
$total_miles = $total_miles + $miles;
}
echo 'Total miles is '.$total_miles;
?>
array_sum is your friend.. ;)
<?php
$miles = array();
$meta_key = 'abc';//set this to your custom field meta key
$miles = $wpdb->get_col($wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key));
echo 'Total miles is '.array_sum( $miles );
?>
You can actually drop this though, making it smaller still.
$miles = array();
get_col returns an empty array if on fail, or arrayed results on success.. meaning the array_sum will just return 0 on being an empty array.
tiredofit
Member
Posted 2 years ago #
Awesome! Thanks for the responses!
Learned that sum with get_var also works:
<?php
$meta_key = 'miles';//set this to your custom field meta key
$allmiles=$wpdb->get_var($wpdb->prepare("SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key));
echo '<p>Total miles is '.$allmiles . '</p>';
?>
Yes, that's certainly an alternateive, however..... if you sum in the query, and it fails you'll get an error from the echo (i think), where as the array_sum won't error because the result will still be an array.. it'll just be 0 ...
Just avoids any need to catch the error ... :)
So would adding $allmiles = 0; before the query work? Or are you saying that a failed query would put some error message (or value) in $allmiles?
Just interested...thanks.
Not sure, i havn't tested, but echo expects a string, when you echo the result of the query you'll receive whatever is output on fail (if it fails).
get_col outputs an empty array on fail, array_sum will not error as long as it's given a valid array, an empty array will simply return 0 for array_sum (no error).
Checking the docs suggests get_var returns NULL on fail.
http://codex.wordpress.org/Function_Reference/wpdb_Class#SELECT_a_Variable
So it should be fine i guess.. ;)
Is there a way to do this for only those posts with a specific tag?