Files
wp-multisite-waas/inc/objects/class-visits.php
2025-02-07 19:02:33 -07:00

192 lines
4.4 KiB
PHP

<?php
/**
* Visit manager for sites.
*
* @package WP_Ultimo
* @subpackage Objects
* @since 2.0.0
*/
namespace WP_Ultimo\Objects;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Visit manager for sites.
*
* @since 2.0.0
*/
class Visits {
/**
* Key to save on the database.
*/
const KEY = 'wu_visits';
/**
* @var int
*/
protected $site_id;
/**
* Sets the current site to manage.
*
* @since 2.0.0
*
* @param int $site_id The current site id.
*/
public function __construct($site_id) {
$this->site_id = $site_id;
}
/**
* Returns the meta key to save visits.
*
* @since 2.0.0
*
* @param boolean $day The day in the Ymd format. E.g. 20210211.
*/
protected function get_meta_key($day): string {
return sprintf('%s_%s', self::KEY, $day);
}
/**
* Adds visits to a site count.
*
* @since 2.0.0
*
* @param integer $count Counts to add.
* @param boolean $day The day in the Ymd format. E.g. 20210211.
* @return bool
*/
public function add_visit($count = 1, $day = false) {
if ( ! $day) {
$day = gmdate('Ymd');
}
$key = $this->get_meta_key($day);
$current_value = (int) get_site_meta($this->site_id, $key, true);
$new_value = $current_value + $count;
return update_site_meta($this->site_id, $key, $new_value);
}
/**
* Returns an array of the dates and counts by day.
*
* @since 2.0.0
*
* @param bool|string $start_date The start date. Any strtotime-compatible string works.
* @param bool|string $end_date The end date. Any strtotime-compatible string works.
* @return array
*/
public function get_visits($start_date = false, $end_date = false) {
global $wpdb;
if ( ! $start_date) {
$start_date = wu_get_current_time('mysql', true);
}
if ( ! $end_date) {
$end_date = wu_get_current_time('mysql', true);
}
$query = $wpdb->prepare(
"
SELECT meta_value as count, str_to_date(meta_key, 'wu_visits_%%Y%%m%%d') as day, blog_id as site_id
FROM {$wpdb->base_prefix}blogmeta
WHERE blog_id = %d
",
$this->site_id
);
$query .= $wpdb->prepare(" AND str_to_date(meta_key, 'wu_visits_%%Y%%m%%d') BETWEEN %s AND %s", gmdate('Y-m-d', strtotime($start_date)), gmdate('Y-m-d', strtotime($end_date)));
return $wpdb->get_results($query); // phpcs:ignore
}
/**
* The total visits for the current site.
*
* @since 2.0.0
*
* @param bool|string $start_date The start date. Any strtotime-compatible string works.
* @param bool|string $end_date The end date. Any strtotime-compatible string works.
* @return int
*/
public function get_visit_total($start_date = false, $end_date = false) {
global $wpdb;
if ( ! $start_date) {
$start_date = wu_get_current_time('mysql', true);
}
if ( ! $end_date) {
$end_date = wu_get_current_time('mysql', true);
}
$query = $wpdb->prepare(
"
SELECT SUM(meta_value) as count
FROM {$wpdb->base_prefix}blogmeta
WHERE blog_id = %d
",
$this->site_id
);
$query .= $wpdb->prepare(" AND str_to_date(meta_key, 'wu_visits_%%Y%%m%%d') BETWEEN %s AND %s", gmdate('Y-m-d', strtotime($start_date)), gmdate('Y-m-d', strtotime($end_date)));
return (int) $wpdb->get_var($query); // phpcs:ignore
}
/**
* Get sites by visit count.
*
* @since 2.0.0
*
* @param bool|string $start_date The start date. Any strtotime-compatible string works.
* @param bool|string $end_date The end date. Any strtotime-compatible string works.
* @param integer $limit The number of sites to return.
* @return array
*/
public static function get_sites_by_visit_count($start_date = false, $end_date = false, $limit = 5) {
global $wpdb;
if ( ! $start_date) {
$start_date = wu_get_current_time('mysql', true);
}
if ( ! $end_date) {
$end_date = wu_get_current_time('mysql', true);
}
$sub_query = "
SELECT SUM(meta_value) as count, blog_id
FROM {$wpdb->base_prefix}blogmeta as m
";
$sub_query .= $wpdb->prepare(" WHERE str_to_date(meta_key, 'wu_visits_%%Y%%m%%d') BETWEEN %s AND %s", gmdate('Y-m-d', strtotime($start_date)), gmdate('Y-m-d', strtotime($end_date)));
$sub_query .= ' GROUP BY blog_id';
// phpcs:disable
$query = $wpdb->prepare("
SELECT b.blog_id as site_id, s.count
FROM {$wpdb->base_prefix}blogs as b
JOIN ({$sub_query}) as s
ON s.blog_id = b.blog_id
ORDER BY count DESC
LIMIT %d
", $limit);
// phpcs:enable
return $wpdb->get_results($query); // phpcs:ignore
}
}