- Add code docs to the Analytics classes and make get_order_statuses non-internal.
Document analytics classes and some methods. Add simple examples of how to use it. Give a brief "why?" and "when?" answers. Add links between related classes.
- Replace `Automattic\WooCommerce\Admin\API\Reports\*\Query` classes with a single `GenericQuery` class.
- Reduce the amount of duplicated code in Analytics `DataStore`s.
- Reduce duplicated code in Analytics controllers
- Add `FilteredGetDataTrait`, `OrderAwareControllerTrait`, and `StatsDataStoreTrait` for extension developers to reuse while creating custom Analytics
- Add a `GenericQuery` to reduce duplicated code in Query classes.
Also, to expose it to community extensions for reuse.
- Use `GenericQuery` instead of duplicated `Query` classes
- Move caching code to shared `DataStore::get_data`
- Move intervals specific `initialize_queries` to shared Trait
- Move intervals checking logic to shared `StatsDataStoreTrait`
- Reuse `GenericController::prepare_item_for_response` for `Reports\Controller` subclasses
- Reuse `GenericController::get_collection_params` for `Reports\Controller` subclasses.
- Move `get_items` code to shared `GenericStatsController`
- Move shared paginable controllers `get_items` code to the generic class
- Move fields param to `GenericStatsController`
- Separate `OrderAwareControllerTrait` from `ReportController`
to allow specific Analytics Controllers to extend the `Generic(Stats)Controller` directly, without extending the `ReportController`, which is used to list reports.
It's meant not to change any behavior. However, due to unification, it did tweak a few things mostly from the developer perspective:
- Previously, only some controllers threw an error from `get_items` when the data was missing; some did not. Now controllers the following Controllers changed behavior to also for such an error:
- Coupons
- Customers
- Downloads
- Orders
- Products
- Taxes
- the error has one error code from all controllers:`woocommerce_rest_reports_invalid_response` (previously there were report-specific)
- `woocommerce_rest_reports_categories_invalid_response` -> `woocommerce_rest_reports_invalid_response`
- In Orders Controller, the `$orders_data['order_number'], $orders_data['total_formatted']` are set in the `prepare_item_for_response` method, not in the `get_items`So `prepare_item_for_response` function is expected to be called with bare data from Query
- In Products Controller extended-info is now sanitized in the `prepare_item_for_response` method, not in the `get_items`
- ⚠️ (breaking) Previosly some Controlers' `prepare_item_for_response` function was getting and expecting first argument to be casted to `object`, while the rest of controllers used data as returned from the Store. This PR unifies this behavior for
- `Coupons\Stats\Controller`
- `Taxes\Controller`
- `Taxes\Stats\Controller`
So, if you extend those classes and override `prepare_item_for_response` in a way that expects `object`, you will get an error. (I have not found such cases in the `all-plugins` repo.)
All `woocommerce_rest_prepare_report_*` filters remain intact and inconsistent for backward compatibility.
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Mik <mikkamp@users.noreply.github.com>
* Base Report data store utility functions - 1
Standardizing the data store classes will be easier if the base class contains simple utility functions
that can replace logic implemented in multiple data stores.
- set_db_table_name() assigns a WP DB table name class variable for the data store
- get_db_table_name() retrieves the WP DB table name
- prepend_table_name() prepends a field in a query fragment with the data store table name
* add context, clause handling, and filters to reports data store
* add generated SQL clauses to class properties
* reduce id getter logic to single function with filter, add phpdocs to new filters
* update table_name to private string for use in constructor
* extract SQL query clause handling to its own class
- Will allow for use in subquery processing without creating a get_data stub
- Swap parameter order in add_sql_clause for readability
- Add support for clearing multple clauses in one call
* add context var to SqlQuery class
* implement SqlQuery in Categories data store
* implement subquery in categories data store
* coupons data stores, more underlying refactor
- fix warnings
- make filtered id functions static
- add limit parameter handling
- update coupons data store
- update coupon stats data store
* refactor coupon stats data store
* refactor customers and customer stats data stores
* add context to subqueries
* add missed prepend table name call
* refactor downloads data store, fix some warnings
* fix warnings, add separator parameter to filtered IDs
* refactor taxes and tax stats data stores
* refactor variations data store
* refactor product and product stats data stores
* make table_name static throughout for compat with static hook functions
* refactor order and order stats datastores
- use consistent visibility on initialize_queries()
- update db_table_name logic to use static keyword instead of self
* fix missed whitespace
* fix segmenting query, add SqlQuery join clause
* DRY data store constructors, class properties
* prefix table name when not yet assigned
* fix unit tests, interpolations, WPDB delete calls
* DRY get_object_where_filter()
* remove redundant table prefix from unit test init
* fix refactored SQL queries
* restore product paging
* remove unused query param arrays
* add first pass on data docs readme
* remove debug code, errant SQL spacing
* refactor out outer_from query element
* merge wheres, joins before filtering
* move all report column definitions to assign_report_columns
* fix data readme markdown
* small code formating fixes from review
* remove static from query/datastore context
* missed self:: in previous, add comments, small code moves
* rename get_statement() to get_query_statement()
* remove temporary query references
* static reference, remove reference parameter, fix coupon compare
* add todo reminders
* use correct query parameter in coupon data stores
* Move header/row documentation into the component, so it can be rendered in the external docs
* Move project READMEs into docs folder for exposure in docs site
* Regenerate docs, generate component folder sidebar with component list
* Update format of CSS docs