s. * @return void */ public function image( $url, $width = 0, $height = 0, $alt = '', $attr = [] ) { $atts = $attr; $atts['border'] = '0'; if ( ! isset( $atts['src'] ) ) { $atts['src'] = $url; } if ( ! isset( $atts['width'] ) && $width ) { $atts['width'] = $width; } if ( ! isset( $atts['height'] ) && $height ) { $atts['height'] = $height; } if ( ! isset( $atts['alt'] ) ) { $atts['alt'] = $alt; } if ( ! isset( $atts['style'] ) ) { $atts['style'] = 'border: 0; outline: none; text-decoration: none; display: inline-block;'; } if ( substr( $atts['src'], 0, 4 ) !== 'http' && substr( $atts['src'], 0, 3 ) !== '###' ) { $atts['src'] = $this->assets_url . 'img/' . $atts['src']; } $atts = $this->do_filter( 'analytics/email_report_image_atts', $atts, $url, $width, $height, $alt, $attr ); $attributes = ''; foreach ( $atts as $name => $value ) { if ( ! empty( $value ) ) { $value = ( 'src' === $name ) ? esc_url_raw( $value ) : esc_attr( $value ); $attributes .= ' ' . $name . '="' . $value . '"'; } } $image = ""; $image = $this->do_filter( 'analytics/email_report_image_html', $image, $url, $width, $height, $alt, $attr ); echo $image; // phpcs:ignore } /** * Gets template path. * * @param string $template_name Template name. * @param bool $return_full_path Return the full path or not. * @return string */ public function locate_template( $template_name, $return_full_path = true ) { $default_paths = [ $this->views_path ]; $template_paths = $this->do_filter( 'analytics/email_report_template_paths', $default_paths ); $paths = array_reverse( $template_paths ); $located = ''; $path_partial = ''; foreach ( $paths as $path ) { if ( file_exists( $full_path = trailingslashit( $path ) . $template_name . '.php' ) ) { // phpcs:ignore $located = $full_path; $path_partial = $path; break; } } return $return_full_path ? $located : $path_partial; } /** * Load all graph data into memory. * * @return void */ private function load_graph_data() { $period = self::get_period_from_frequency(); $stats = Stats::get(); $stats->set_date_range( "-{$period} days" ); $this->graph_data = (array) $stats->get_analytics_summary_graph(); } /** * Get data points for graph. * * @param string $chart Chart to get data for. * @return array */ public function get_graph_data( $chart ) { if ( empty( $this->graph_data ) ) { $this->load_graph_data(); } $data = []; $group = 'merged'; $prop = $chart; if ( 'traffic' === $chart ) { $group = 'traffic'; $prop = 'pageviews'; } if ( empty( $this->graph_data[ $group ] ) ) { return $data; } foreach ( (array) $this->graph_data[ $group ] as $range_data ) { $range_data = (array) $range_data; if ( isset( $range_data[ $prop ] ) ) { $data[] = $range_data[ $prop ]; } } return $data; } /** * Charts API sign request. * * @param string $query Query. * @param string $code Code. * @return string */ private function charts_api_sign( $query, $code ) { return hash_hmac( 'sha256', $query, $code ); } /** * Generate URL for the Charts API image. * * @param array $graph_data Graph data points. * @param int $width Image height. * @param int $height Image width. * * @return string */ private function charts_api_url( $graph_data, $width = 192, $height = 102 ) { $params = [ 'chco' => '80ace7', 'chds' => 'a', 'chf' => 'bg,s,f7f9fb', 'chls' => 4, 'chm' => 'B,e2eeff,0,0,0', 'chs' => "{$width}x{$height}", 'cht' => 'ls', 'chd' => 'a:' . join( ',', $graph_data ), 'icac' => $this->charts_account, ]; $query_string = urldecode( http_build_query( $params ) ); $signature = $this->charts_api_sign( $query_string, $this->charts_key ); return 'https://charts.rankmath.com/chart?' . $query_string . '&ichm=' . $signature; } /** * Check if fields should be hidden. * * @return bool */ public static function are_fields_hidden() { return apply_filters( 'rank_math/analytics/hide_email_report_options', false ); } }