automatewoo/admin/Analytics/Rest_API/Upstream/Generic_Stats_Store.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

137 lines
4.9 KiB
PHP

<?php
namespace AutomateWoo\Admin\Analytics\Rest_API\Upstream;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use Automattic\WooCommerce\Admin\API\Reports\TimeInterval;
use Automattic\WooCommerce\Admin\API\Reports\SqlQuery;
use Automattic\WooCommerce\Admin\API\Reports\DataStore as Reports_Data_Store;
use stdClass;
use WP_Error;
/**
* This is a generic class, to cover bits shared by all reports.
* Discovered in https://github.com/woocommerce/automatewoo/pull/1226
* and https://github.com/woocommerce/automatewoo/pull/1250
* We may consider moving it eventually to `Automattic\WooCommerce\Admin\API\Reports\DataStore`,
* so the other extensions and WC itself could make use of it, and get DRYier.
* https://github.com/woocommerce/automatewoo/issues/1238
*
* @extends Reports_Data_Store
* @version 5.6.8
*/
class Generic_Stats_Store extends Reports_Data_Store {
/**
* Report columns.
*
* @var array
*/
protected $report_columns;
/**
* Updates the database query with interval parameters.
*
* @param array $query_args
* @return void
*/
protected function update_sql_query_params( $query_args ) {
$table_name = self::get_db_table_name();
$this->add_time_period_sql_params( $query_args, $table_name );
$this->add_intervals_sql_params( $query_args, $table_name );
$this->add_order_by_sql_params( $query_args );
$this->interval_query->add_sql_clause( 'select', $this->get_sql_clause( 'select' ) . ' AS time_interval' );
}
/**
* Returns the report data based on parameters supplied by the user.
* Fetches it from cache or returns `get_noncached_stats_data` result.
*
* @see get_noncached_stats_data
* @param array $query_args Query parameters.
* @return stdClass|WP_Error Data object `{ totals: *, intervals: array, total: int, pages: int, page_no: int }`, or error.
*/
public function get_data( $query_args ) {
// These defaults are only partially applied when used via REST API, as that has its own defaults.
$defaults = array(
'per_page' => get_option( 'posts_per_page' ),
'page' => 1,
'order' => 'ASC',
'orderby' => 'date',
'before' => TimeInterval::default_before(),
'after' => TimeInterval::default_after(),
'fields' => '*',
'interval' => 'week',
);
$query_args = wp_parse_args( $query_args, $defaults );
$this->normalize_timezones( $query_args, $defaults );
/*
* We need to get the cache key here because
* parent::update_intervals_sql_params() modifies $query_args.
*/
$cache_key = $this->get_cache_key( $query_args );
$data = $this->get_cached_data( $cache_key );
if ( false === $data ) {
$params = $this->get_limit_params( $query_args );
$expected_interval_count = TimeInterval::intervals_between( $query_args['after'], $query_args['before'], $query_args['interval'] );
$total_pages = (int) ceil( $expected_interval_count / $params['per_page'] );
// Default, empty data object.
$data = (object) array(
'totals' => null,
'intervals' => [],
'total' => $expected_interval_count,
'pages' => $total_pages,
'page_no' => (int) $query_args['page'],
);
// If the requested page is out off range, return the deault empty object.
if ( $query_args['page'] >= 1 && $query_args['page'] <= $total_pages ) {
// Fetch the actual data.
$data = $this->get_noncached_stats_data( $query_args, $params, $data, $expected_interval_count );
}
$this->set_cached_data( $cache_key, $data );
}
return $data;
}
/**
* Returns the report data based on normalized parameters.
* Will be called by `get_data` if there is no data in cache.
*
* @see get_data
* @param array $query_args Query parameters.
* @param array $params Query limit parameters.
* @param stdClass $data Reference to the data object to fill.
* @param int $expected_interval_count Number of expected intervals.
* @return stdClass|WP_Error Data object `{ totals: *, intervals: array, total: int, pages: int, page_no: int }`, or error.
*/
public function get_noncached_stats_data( $query_args, $params, &$data, $expected_interval_count ) {
/* translators: %s: Method name */
return new \WP_Error( 'invalid-method', sprintf( __( "Method '%s' not implemented. Must be overridden in subclass.", 'automatewoo' ), __METHOD__ ), array( 'status' => 405 ) );
}
/**
* Initialize query objects.
*/
protected function initialize_queries() {
$this->clear_all_clauses();
unset( $this->subquery );
$table_name = self::get_db_table_name();
$this->total_query = new SqlQuery( $this->context . '_total' );
$this->total_query->add_sql_clause( 'from', $table_name );
$this->interval_query = new SqlQuery( $this->context . '_interval' );
$this->interval_query->add_sql_clause( 'from', $table_name );
$this->interval_query->add_sql_clause( 'group_by', 'time_interval' );
}
}