Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/woocomme.../includes
File: class-wc-tracker.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* WooCommerce Tracker
[2] Fix | Delete
*
[3] Fix | Delete
* The WooCommerce tracker class adds functionality to track WooCommerce usage based on if the customer opted in.
[4] Fix | Delete
* No personal information is tracked, only general WooCommerce settings, general product, order and user counts and admin email for discount code.
[5] Fix | Delete
*
[6] Fix | Delete
* @class WC_Tracker
[7] Fix | Delete
* @since 2.3.0
[8] Fix | Delete
* @package WooCommerce\Classes
[9] Fix | Delete
*/
[10] Fix | Delete
[11] Fix | Delete
use Automattic\Jetpack\Constants;
[12] Fix | Delete
use Automattic\WooCommerce\Internal\Admin\EmailImprovements\EmailImprovements;
[13] Fix | Delete
use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore;
[14] Fix | Delete
use Automattic\WooCommerce\Utilities\{ FeaturesUtil, OrderUtil, PluginUtil };
[15] Fix | Delete
use Automattic\WooCommerce\Internal\Utilities\BlocksUtil;
[16] Fix | Delete
use Automattic\WooCommerce\Proxies\LegacyProxy;
[17] Fix | Delete
use Automattic\WooCommerce\Blocks\Package;
[18] Fix | Delete
use Automattic\WooCommerce\Blocks\Domain\Services\CheckoutFields;
[19] Fix | Delete
[20] Fix | Delete
defined( 'ABSPATH' ) || exit;
[21] Fix | Delete
[22] Fix | Delete
// phpcs:disable Squiz.Classes.ClassFileName.NoMatch, Squiz.Classes.ValidClassName.NotCamelCaps -- Backwards compatibility.
[23] Fix | Delete
/**
[24] Fix | Delete
* WooCommerce Tracker Class
[25] Fix | Delete
*/
[26] Fix | Delete
class WC_Tracker {
[27] Fix | Delete
[28] Fix | Delete
// phpcs:enable
[29] Fix | Delete
/**
[30] Fix | Delete
* URL to the WooThemes Tracker API endpoint.
[31] Fix | Delete
*
[32] Fix | Delete
* @var string
[33] Fix | Delete
*/
[34] Fix | Delete
private static $api_url = 'https://tracking.woocommerce.com/v1/';
[35] Fix | Delete
[36] Fix | Delete
/**
[37] Fix | Delete
* Hook into cron event.
[38] Fix | Delete
*/
[39] Fix | Delete
public static function init() { // phpcs:ignore WooCommerce.Functions.InternalInjectionMethod.MissingFinal, WooCommerce.Functions.InternalInjectionMethod.MissingInternalTag -- Not an injection.
[40] Fix | Delete
add_action( 'woocommerce_tracker_send_event', array( __CLASS__, 'send_tracking_data' ) );
[41] Fix | Delete
}
[42] Fix | Delete
[43] Fix | Delete
/**
[44] Fix | Delete
* Decide whether to send tracking data or not.
[45] Fix | Delete
*
[46] Fix | Delete
* @param boolean $override Should override?.
[47] Fix | Delete
*/
[48] Fix | Delete
public static function send_tracking_data( $override = false ) {
[49] Fix | Delete
// Don't trigger this on AJAX Requests.
[50] Fix | Delete
if ( Constants::is_true( 'DOING_AJAX' ) ) {
[51] Fix | Delete
return;
[52] Fix | Delete
}
[53] Fix | Delete
[54] Fix | Delete
/**
[55] Fix | Delete
* Filter whether to send tracking data or not.
[56] Fix | Delete
*
[57] Fix | Delete
* @since 2.3.0
[58] Fix | Delete
*/
[59] Fix | Delete
if ( ! apply_filters( 'woocommerce_tracker_send_override', $override ) ) {
[60] Fix | Delete
// Send a maximum of once per week by default.
[61] Fix | Delete
$last_send = self::get_last_send_time();
[62] Fix | Delete
if ( $last_send && $last_send > apply_filters( 'woocommerce_tracker_last_send_interval', strtotime( '-1 week' ) ) ) { // phpcs:ignore
[63] Fix | Delete
return;
[64] Fix | Delete
}
[65] Fix | Delete
} else {
[66] Fix | Delete
// Make sure there is at least a 1 hour delay between override sends, we don't want duplicate calls due to double clicking links.
[67] Fix | Delete
$last_send = self::get_last_send_time();
[68] Fix | Delete
if ( $last_send && $last_send > strtotime( '-1 hours' ) ) {
[69] Fix | Delete
return;
[70] Fix | Delete
}
[71] Fix | Delete
}
[72] Fix | Delete
[73] Fix | Delete
// Update time first before sending to ensure it is set.
[74] Fix | Delete
update_option( 'woocommerce_tracker_last_send', time() );
[75] Fix | Delete
[76] Fix | Delete
$params = self::get_tracking_data();
[77] Fix | Delete
wp_safe_remote_post(
[78] Fix | Delete
self::$api_url,
[79] Fix | Delete
array(
[80] Fix | Delete
'method' => 'POST',
[81] Fix | Delete
'timeout' => 45,
[82] Fix | Delete
'redirection' => 5,
[83] Fix | Delete
'httpversion' => '1.0',
[84] Fix | Delete
'blocking' => false,
[85] Fix | Delete
'headers' => array( 'user-agent' => 'WooCommerceTracker/' . md5( esc_url_raw( home_url( '/' ) ) ) . ';' ),
[86] Fix | Delete
'body' => wp_json_encode( $params ),
[87] Fix | Delete
'cookies' => array(),
[88] Fix | Delete
)
[89] Fix | Delete
);
[90] Fix | Delete
}
[91] Fix | Delete
[92] Fix | Delete
/**
[93] Fix | Delete
* Get the last time tracking data was sent.
[94] Fix | Delete
*
[95] Fix | Delete
* @return int|bool
[96] Fix | Delete
*/
[97] Fix | Delete
private static function get_last_send_time() {
[98] Fix | Delete
/**
[99] Fix | Delete
* Filter the last time tracking data was sent.
[100] Fix | Delete
*
[101] Fix | Delete
* @since 2.3.0
[102] Fix | Delete
*/
[103] Fix | Delete
return apply_filters( 'woocommerce_tracker_last_send_time', get_option( 'woocommerce_tracker_last_send', false ) );
[104] Fix | Delete
}
[105] Fix | Delete
[106] Fix | Delete
/**
[107] Fix | Delete
* Test whether this site is a staging site according to the Jetpack criteria.
[108] Fix | Delete
*
[109] Fix | Delete
* With Jetpack 8.1+, Jetpack::is_staging_site has been deprecated.
[110] Fix | Delete
* \Automattic\Jetpack\Status::is_staging_site is the replacement.
[111] Fix | Delete
* However, there are version of JP where \Automattic\Jetpack\Status exists, but does *not* contain is_staging_site method,
[112] Fix | Delete
* so with those, code still needs to use the previous check as a fallback.
[113] Fix | Delete
*
[114] Fix | Delete
* After upgrading Jetpack Status to v3.3.2 is_staging_site is also deprecated and in_safe_mode is the new replacement.
[115] Fix | Delete
* So we check this first of all.
[116] Fix | Delete
*
[117] Fix | Delete
* @return bool
[118] Fix | Delete
*/
[119] Fix | Delete
private static function is_jetpack_staging_site() {
[120] Fix | Delete
if ( class_exists( '\Automattic\Jetpack\Status' ) ) {
[121] Fix | Delete
[122] Fix | Delete
$jp_status = new \Automattic\Jetpack\Status();
[123] Fix | Delete
[124] Fix | Delete
if ( is_callable( array( $jp_status, 'in_safe_mode' ) ) ) {
[125] Fix | Delete
return $jp_status->in_safe_mode();
[126] Fix | Delete
} elseif ( is_callable( array( $jp_status, 'is_staging_site' ) ) ) {
[127] Fix | Delete
// Preferred way of checking with Jetpack 8.1+.
[128] Fix | Delete
return $jp_status->is_staging_site();
[129] Fix | Delete
}
[130] Fix | Delete
}
[131] Fix | Delete
[132] Fix | Delete
return ( class_exists( 'Jetpack' ) && is_callable( 'Jetpack::is_staging_site' ) && Jetpack::is_staging_site() );
[133] Fix | Delete
}
[134] Fix | Delete
[135] Fix | Delete
/**
[136] Fix | Delete
* Get all the tracking data.
[137] Fix | Delete
*
[138] Fix | Delete
* @return array
[139] Fix | Delete
*/
[140] Fix | Delete
public static function get_tracking_data() {
[141] Fix | Delete
$data = array();
[142] Fix | Delete
$start_time = microtime( true );
[143] Fix | Delete
[144] Fix | Delete
// General site info.
[145] Fix | Delete
$data['url'] = home_url();
[146] Fix | Delete
$data['store_id'] = get_option( \WC_Install::STORE_ID_OPTION, null );
[147] Fix | Delete
$data['blog_id'] = class_exists( 'Jetpack_Options' ) ? Jetpack_Options::get_option( 'id' ) : null;
[148] Fix | Delete
[149] Fix | Delete
/**
[150] Fix | Delete
* Filter the admin email that's sent with data.
[151] Fix | Delete
*
[152] Fix | Delete
* @since 2.3.0
[153] Fix | Delete
*/
[154] Fix | Delete
$data['email'] = apply_filters( 'woocommerce_tracker_admin_email', get_option( 'admin_email' ) );
[155] Fix | Delete
$data['theme'] = self::get_theme_info();
[156] Fix | Delete
[157] Fix | Delete
// WordPress Info.
[158] Fix | Delete
$data['wp'] = self::get_wordpress_info();
[159] Fix | Delete
[160] Fix | Delete
// Server Info.
[161] Fix | Delete
$data['server'] = self::get_server_info();
[162] Fix | Delete
[163] Fix | Delete
// Plugin info.
[164] Fix | Delete
$all_plugins = self::get_all_plugins();
[165] Fix | Delete
$data['active_plugins'] = $all_plugins['active_plugins'];
[166] Fix | Delete
$data['inactive_plugins'] = $all_plugins['inactive_plugins'];
[167] Fix | Delete
[168] Fix | Delete
// Jetpack & WooCommerce Connect.
[169] Fix | Delete
$data['jetpack_version'] = Constants::is_defined( 'JETPACK__VERSION' ) ? Constants::get_constant( 'JETPACK__VERSION' ) : 'none';
[170] Fix | Delete
$data['jetpack_connected'] = ( class_exists( 'Jetpack' ) && is_callable( 'Jetpack::is_active' ) && Jetpack::is_active() ) ? 'yes' : 'no';
[171] Fix | Delete
$data['jetpack_is_staging'] = self::is_jetpack_staging_site() ? 'yes' : 'no';
[172] Fix | Delete
$data['connect_installed'] = class_exists( 'WC_Connect_Loader' ) ? 'yes' : 'no';
[173] Fix | Delete
$data['connect_active'] = ( class_exists( 'WC_Connect_Loader' ) && wp_next_scheduled( 'wc_connect_fetch_service_schemas' ) ) ? 'yes' : 'no';
[174] Fix | Delete
$data['helper_connected'] = self::get_helper_connected();
[175] Fix | Delete
[176] Fix | Delete
// Store count info.
[177] Fix | Delete
$data['users'] = self::get_user_counts();
[178] Fix | Delete
$data['products'] = self::get_product_counts();
[179] Fix | Delete
$data['orders'] = self::get_orders();
[180] Fix | Delete
$data['reviews'] = self::get_review_counts();
[181] Fix | Delete
$data['categories'] = self::get_category_counts();
[182] Fix | Delete
$data['brands'] = self::get_brands_counts();
[183] Fix | Delete
[184] Fix | Delete
// Get order snapshot.
[185] Fix | Delete
$data['order_snapshot'] = self::get_order_snapshot();
[186] Fix | Delete
[187] Fix | Delete
// Payment gateway info.
[188] Fix | Delete
$data['gateways'] = self::get_active_payment_gateways();
[189] Fix | Delete
[190] Fix | Delete
// WcPay settings info.
[191] Fix | Delete
$data['wcpay_settings'] = self::get_wcpay_settings();
[192] Fix | Delete
[193] Fix | Delete
// Shipping method info.
[194] Fix | Delete
$data['shipping_methods'] = self::get_active_shipping_methods();
[195] Fix | Delete
[196] Fix | Delete
// Features.
[197] Fix | Delete
$data['enabled_features'] = self::get_enabled_features();
[198] Fix | Delete
[199] Fix | Delete
// Get all WooCommerce options info.
[200] Fix | Delete
$data['settings'] = self::get_all_woocommerce_options_values();
[201] Fix | Delete
[202] Fix | Delete
// Template overrides.
[203] Fix | Delete
$template_overrides = self::get_all_template_overrides();
[204] Fix | Delete
$data['template_overrides'] = $template_overrides;
[205] Fix | Delete
[206] Fix | Delete
// Cart & checkout tech (blocks or shortcodes).
[207] Fix | Delete
$data['cart_checkout'] = self::get_cart_checkout_info();
[208] Fix | Delete
[209] Fix | Delete
// Mini Cart block, which only exists since wp 5.9.
[210] Fix | Delete
if ( version_compare( get_bloginfo( 'version' ), '5.9', '>=' ) ) {
[211] Fix | Delete
$data['mini_cart_block'] = self::get_mini_cart_info();
[212] Fix | Delete
}
[213] Fix | Delete
[214] Fix | Delete
/**
[215] Fix | Delete
* Filter whether to disable admin tracking.
[216] Fix | Delete
*
[217] Fix | Delete
* @since 5.2.0
[218] Fix | Delete
*/
[219] Fix | Delete
$data['wc_admin_disabled'] = apply_filters( 'woocommerce_admin_disabled', false ) ? 'yes' : 'no';
[220] Fix | Delete
[221] Fix | Delete
// Mobile info.
[222] Fix | Delete
$data['wc_mobile_usage'] = self::get_woocommerce_mobile_usage();
[223] Fix | Delete
[224] Fix | Delete
// WC Tracker data.
[225] Fix | Delete
$data['woocommerce_allow_tracking'] = get_option( 'woocommerce_allow_tracking', 'no' );
[226] Fix | Delete
$data['woocommerce_allow_tracking_last_modified'] = get_option( 'woocommerce_allow_tracking_last_modified', 'unknown' );
[227] Fix | Delete
$data['woocommerce_allow_tracking_first_optin'] = get_option( 'woocommerce_allow_tracking_first_optin', 'unknown' );
[228] Fix | Delete
[229] Fix | Delete
// Email improvements tracking data.
[230] Fix | Delete
$data['email_improvements'] = self::get_email_improvements_info( $template_overrides );
[231] Fix | Delete
[232] Fix | Delete
// Store email usage.
[233] Fix | Delete
$data['store_emails'] = self::get_store_emails();
[234] Fix | Delete
[235] Fix | Delete
/**
[236] Fix | Delete
* Filter the data that's sent with the tracker.
[237] Fix | Delete
*
[238] Fix | Delete
* @since 2.3.0
[239] Fix | Delete
*/
[240] Fix | Delete
$data = apply_filters( 'woocommerce_tracker_data', $data );
[241] Fix | Delete
[242] Fix | Delete
// Total seconds taken to generate snapshot (including filtered data).
[243] Fix | Delete
$data['snapshot_generation_time'] = microtime( true ) - $start_time;
[244] Fix | Delete
[245] Fix | Delete
return $data;
[246] Fix | Delete
}
[247] Fix | Delete
[248] Fix | Delete
/**
[249] Fix | Delete
* Get the current theme info, theme name and version.
[250] Fix | Delete
*
[251] Fix | Delete
* @return array
[252] Fix | Delete
*/
[253] Fix | Delete
public static function get_theme_info() {
[254] Fix | Delete
$theme_data = wp_get_theme();
[255] Fix | Delete
$theme_child_theme = wc_bool_to_string( is_child_theme() );
[256] Fix | Delete
$theme_wc_support = wc_bool_to_string( current_theme_supports( 'woocommerce' ) );
[257] Fix | Delete
$theme_is_block_theme = wc_bool_to_string( wp_is_block_theme() );
[258] Fix | Delete
[259] Fix | Delete
return array(
[260] Fix | Delete
'name' => $theme_data->Name, // @phpcs:ignore
[261] Fix | Delete
'version' => $theme_data->Version, // @phpcs:ignore
[262] Fix | Delete
'child_theme' => $theme_child_theme,
[263] Fix | Delete
'wc_support' => $theme_wc_support,
[264] Fix | Delete
'block_theme' => $theme_is_block_theme,
[265] Fix | Delete
);
[266] Fix | Delete
}
[267] Fix | Delete
[268] Fix | Delete
/**
[269] Fix | Delete
* Get WordPress related data.
[270] Fix | Delete
*
[271] Fix | Delete
* @return array
[272] Fix | Delete
*/
[273] Fix | Delete
private static function get_wordpress_info() {
[274] Fix | Delete
$wp_data = array();
[275] Fix | Delete
[276] Fix | Delete
$memory = wc_let_to_num( WP_MEMORY_LIMIT );
[277] Fix | Delete
[278] Fix | Delete
if ( function_exists( 'memory_get_usage' ) ) {
[279] Fix | Delete
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- False positive.
[280] Fix | Delete
$system_memory = wc_let_to_num( @ini_get( 'memory_limit' ) );
[281] Fix | Delete
$memory = max( $memory, $system_memory );
[282] Fix | Delete
}
[283] Fix | Delete
[284] Fix | Delete
// WordPress 5.5+ environment type specification.
[285] Fix | Delete
// 'production' is the default in WP, thus using it as a default here, too.
[286] Fix | Delete
$environment_type = 'production';
[287] Fix | Delete
if ( function_exists( 'wp_get_environment_type' ) ) {
[288] Fix | Delete
$environment_type = wp_get_environment_type();
[289] Fix | Delete
}
[290] Fix | Delete
[291] Fix | Delete
$wp_data['memory_limit'] = size_format( $memory );
[292] Fix | Delete
$wp_data['debug_mode'] = ( defined( 'WP_DEBUG' ) && WP_DEBUG ) ? 'Yes' : 'No';
[293] Fix | Delete
$wp_data['locale'] = get_locale();
[294] Fix | Delete
$wp_data['version'] = get_bloginfo( 'version' );
[295] Fix | Delete
$wp_data['multisite'] = is_multisite() ? 'Yes' : 'No';
[296] Fix | Delete
$wp_data['env_type'] = $environment_type;
[297] Fix | Delete
$wp_data['dropins'] = array_keys( get_dropins() );
[298] Fix | Delete
[299] Fix | Delete
return $wp_data;
[300] Fix | Delete
}
[301] Fix | Delete
[302] Fix | Delete
/**
[303] Fix | Delete
* Get server related info.
[304] Fix | Delete
*
[305] Fix | Delete
* @return array
[306] Fix | Delete
*/
[307] Fix | Delete
private static function get_server_info() {
[308] Fix | Delete
$server_data = array();
[309] Fix | Delete
[310] Fix | Delete
if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
[311] Fix | Delete
$server_data['software'] = $_SERVER['SERVER_SOFTWARE']; // @phpcs:ignore
[312] Fix | Delete
}
[313] Fix | Delete
[314] Fix | Delete
if ( function_exists( 'phpversion' ) ) {
[315] Fix | Delete
$server_data['php_version'] = phpversion();
[316] Fix | Delete
}
[317] Fix | Delete
[318] Fix | Delete
if ( function_exists( 'ini_get' ) ) {
[319] Fix | Delete
$server_data['php_post_max_size'] = size_format( wc_let_to_num( ini_get( 'post_max_size' ) ) );
[320] Fix | Delete
$server_data['php_time_limt'] = ini_get( 'max_execution_time' );
[321] Fix | Delete
$server_data['php_max_input_vars'] = ini_get( 'max_input_vars' );
[322] Fix | Delete
$server_data['php_suhosin'] = extension_loaded( 'suhosin' ) ? 'Yes' : 'No';
[323] Fix | Delete
}
[324] Fix | Delete
[325] Fix | Delete
$database_version = wc_get_server_database_version();
[326] Fix | Delete
$server_data['mysql_version'] = $database_version['number'];
[327] Fix | Delete
[328] Fix | Delete
$server_data['php_max_upload_size'] = size_format( wp_max_upload_size() );
[329] Fix | Delete
$server_data['php_default_timezone'] = date_default_timezone_get();
[330] Fix | Delete
$server_data['php_soap'] = class_exists( 'SoapClient' ) ? 'Yes' : 'No';
[331] Fix | Delete
$server_data['php_fsockopen'] = function_exists( 'fsockopen' ) ? 'Yes' : 'No';
[332] Fix | Delete
$server_data['php_curl'] = function_exists( 'curl_init' ) ? 'Yes' : 'No';
[333] Fix | Delete
[334] Fix | Delete
return $server_data;
[335] Fix | Delete
}
[336] Fix | Delete
[337] Fix | Delete
/**
[338] Fix | Delete
* Get all plugins grouped into activated or not.
[339] Fix | Delete
*
[340] Fix | Delete
* @return array
[341] Fix | Delete
*/
[342] Fix | Delete
public static function get_all_plugins() {
[343] Fix | Delete
// Ensure get_plugins function is loaded.
[344] Fix | Delete
if ( ! function_exists( 'get_plugins' ) ) {
[345] Fix | Delete
include ABSPATH . '/wp-admin/includes/plugin.php';
[346] Fix | Delete
}
[347] Fix | Delete
[348] Fix | Delete
$plugins = wc_get_container()->get( LegacyProxy::class )->call_function( 'get_plugins' );
[349] Fix | Delete
$active_plugins_keys = get_option( 'active_plugins', array() );
[350] Fix | Delete
$active_plugins = array();
[351] Fix | Delete
[352] Fix | Delete
foreach ( $plugins as $k => $v ) {
[353] Fix | Delete
// Take care of formatting the data how we want it.
[354] Fix | Delete
$formatted = array();
[355] Fix | Delete
$formatted['name'] = wp_strip_all_tags( $v['Name'] );
[356] Fix | Delete
if ( isset( $v['Version'] ) ) {
[357] Fix | Delete
$formatted['version'] = wp_strip_all_tags( $v['Version'] );
[358] Fix | Delete
}
[359] Fix | Delete
if ( isset( $v['Author'] ) ) {
[360] Fix | Delete
$formatted['author'] = wp_strip_all_tags( $v['Author'] );
[361] Fix | Delete
}
[362] Fix | Delete
if ( isset( $v['Network'] ) ) {
[363] Fix | Delete
$formatted['network'] = wp_strip_all_tags( $v['Network'] );
[364] Fix | Delete
}
[365] Fix | Delete
if ( isset( $v['PluginURI'] ) ) {
[366] Fix | Delete
$formatted['plugin_uri'] = wp_strip_all_tags( $v['PluginURI'] );
[367] Fix | Delete
}
[368] Fix | Delete
$formatted['feature_compatibility'] = array();
[369] Fix | Delete
if ( wc_get_container()->get( PluginUtil::class )->is_woocommerce_aware_plugin( $k ) ) {
[370] Fix | Delete
$formatted['feature_compatibility'] = array_filter( FeaturesUtil::get_compatible_features_for_plugin( $k ) );
[371] Fix | Delete
}
[372] Fix | Delete
if ( in_array( $k, $active_plugins_keys, true ) ) {
[373] Fix | Delete
// Remove active plugins from list so we can show active and inactive separately.
[374] Fix | Delete
unset( $plugins[ $k ] );
[375] Fix | Delete
$active_plugins[ $k ] = $formatted;
[376] Fix | Delete
} else {
[377] Fix | Delete
$plugins[ $k ] = $formatted;
[378] Fix | Delete
}
[379] Fix | Delete
}
[380] Fix | Delete
[381] Fix | Delete
return array(
[382] Fix | Delete
'active_plugins' => $active_plugins,
[383] Fix | Delete
'inactive_plugins' => $plugins,
[384] Fix | Delete
);
[385] Fix | Delete
}
[386] Fix | Delete
[387] Fix | Delete
/**
[388] Fix | Delete
* Get the settings of WooCommerce Payments plugin
[389] Fix | Delete
*
[390] Fix | Delete
* @return array
[391] Fix | Delete
*/
[392] Fix | Delete
private static function get_wcpay_settings() {
[393] Fix | Delete
return get_option( 'woocommerce_woocommerce_payments_settings' );
[394] Fix | Delete
}
[395] Fix | Delete
[396] Fix | Delete
/**
[397] Fix | Delete
* Check to see if the helper is connected to WooCommerce.com
[398] Fix | Delete
*
[399] Fix | Delete
* @return string
[400] Fix | Delete
*/
[401] Fix | Delete
private static function get_helper_connected() {
[402] Fix | Delete
if ( class_exists( 'WC_Helper_Options' ) && is_callable( 'WC_Helper_Options::get' ) ) {
[403] Fix | Delete
$authenticated = WC_Helper_Options::get( 'auth' );
[404] Fix | Delete
} else {
[405] Fix | Delete
$authenticated = '';
[406] Fix | Delete
}
[407] Fix | Delete
return ( ! empty( $authenticated ) ) ? 'yes' : 'no';
[408] Fix | Delete
}
[409] Fix | Delete
[410] Fix | Delete
[411] Fix | Delete
/**
[412] Fix | Delete
* Get user totals based on user role.
[413] Fix | Delete
*
[414] Fix | Delete
* @return array
[415] Fix | Delete
*/
[416] Fix | Delete
private static function get_user_counts() {
[417] Fix | Delete
$user_count = array();
[418] Fix | Delete
$user_count_data = count_users();
[419] Fix | Delete
$user_count['total'] = $user_count_data['total_users'];
[420] Fix | Delete
[421] Fix | Delete
// Get user count based on user role.
[422] Fix | Delete
foreach ( $user_count_data['avail_roles'] as $role => $count ) {
[423] Fix | Delete
$user_count[ $role ] = $count;
[424] Fix | Delete
}
[425] Fix | Delete
[426] Fix | Delete
return $user_count;
[427] Fix | Delete
}
[428] Fix | Delete
[429] Fix | Delete
/**
[430] Fix | Delete
* Get product totals based on product type.
[431] Fix | Delete
*
[432] Fix | Delete
* @return array
[433] Fix | Delete
*/
[434] Fix | Delete
public static function get_product_counts() {
[435] Fix | Delete
$product_count = array();
[436] Fix | Delete
$product_count_data = wp_count_posts( 'product' );
[437] Fix | Delete
$product_count['total'] = $product_count_data->publish;
[438] Fix | Delete
[439] Fix | Delete
$product_statuses = get_terms( 'product_type', array( 'hide_empty' => 0 ) );
[440] Fix | Delete
foreach ( $product_statuses as $product_status ) {
[441] Fix | Delete
$product_count[ $product_status->name ] = $product_status->count;
[442] Fix | Delete
}
[443] Fix | Delete
[444] Fix | Delete
return $product_count;
[445] Fix | Delete
}
[446] Fix | Delete
[447] Fix | Delete
/**
[448] Fix | Delete
* Get order counts.
[449] Fix | Delete
*
[450] Fix | Delete
* @return array
[451] Fix | Delete
*/
[452] Fix | Delete
private static function get_order_counts() {
[453] Fix | Delete
$order_count = array();
[454] Fix | Delete
foreach ( wc_get_order_statuses() as $status_slug => $status_name ) {
[455] Fix | Delete
$order_count[ $status_slug ] = wc_orders_count( $status_slug );
[456] Fix | Delete
}
[457] Fix | Delete
return $order_count;
[458] Fix | Delete
}
[459] Fix | Delete
[460] Fix | Delete
/**
[461] Fix | Delete
* Combine all order data.
[462] Fix | Delete
*
[463] Fix | Delete
* @return array
[464] Fix | Delete
*/
[465] Fix | Delete
private static function get_orders() {
[466] Fix | Delete
$order_dates = self::get_order_dates();
[467] Fix | Delete
$order_counts = self::get_order_counts();
[468] Fix | Delete
$order_totals = self::get_order_totals();
[469] Fix | Delete
$order_gateways = self::get_orders_by_gateway();
[470] Fix | Delete
$order_origin = self::get_orders_origins();
[471] Fix | Delete
[472] Fix | Delete
return array_merge( $order_dates, $order_counts, $order_totals, $order_gateways, $order_origin );
[473] Fix | Delete
}
[474] Fix | Delete
[475] Fix | Delete
/**
[476] Fix | Delete
* Get order totals.
[477] Fix | Delete
*
[478] Fix | Delete
* Keeping the internal statuses names as strings to avoid regression issues (not referencing Automattic\WooCommerce\Enums\OrderInternalStatus class).
[479] Fix | Delete
*
[480] Fix | Delete
* @since 5.4.0
[481] Fix | Delete
* @return array
[482] Fix | Delete
*/
[483] Fix | Delete
private static function get_order_totals() {
[484] Fix | Delete
global $wpdb;
[485] Fix | Delete
[486] Fix | Delete
$orders_table = OrdersTableDataStore::get_orders_table_name();
[487] Fix | Delete
[488] Fix | Delete
if ( OrderUtil::custom_orders_table_usage_is_enabled() ) {
[489] Fix | Delete
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
[490] Fix | Delete
$gross_total = $wpdb->get_var(
[491] Fix | Delete
"
[492] Fix | Delete
SELECT SUM(total_amount) AS 'gross_total'
[493] Fix | Delete
FROM $orders_table
[494] Fix | Delete
WHERE status in ('wc-completed', 'wc-refunded');
[495] Fix | Delete
"
[496] Fix | Delete
);
[497] Fix | Delete
// phpcs:enable
[498] Fix | Delete
} else {
[499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function