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