262 lines
7.4 KiB
PHP
262 lines
7.4 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Reports API
|
||
|
*
|
||
|
* @package EDD
|
||
|
* @subpackage Reports
|
||
|
* @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
|
||
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
||
|
* @since 3.0
|
||
|
*/
|
||
|
namespace EDD\Reports;
|
||
|
|
||
|
/**
|
||
|
* Core class that initializes the Reports API.
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*/
|
||
|
final class Init {
|
||
|
|
||
|
/**
|
||
|
* Handles including or requiring files central to the reports API.
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*/
|
||
|
public static function bootstrap() {
|
||
|
$reports_dir = EDD_PLUGIN_DIR . 'includes/reports/';
|
||
|
|
||
|
// Functions.
|
||
|
require_once $reports_dir . 'reports-functions.php';
|
||
|
|
||
|
// Exceptions.
|
||
|
require_once $reports_dir . 'exceptions/class-invalid-parameter.php';
|
||
|
require_once $reports_dir . 'exceptions/class-invalid-view.php';
|
||
|
require_once $reports_dir . 'exceptions/class-invalid-view-parameter.php';
|
||
|
|
||
|
// Dependencies.
|
||
|
require_once $reports_dir . 'class-registry.php';
|
||
|
require_once $reports_dir . 'data/class-base-object.php';
|
||
|
require_once $reports_dir . 'data/class-endpoint-view-registry.php';
|
||
|
|
||
|
// Reports.
|
||
|
require_once $reports_dir . 'data/class-report-registry.php';
|
||
|
require_once $reports_dir . 'data/class-report.php';
|
||
|
|
||
|
// Endpoints.
|
||
|
require_once $reports_dir . 'data/class-endpoint.php';
|
||
|
require_once $reports_dir . 'data/class-tile-endpoint.php';
|
||
|
require_once $reports_dir . 'data/class-table-endpoint.php';
|
||
|
require_once $reports_dir . 'data/class-chart-endpoint.php';
|
||
|
require_once $reports_dir . 'data/class-endpoint-registry.php';
|
||
|
|
||
|
// Chart Dependencies.
|
||
|
require_once $reports_dir . 'data/charts/v2/class-manifest.php';
|
||
|
require_once $reports_dir . 'data/charts/v2/class-dataset.php';
|
||
|
require_once $reports_dir . 'data/charts/v2/class-bar-dataset.php';
|
||
|
require_once $reports_dir . 'data/charts/v2/class-line-dataset.php';
|
||
|
require_once $reports_dir . 'data/charts/v2/class-pie-dataset.php';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets up the Reports API.
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
|
||
|
// Avoid multiple initializations
|
||
|
if ( did_action( 'edd_reports_init' ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
self::bootstrap();
|
||
|
|
||
|
$reports = Data\Report_Registry::instance();
|
||
|
|
||
|
$reports = $this->legacy_reports( $reports );
|
||
|
|
||
|
$reports = $this->register_core_endpoint_views( $reports );
|
||
|
|
||
|
/**
|
||
|
* Fires when the Reports API is initialized.
|
||
|
*
|
||
|
* Use this hook to register new reports and endpoints.
|
||
|
*
|
||
|
* Example:
|
||
|
*
|
||
|
* add_action( 'edd_reports_init', function( $reports ) {
|
||
|
*
|
||
|
* try {
|
||
|
* $reports->add_report( 'test', array(
|
||
|
* 'label' => 'Test',
|
||
|
* 'priority' => 11,
|
||
|
* 'endpoints' => array(
|
||
|
*
|
||
|
* // Endpoints supporting multiple view groups can be reused:
|
||
|
* 'tiles' => array( 'test_endpoint', ... ),
|
||
|
* 'tables' => array( 'test_endpoint' ),
|
||
|
* ),
|
||
|
* ) );
|
||
|
*
|
||
|
* $reports->register_endpoint( 'test_endpoint', array(
|
||
|
* 'label' => 'Test Endpoint',
|
||
|
* 'views' => array(
|
||
|
*
|
||
|
* // Possible to register a single endpoint for multiple view groups.
|
||
|
* 'tile' => array(
|
||
|
* 'data_callback' => '__return_true',
|
||
|
* 'display_args' => array(
|
||
|
* 'context' => 'secondary',
|
||
|
* 'comparison_label' => 'Filtered by ...',
|
||
|
* ),
|
||
|
* ),
|
||
|
* 'table' => array( ... ),
|
||
|
* ),
|
||
|
* ) );
|
||
|
* } catch ( \EDD_Exception $exception ) {
|
||
|
*
|
||
|
* edd_debug_log_exception( $exception );
|
||
|
*
|
||
|
* }
|
||
|
*
|
||
|
* } );
|
||
|
*
|
||
|
* Reports and endpoints can also be registered using standalone functions:
|
||
|
*
|
||
|
* add_action( 'edd_reports_init', function() {
|
||
|
*
|
||
|
* \EDD\Reports\add_report( 'test', array( ... ) );
|
||
|
*
|
||
|
* \EDD\Reports\register_endpoint( 'test_endpoint', array( ... ) );
|
||
|
*
|
||
|
* } );
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*
|
||
|
* @param Data\Report_Registry $reports Report registry instance,
|
||
|
* passed by reference.
|
||
|
*/
|
||
|
do_action_ref_array( 'edd_reports_init', array( &$reports ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Maybe add legacy reports if any exist
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*
|
||
|
* @param Data\Report_Registry $reports Reports registry instance.
|
||
|
* @return Data\Report_Registry Reports registry.
|
||
|
*/
|
||
|
private function legacy_reports( $reports ) {
|
||
|
|
||
|
// Bail if no legacy reports
|
||
|
if ( ! has_filter( 'edd_report_views' ) ) {
|
||
|
return $reports;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters legacy 'Reports' tab views.
|
||
|
*
|
||
|
* @since 1.4
|
||
|
* @deprecated 3.0 Use {@see 'edd_reports_get_reports'}
|
||
|
* @see 'edd_reports_get_reports'
|
||
|
*
|
||
|
* @param array $views 'Reports' tab views.
|
||
|
*/
|
||
|
$legacy_views = edd_apply_filters_deprecated( 'edd_report_views', array( array() ), '3.0', 'edd_reports_get_reports' );
|
||
|
|
||
|
// Bail if no legacy views
|
||
|
if ( empty( $legacy_views ) ) {
|
||
|
return $reports;
|
||
|
}
|
||
|
|
||
|
// Default legacy report priority to position them towards the bottom
|
||
|
$priority = 800;
|
||
|
|
||
|
// Loop through views and try to convert them
|
||
|
foreach ( $legacy_views as $report_id => $label ) {
|
||
|
|
||
|
// Legacy "_tab_" action
|
||
|
if ( has_action( "edd_reports_tab_{$report_id}" ) ) {
|
||
|
$hook = "edd_reports_tab_{$report_id}";
|
||
|
|
||
|
// Legacy "_view_" action
|
||
|
} elseif ( has_action( "edd_reports_view_{$report_id}" ) ) {
|
||
|
$hook = "edd_reports_view_{$report_id}";
|
||
|
|
||
|
// Skip
|
||
|
} else {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// Create a callback function
|
||
|
$callback = function() use ( $hook ) {
|
||
|
/**
|
||
|
* Legacy: Fires inside the content area of the currently active Reports tab.
|
||
|
*
|
||
|
* The dynamic portion of the hook name, `$report_id` refers to the slug of
|
||
|
* the current reports tab.
|
||
|
*
|
||
|
* @since 1.0
|
||
|
* @deprecated 3.0 Use the new Reports API to register new tabs.
|
||
|
* @see \EDD\Reports\add_report()
|
||
|
*
|
||
|
* @param \EDD\Reports\Data\Report|\WP_Error $report The current report object,
|
||
|
* or WP_Error if invalid.
|
||
|
*/
|
||
|
edd_do_action_deprecated( $hook, array(), '3.0', '\EDD\Reports\add_report' );
|
||
|
};
|
||
|
|
||
|
// Legacy label
|
||
|
$legacy_label = $label . '<span class="edd-legacy-label edd-chip">' . __( 'Legacy', 'easy-digital-downloads' ) . '</span>';
|
||
|
|
||
|
try {
|
||
|
// Add report
|
||
|
$reports->add_report( $report_id, array(
|
||
|
'label' => $legacy_label,
|
||
|
'group' => 'core',
|
||
|
'icon' => 'chart-area',
|
||
|
'priority' => $priority,
|
||
|
'display_callback' => $callback,
|
||
|
'filters' => array(
|
||
|
'dates',
|
||
|
'taxes',
|
||
|
),
|
||
|
) );
|
||
|
} catch ( \EDD_Exception $exception ) {
|
||
|
edd_debug_log_exception( $exception );
|
||
|
}
|
||
|
|
||
|
// Bump the priority
|
||
|
++$priority;
|
||
|
}
|
||
|
|
||
|
// Return reports array
|
||
|
return $reports;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Registers the core endpoint views.
|
||
|
*
|
||
|
* @since 3.0
|
||
|
*
|
||
|
* @param Data\Report_Registry $reports Reports registry instance.
|
||
|
*/
|
||
|
private function register_core_endpoint_views( $reports ) {
|
||
|
$views = Data\Endpoint_View_Registry::instance();
|
||
|
$core_views = $views->get_core_views();
|
||
|
|
||
|
try {
|
||
|
foreach ( $core_views as $view_id => $atts ) {
|
||
|
$views->register_endpoint_view( $view_id, $atts );
|
||
|
}
|
||
|
} catch ( \EDD_Exception $exception ) {
|
||
|
edd_debug_log_exception( $exception );
|
||
|
}
|
||
|
|
||
|
return $reports;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|