/** * 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.