Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/woocomme.../src/Admin/API/Reports
File: StatsDataStoreTrait.php
<?php
[0] Fix | Delete
declare( strict_types = 1);
[1] Fix | Delete
[2] Fix | Delete
namespace Automattic\WooCommerce\Admin\API\Reports;
[3] Fix | Delete
[4] Fix | Delete
// Exit if accessed directly.
[5] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[6] Fix | Delete
exit;
[7] Fix | Delete
}
[8] Fix | Delete
[9] Fix | Delete
use Automattic\WooCommerce\Admin\API\Reports\SqlQuery;
[10] Fix | Delete
[11] Fix | Delete
/**
[12] Fix | Delete
* Trait to contain *stats-specific methods for data stores.
[13] Fix | Delete
*
[14] Fix | Delete
* It does preliminary intervals & page calculations
[15] Fix | Delete
* and prepares intervals & totals data structure by implementing the `get_noncached_data()` method.
[16] Fix | Delete
* So, this time, you'll need to prepare `get_noncached_stats_data()` which will be called only if
[17] Fix | Delete
* the requested page is within the date range.
[18] Fix | Delete
*
[19] Fix | Delete
* The trait also exposes the `initialize_queries()` method to initialize the interval and total queries.
[20] Fix | Delete
*
[21] Fix | Delete
* Example:
[22] Fix | Delete
* <pre><code class="language-php">class MyStatsDataStore extends DataStore implements DataStoreInterface {
[23] Fix | Delete
* // Use the trait.
[24] Fix | Delete
* use StatsDataStoreTrait;
[25] Fix | Delete
* // Provide all the necessary properties and methods for a regular DataStore.
[26] Fix | Delete
* // ...
[27] Fix | Delete
* /**
[28] Fix | Delete
* * Return your results with the help of the interval & total methods and queries.
[29] Fix | Delete
* * @return stdClass|WP_Error $data filled with your results.
[30] Fix | Delete
* &ast;/
[31] Fix | Delete
* public function get_noncached_stats_data( $query_args, $params, &$data, $expected_interval_count ) {
[32] Fix | Delete
* $this->initialize_queries();
[33] Fix | Delete
* // Do your magic ...
[34] Fix | Delete
* // ... with a help of things like:
[35] Fix | Delete
* $this->update_intervals_sql_params( $query_args, $db_interval_count, $expected_interval_count, $table_name );
[36] Fix | Delete
* $this->total_query->add_sql_clause( 'where_time', $this->get_sql_clause( 'where_time' ) );
[37] Fix | Delete
*
[38] Fix | Delete
* $totals = $wpdb->get_results(
[39] Fix | Delete
* $this->total_query->get_query_statement(),
[40] Fix | Delete
* ARRAY_A
[41] Fix | Delete
* );
[42] Fix | Delete
*
[43] Fix | Delete
* $intervals = $wpdb->get_results(
[44] Fix | Delete
* $this->interval_query->get_query_statement(),
[45] Fix | Delete
* ARRAY_A
[46] Fix | Delete
* );
[47] Fix | Delete
*
[48] Fix | Delete
* $data->totals = (object) $this->cast_numbers( $totals[0] );
[49] Fix | Delete
* $data->intervals = $intervals;
[50] Fix | Delete
*
[51] Fix | Delete
* if ( TimeInterval::intervals_missing( $expected_interval_count, $db_interval_count, $params['per_page'], $query_args['page'], $query_args['order'], $query_args['orderby'], count( $intervals ) ) ) {
[52] Fix | Delete
* $this->fill_in_missing_intervals( $db_intervals, $query_args['adj_after'], $query_args['adj_before'], $query_args['interval'], $data );
[53] Fix | Delete
* $this->sort_intervals( $data, $query_args['orderby'], $query_args['order'] );
[54] Fix | Delete
* $this->remove_extra_records( $data, $query_args['page'], $params['per_page'], $db_interval_count, $expected_interval_count, $query_args['orderby'], $query_args['order'] );
[55] Fix | Delete
* } else {
[56] Fix | Delete
* $this->update_interval_boundary_dates( $query_args['after'], $query_args['before'], $query_args['interval'], $data->intervals );
[57] Fix | Delete
* }
[58] Fix | Delete
*
[59] Fix | Delete
* return $data;
[60] Fix | Delete
* }
[61] Fix | Delete
* }
[62] Fix | Delete
* </code></pre>
[63] Fix | Delete
*
[64] Fix | Delete
* @see DataStore
[65] Fix | Delete
*/
[66] Fix | Delete
trait StatsDataStoreTrait {
[67] Fix | Delete
/**
[68] Fix | Delete
* Initialize query objects.
[69] Fix | Delete
*/
[70] Fix | Delete
protected function initialize_queries() {
[71] Fix | Delete
$this->clear_all_clauses();
[72] Fix | Delete
unset( $this->subquery );
[73] Fix | Delete
$table_name = self::get_db_table_name();
[74] Fix | Delete
[75] Fix | Delete
$this->total_query = new SqlQuery( $this->context . '_total' );
[76] Fix | Delete
$this->total_query->add_sql_clause( 'from', $table_name );
[77] Fix | Delete
[78] Fix | Delete
$this->interval_query = new SqlQuery( $this->context . '_interval' );
[79] Fix | Delete
$this->interval_query->add_sql_clause( 'from', $table_name );
[80] Fix | Delete
$this->interval_query->add_sql_clause( 'group_by', 'time_interval' );
[81] Fix | Delete
}
[82] Fix | Delete
[83] Fix | Delete
/**
[84] Fix | Delete
* Returns the stats report data based on normalized parameters.
[85] Fix | Delete
* Prepares the basic intervals and object structure
[86] Fix | Delete
* Will be called by `get_data` if there is no data in cache.
[87] Fix | Delete
* Will call `get_noncached_stats_data` to fetch the actual data.
[88] Fix | Delete
*
[89] Fix | Delete
* @see get_data
[90] Fix | Delete
* @param array $query_args Query parameters.
[91] Fix | Delete
* @return stdClass|WP_Error Data object, or error.
[92] Fix | Delete
*/
[93] Fix | Delete
public function get_noncached_data( $query_args ) {
[94] Fix | Delete
$params = $this->get_limit_params( $query_args );
[95] Fix | Delete
$expected_interval_count = TimeInterval::intervals_between( $query_args['after'], $query_args['before'], $query_args['interval'] );
[96] Fix | Delete
$total_pages = (int) ceil( $expected_interval_count / $params['per_page'] );
[97] Fix | Delete
[98] Fix | Delete
// Default, empty data object.
[99] Fix | Delete
$data = (object) array(
[100] Fix | Delete
'totals' => null,
[101] Fix | Delete
'intervals' => array(),
[102] Fix | Delete
'total' => $expected_interval_count,
[103] Fix | Delete
'pages' => $total_pages,
[104] Fix | Delete
'page_no' => (int) $query_args['page'],
[105] Fix | Delete
);
[106] Fix | Delete
// If the requested page is out off range, return the default empty object.
[107] Fix | Delete
if ( $query_args['page'] >= 1 && $query_args['page'] <= $total_pages ) {
[108] Fix | Delete
// Fetch the actual data.
[109] Fix | Delete
$data = $this->get_noncached_stats_data( $query_args, $params, $data, $expected_interval_count );
[110] Fix | Delete
[111] Fix | Delete
if ( ! is_wp_error( $data ) && is_array( $data->intervals ) ) {
[112] Fix | Delete
$this->create_interval_subtotals( $data->intervals );
[113] Fix | Delete
}
[114] Fix | Delete
}
[115] Fix | Delete
[116] Fix | Delete
return $data;
[117] Fix | Delete
}
[118] Fix | Delete
}
[119] Fix | Delete
[120] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function