/**
* End date for Jetpack stats queries (site timezone).
*
* @return string
*/
function rover_stats_dashboard_stats_end_date() {
return wp_date( 'Y-m-d' );
}
/**
* Normalize a Jetpack stats CSV row to lowercase keys.
*
* @param array $row Raw row.
* @return array
*/
function rover_stats_dashboard_normalize_row( $row ) {
if ( ! is_array( $row ) ) {
return array();
}
$normalized = array();
foreach ( $row as $key => $value ) {
$normalized[ strtolower( (string) $key ) ] = $value;
}
return $normalized;
}
/**
* Fetch and normalize Jetpack stats rows.
*
* @param string $table Stats table name.
* @param array $args Query args.
* @return array
*/
function rover_stats_dashboard_fetch_csv( $table, $args = array() ) {
if ( ! function_exists( 'stats_get_csv' ) ) {
return array();
}
$args = wp_parse_args(
$args,
array(
'days' => 30,
'limit' => 100,
'end' => rover_stats_dashboard_stats_end_date(),
)
);
$rows = stats_get_csv( $table, $args );
if ( ! is_array( $rows ) || empty( $rows ) ) {
return array();
}
$normalized = array();
foreach ( $rows as $row ) {
$item = rover_stats_dashboard_normalize_row( $row );
if ( ! empty( $item ) ) {
$normalized[] = $item;
}
}
return $normalized;
}
/**
* Read the first matching value from a stats row.
*
* @param array $row Stats row.
* @param array|string $keys Candidate keys.
* @param mixed $default Default value.
* @return mixed
*/
function rover_stats_dashboard_row_value( $row, $keys, $default = '' ) {
foreach ( (array) $keys as $key ) {
$lookup = strtolower( (string) $key );
if ( isset( $row[ $lookup ] ) && '' !== $row[ $lookup ] && null !== $row[ $lookup ] ) {
return $row[ $lookup ];
}
}
return $default;
}
/**
* @param array $row Stats row.
* @return int
*/
function rover_stats_dashboard_row_views( $row ) {
return (int) rover_stats_dashboard_row_value( $row, array( 'views', 'views_count', 'cnt', 'count' ), 0 );
}
/**
* @param array $row Stats row.
* @return string
*/
function rover_stats_dashboard_row_date( $row ) {
return (string) rover_stats_dashboard_row_value( $row, array( 'date', 'day', 'period' ), '' );
}
/**
* Summarize total views from a Jetpack views CSV result.
*
* @param array|null $rows Stats rows.
* @return int
*/
function rover_stats_dashboard_sum_views_rows( $rows ) {
if ( empty( $rows ) || ! is_array( $rows ) ) {
return 0;
}
$total = 0;
foreach ( $rows as $row ) {
if ( ! is_array( $row ) ) {
continue;
}
$total += rover_stats_dashboard_row_views( $row );
}
return $total;
}
/**
* Convert daily stats rows into chart-friendly data.
*
* @param array $rows Stats rows.
* @return array
*/
function rover_stats_dashboard_parse_daily_views_rows( $rows ) {
$daily = array();
foreach ( (array) $rows as $row ) {
if ( ! is_array( $row ) ) {
continue;
}
$date = rover_stats_dashboard_row_date( $row );
if ( ! $date ) {
continue;
}
$date_key = substr( $date, 0, 10 );
if ( ! isset( $daily[ $date_key ] ) ) {
$daily[ $date_key ] = 0;
}
$daily[ $date_key ] += rover_stats_dashboard_row_views( $row );
}
if ( empty( $daily ) ) {
return array();
}
ksort( $daily );
$output = array();
foreach ( $daily as $date => $views ) {
if ( $views <= 0 ) {
continue;
}
$output[] = array(
'date' => $date,
'views' => (int) $views,
);
}
return $output;
}
/**
* Daily site views from Jetpack, with postviews fallback.
*
* @param int $days Days to look back.
* @return array
*/
function rover_stats_dashboard_get_daily_site_views( $days ) {
$days = max( 1, absint( $days ) );
$args = array(
'days' => $days,
'limit' => -1,
);
$view_rows = rover_stats_dashboard_fetch_csv( 'views', $args );
$daily = rover_stats_dashboard_parse_daily_views_rows( $view_rows );
if ( ! empty( $daily ) ) {
return $daily;
}
$post_rows = rover_stats_dashboard_fetch_csv( 'postviews', $args );
return rover_stats_dashboard_parse_daily_views_rows( $post_rows );
}
/**
* Total site views for a period.
*
* @param int $days Days to look back.
* @return int
*/
function rover_stats_dashboard_get_site_views_total( $days ) {
$days = max( 1, absint( $days ) );
$daily = rover_stats_dashboard_get_daily_site_views( $days );
if ( ! empty( $daily ) ) {
if ( 1 === $days ) {
$last = end( $daily );
return isset( $last['views'] ) ? (int) $last['views'] : 0;
}
$slice = array_slice( $daily, -1 * $days );
return array_sum( wp_list_pluck( $slice, 'views' ) );
}
$rows = rover_stats_dashboard_fetch_csv(
'views',
array(
'days' => $days,
'limit' => 1,
'summarize' => 1,
)
);
return rover_stats_dashboard_sum_views_rows( $rows );
}
/**
* Country label from a two-letter code.
*
* @param string $code Country code.
* @param string $fallback Fallback label.
* @return string
*/
function rover_stats_dashboard_country_name( $code, $fallback = '' ) {
$code = strtoupper( substr( trim( (string) $code ), 0, 2 ) );
if ( 2 === strlen( $code ) && class_exists( 'Locale' ) ) {
$name = Locale::getDisplayRegion( '-' . $code, 'en' );
if ( $name && '-' . $code !== $name ) {
return $name;
}
}
return $fallback ? $fallback : $code;
}
/**
* Flag emoji for a two-letter country code.
*
* @param string $code Country code.
* @return string
*/
function rover_stats_dashboard_country_flag( $code ) {
$code = strtoupper( substr( trim( (string) $code ), 0, 2 ) );
if ( 2 !== strlen( $code ) ) {
return '';
}
if ( function_exists( 'mb_chr' ) ) {
$offset = 127397;
return mb_chr( $offset + ord( $code[0] ) ) . mb_chr( $offset + ord( $code[1] ) );
}
return '';
}
Lucy Spence, Author at Irish Rover - Page 2 of 4
Lucy Spence, '27
Editor-in-Chief
Lucy Spence is a junior from northern Virginia studying piano performance and the Program of Liberal Studies, with a minor in philosophy. She likes goat cheese, pickles, and coffee, of which she drinks exorbitant amounts. What she values most in life is a good book recommendation. Send her one at lspence@nd.edu .
“It will be one of the most powerful means for good in this country.” – Fr. Edward Sorin