You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

286 lines
7.9 KiB
PHP

<?php
/**
* The Analytics Module
*
* @since 2.0.0
* @package RankMathPro
* @subpackage RankMathPro\modules
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro\Analytics;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Analytics\Stats;
use RankMath\Admin\Admin_Helper;
use RankMathPro\Admin\Admin_Helper as ProAdminHelper;
use MyThemeShop\Helpers\DB as DB_Helper;
defined( 'ABSPATH' ) || exit;
/**
* Summary class.
*/
class Summary {
use Hooker;
/**
* Constructor.
*/
public function __construct() {
if ( \RankMathPro\Google\Adsense::is_adsense_connected() ) {
$this->filter( 'rank_math/analytics/summary', 'get_adsense_summary' );
}
if ( \RankMath\Google\Analytics::is_analytics_connected() ) {
$this->filter( 'rank_math/analytics/summary', 'get_pageviews_summary' );
$this->filter( 'rank_math/analytics/get_widget', 'get_pageviews_summary' );
}
$this->filter( 'rank_math/analytics/summary', 'get_clicks_summary' );
$this->filter( 'rank_math/analytics/summary', 'get_g_update_summary' );
$this->filter( 'rank_math/analytics/posts_summary', 'get_posts_summary', 10, 3 );
$this->filter( 'rank_math/analytics/analytics_summary_graph', 'get_analytics_summary_graph', 10, 2 );
$this->filter( 'rank_math/analytics/analytics_tables_info', 'get_analytics_tables_info' );
}
/**
* Get posts summary.
*
* @param object $summary Posts summary.
* @param string $post_type Post type.
* @param string $query Query to get the summary data.
* @return object
*/
public function get_posts_summary( $summary, $post_type, $query ) {
if ( empty( $summary ) ) {
return $summary;
}
if ( $post_type && is_string( $post_type ) ) {
global $wpdb;
$query->leftJoin( $wpdb->prefix . 'rank_math_analytics_objects', $wpdb->prefix . 'rank_math_analytics_gsc.page', $wpdb->prefix . 'rank_math_analytics_objects.page' );
$query->where( $wpdb->prefix . 'rank_math_analytics_objects.object_subtype', sanitize_key( $post_type ) );
$summary = (object) $query->one();
}
$summary->pageviews = DB::traffic()
->selectSum( 'pageviews', 'pageviews' )
->whereBetween( 'created', [ Stats::get()->start_date, Stats::get()->end_date ] )
->getVar();
return $summary;
}
/**
* Get pageviews summary.
*
* @param object $stats Stats holder.
* @return object
*/
public function get_pageviews_summary( $stats ) {
$pageviews = DB::traffic()
->selectSum( 'pageviews', 'pageviews' )
->whereBetween( 'created', [ Stats::get()->start_date, Stats::get()->end_date ] )
->getVar();
$old_pageviews = DB::traffic()
->selectSum( 'pageviews', 'pageviews' )
->whereBetween( 'created', [ Stats::get()->compare_start_date, Stats::get()->compare_end_date ] )
->getVar();
$stats->pageviews = [
'total' => (int) $pageviews,
'previous' => (int) $old_pageviews,
'difference' => (int) $pageviews - (int) $old_pageviews,
];
return $stats;
}
/**
* Get adsense summary.
*
* @param object $stats Stats holder.
* @return object
*/
public function get_adsense_summary( $stats ) {
$stats->adsense = [
'total' => 0,
'previous' => 0,
'difference' => 0,
];
if ( DB_Helper::check_table_exists( 'rank_math_analytics_adsense' ) ) {
$earnings = DB::adsense()
->selectSum( 'earnings', 'earnings' )
->whereBetween( 'created', [ Stats::get()->start_date, Stats::get()->end_date ] )
->getVar();
$old_earnings = DB::adsense()
->selectSum( 'earnings', 'earnings' )
->whereBetween( 'created', [ Stats::get()->compare_start_date, Stats::get()->compare_end_date ] )
->getVar();
$stats->adsense = [
'total' => (int) $earnings,
'previous' => (int) $old_earnings,
'difference' => (int) $earnings - (int) $old_earnings,
];
}
return $stats;
}
/**
* Get analytics and adsense graph data.
*
* @param object $data Graph data.
* @param array $intervals Date intervals.
* @return array
*/
public function get_analytics_summary_graph( $data, $intervals ) {
global $wpdb;
if ( \RankMath\Google\Analytics::is_analytics_connected() ) {
$data->traffic = $this->get_traffic_graph( $intervals );
// Convert types.
$data->traffic = array_map( [ Stats::get(), 'normalize_graph_rows' ], $data->traffic );
// Merge for performance.
$data->merged = Stats::get()->get_merge_data_graph( $data->traffic, $data->merged, $intervals['map'] );
}
if ( \RankMathPro\Google\Adsense::is_adsense_connected() ) {
$data->adsense = $this->get_adsense_graph( $intervals );
// Convert types.
$data->adsense = array_map( [ Stats::get(), 'normalize_graph_rows' ], $data->adsense );
// Merge for performance.
$data->merged = Stats::get()->get_merge_data_graph( $data->adsense, $data->merged, $intervals['map'] );
}
return $data;
}
/**
* Get analytics graph data.
*
* @param array $intervals Date intervals.
* @return array
*/
public function get_traffic_graph( $intervals ) {
global $wpdb;
$sql_daterange = Stats::get()->get_sql_date_intervals( $intervals );
$query = $wpdb->prepare(
"SELECT DATE_FORMAT( created, '%%Y-%%m-%%d') as date, SUM(pageviews) as pageviews, {$sql_daterange}
FROM {$wpdb->prefix}rank_math_analytics_ga
WHERE created BETWEEN %s AND %s
GROUP BY range_group",
Stats::get()->start_date,
Stats::get()->end_date
);
$traffic_data = $wpdb->get_results( $query );
// phpcs:enable
return $traffic_data;
}
/**
* Get adsense graph data.
*
* @param array $intervals Date intervals.
* @return array
*/
public function get_adsense_graph( $intervals ) {
global $wpdb;
$adsense_data = [];
if ( DB_Helper::check_table_exists( 'rank_math_analytics_adsense' ) ) {
$sql_daterange = Stats::get()->get_sql_date_intervals( $intervals );
$query = $wpdb->prepare(
"SELECT DATE_FORMAT( created, '%%Y-%%m-%%d') as date, SUM(earnings) as earnings, {$sql_daterange}
FROM {$wpdb->prefix}rank_math_analytics_adsense
WHERE created BETWEEN %s AND %s
GROUP BY range_group",
Stats::get()->start_date,
Stats::get()->end_date
);
$adsense_data = $wpdb->get_results( $query );
// phpcs:enable
}
return $adsense_data;
}
/**
* Get clicks summary.
*
* @param object $stats Stats holder.
* @return object
*/
public function get_clicks_summary( $stats ) {
$clicks = DB::analytics()
->selectSum( 'clicks', 'clicks' )
->whereBetween( 'created', [ Stats::get()->start_date, Stats::get()->end_date ] )
->getVar();
$old_clicks = DB::analytics()
->selectSum( 'clicks', 'clicks' )
->whereBetween( 'created', [ Stats::get()->compare_start_date, Stats::get()->compare_end_date ] )
->getVar();
$stats->clicks = [
'total' => (int) $clicks,
'previous' => (int) $old_clicks,
'difference' => $clicks - $old_clicks,
];
return $stats;
}
/**
* Get google update summary.
*
* @param object $stats Stats holder.
* @return object
*/
public function get_g_update_summary( $stats ) {
if ( ! Helper::get_settings( 'general.google_updates' ) && ProAdminHelper::is_business_plan() ) {
$stats->graph->g_updates = null;
return $stats;
}
$stored = get_site_option( 'rank_math_pro_google_updates' );
$g_updates = json_decode( $stored );
$stats->graph->g_updates = $g_updates;
return $stats;
}
/**
* Get analytics tables info
*
* @param array $data Analytics tables info.
* @return array
*/
public function get_analytics_tables_info( $data ) {
$pro_data = DB::info();
$days = $data['days'] + $pro_data['days'];
$rows = $data['rows'] + $pro_data['rows'];
$size = $data['size'] + $pro_data['size'];
$data = compact( 'days', 'rows', 'size' );
return $data;
}
}