2017-07-10 23:51:27 +00:00
< ? php
/**
2017-07-14 15:49:16 +00:00
* WooCommerce setup
2017-07-10 23:51:27 +00:00
*
2018-03-21 03:22:29 +00:00
* @ package WooCommerce
* @ since 3.2 . 0
2017-07-10 23:51:27 +00:00
*/
2018-01-25 17:27:50 +00:00
defined ( 'ABSPATH' ) || exit ;
2017-07-13 18:46:34 +00:00
2021-01-14 10:40:11 +00:00
use Automattic\WooCommerce\Internal\DownloadPermissionsAdjuster ;
2020-07-16 10:01:50 +00:00
use Automattic\WooCommerce\Proxies\LegacyProxy ;
2017-07-10 23:51:27 +00:00
/**
* Main WooCommerce Class .
*
* @ class WooCommerce
*/
final class WooCommerce {
/**
* WooCommerce version .
*
* @ var string
*/
2021-03-09 14:11:41 +00:00
public $version = '5.2.0' ;
2017-07-10 23:51:27 +00:00
2020-06-04 17:08:13 +00:00
/**
* WooCommerce Schema version .
*
* @ since 4.3 started with version string 430.
*
* @ var string
*/
2020-07-13 13:34:54 +00:00
public $db_version = '430' ;
2020-06-04 17:08:13 +00:00
2017-07-10 23:51:27 +00:00
/**
* The single instance of the class .
*
* @ var WooCommerce
* @ since 2.1
*/
protected static $_instance = null ;
/**
* Session instance .
*
* @ var WC_Session | WC_Session_Handler
*/
public $session = null ;
/**
* Query instance .
*
* @ var WC_Query
*/
public $query = null ;
/**
* Product factory instance .
*
* @ var WC_Product_Factory
*/
public $product_factory = null ;
/**
* Countries instance .
*
* @ var WC_Countries
*/
public $countries = null ;
/**
* Integrations instance .
*
* @ var WC_Integrations
*/
public $integrations = null ;
/**
* Cart instance .
*
* @ var WC_Cart
*/
public $cart = null ;
/**
* Customer instance .
*
* @ var WC_Customer
*/
public $customer = null ;
/**
* Order factory instance .
*
* @ var WC_Order_Factory
*/
public $order_factory = null ;
/**
* Structured data instance .
*
* @ var WC_Structured_Data
*/
public $structured_data = null ;
/**
* Array of deprecated hook handlers .
*
* @ var array of WC_Deprecated_Hooks
*/
public $deprecated_hook_handlers = array ();
/**
* Main WooCommerce Instance .
*
* Ensures only one instance of WooCommerce is loaded or can be loaded .
*
* @ since 2.1
* @ static
* @ see WC ()
* @ return WooCommerce - Main instance .
*/
public static function instance () {
2020-06-11 07:53:26 +00:00
if ( is_null ( self :: $_instance ) ) {
self :: $_instance = new self ();
}
return self :: $_instance ;
2017-07-10 23:51:27 +00:00
}
/**
* Cloning is forbidden .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ since 2.1
*/
public function __clone () {
2018-02-07 22:01:12 +00:00
wc_doing_it_wrong ( __FUNCTION__ , __ ( 'Cloning is forbidden.' , 'woocommerce' ), '2.1' );
2017-07-10 23:51:27 +00:00
}
/**
* Unserializing instances of this class is forbidden .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ since 2.1
*/
public function __wakeup () {
2018-02-07 22:01:12 +00:00
wc_doing_it_wrong ( __FUNCTION__ , __ ( 'Unserializing instances of this class is forbidden.' , 'woocommerce' ), '2.1' );
2017-07-10 23:51:27 +00:00
}
/**
* Auto - load in - accessible properties on demand .
2017-07-13 18:57:46 +00:00
*
* @ param mixed $key Key name .
2017-07-10 23:51:27 +00:00
* @ return mixed
*/
public function __get ( $key ) {
2017-07-13 18:57:46 +00:00
if ( in_array ( $key , array ( 'payment_gateways' , 'shipping' , 'mailer' , 'checkout' ), true ) ) {
2017-07-10 23:51:27 +00:00
return $this -> $key ();
}
}
/**
* WooCommerce Constructor .
*/
2020-06-11 07:53:26 +00:00
public function __construct () {
2017-07-10 23:51:27 +00:00
$this -> define_constants ();
2019-04-26 13:03:23 +00:00
$this -> define_tables ();
2017-07-10 23:51:27 +00:00
$this -> includes ();
$this -> init_hooks ();
2019-01-23 16:20:26 +00:00
}
2017-07-10 23:51:27 +00:00
2019-01-23 16:20:26 +00:00
/**
* When WP has loaded all plugins , trigger the `woocommerce_loaded` hook .
*
* This ensures `woocommerce_loaded` is called only after all other plugins
* are loaded , to avoid issues caused by plugin directory naming changing
* the load order . See #21524 for details.
*
* @ since 3.6 . 0
*/
public function on_plugins_loaded () {
2017-07-10 23:51:27 +00:00
do_action ( 'woocommerce_loaded' );
}
/**
* Hook into actions and filters .
2017-07-13 18:57:46 +00:00
*
* @ since 2.3
2017-07-10 23:51:27 +00:00
*/
private function init_hooks () {
2017-07-10 23:53:54 +00:00
register_activation_hook ( WC_PLUGIN_FILE , array ( 'WC_Install' , 'install' ) );
2017-07-10 23:51:27 +00:00
register_shutdown_function ( array ( $this , 'log_errors' ) );
2019-01-23 16:20:26 +00:00
add_action ( 'plugins_loaded' , array ( $this , 'on_plugins_loaded' ), - 1 );
2019-07-03 09:46:28 +00:00
add_action ( 'admin_notices' , array ( $this , 'build_dependencies_notice' ) );
2017-07-10 23:51:27 +00:00
add_action ( 'after_setup_theme' , array ( $this , 'setup_environment' ) );
add_action ( 'after_setup_theme' , array ( $this , 'include_template_functions' ), 11 );
add_action ( 'init' , array ( $this , 'init' ), 0 );
add_action ( 'init' , array ( 'WC_Shortcodes' , 'init' ) );
add_action ( 'init' , array ( 'WC_Emails' , 'init_transactional_emails' ) );
2018-01-23 10:56:37 +00:00
add_action ( 'init' , array ( $this , 'add_image_sizes' ) );
2020-07-27 10:24:46 +00:00
add_action ( 'init' , array ( $this , 'load_rest_api' ) );
2017-07-10 23:51:27 +00:00
add_action ( 'switch_blog' , array ( $this , 'wpdb_table_fix' ), 0 );
2019-03-08 12:50:06 +00:00
add_action ( 'activated_plugin' , array ( $this , 'activated_plugin' ) );
add_action ( 'deactivated_plugin' , array ( $this , 'deactivated_plugin' ) );
2021-01-20 15:06:23 +00:00
add_filter ( 'woocommerce_rest_prepare_note' , array ( 'WC_Admin_Notices' , 'prepare_note_with_nonce' ) );
2021-01-14 10:40:11 +00:00
// These classes set up hooks on instantiation.
wc_get_container () -> get ( DownloadPermissionsAdjuster :: class );
2017-07-10 23:51:27 +00:00
}
/**
* Ensures fatal errors are logged so they can be picked up in the status report .
*
* @ since 3.2 . 0
*/
public function log_errors () {
$error = error_get_last ();
2019-08-20 02:11:43 +00:00
if ( $error && in_array ( $error [ 'type' ], array ( E_ERROR , E_PARSE , E_COMPILE_ERROR , E_USER_ERROR , E_RECOVERABLE_ERROR ), true ) ) {
2017-07-10 23:51:27 +00:00
$logger = wc_get_logger ();
$logger -> critical (
2018-07-13 04:23:17 +00:00
/* translators: 1: error message 2: file name and path 3: line number */
sprintf ( __ ( '%1$s in %2$s on line %3$s' , 'woocommerce' ), $error [ 'message' ], $error [ 'file' ], $error [ 'line' ] ) . PHP_EOL ,
2017-07-13 18:57:46 +00:00
array (
'source' => 'fatal-errors' ,
)
2017-07-10 23:51:27 +00:00
);
2018-07-13 05:04:19 +00:00
do_action ( 'woocommerce_shutdown_error' , $error );
2017-07-10 23:51:27 +00:00
}
}
/**
* Define WC Constants .
*/
private function define_constants () {
2017-10-02 06:37:07 +00:00
$upload_dir = wp_upload_dir ( null , false );
2017-07-10 23:51:27 +00:00
2017-07-14 15:49:16 +00:00
$this -> define ( 'WC_ABSPATH' , dirname ( WC_PLUGIN_FILE ) . '/' );
$this -> define ( 'WC_PLUGIN_BASENAME' , plugin_basename ( WC_PLUGIN_FILE ) );
2017-07-10 23:51:27 +00:00
$this -> define ( 'WC_VERSION' , $this -> version );
$this -> define ( 'WOOCOMMERCE_VERSION' , $this -> version );
2018-01-30 15:00:53 +00:00
$this -> define ( 'WC_ROUNDING_PRECISION' , 6 );
2017-07-10 23:51:27 +00:00
$this -> define ( 'WC_DISCOUNT_ROUNDING_MODE' , 2 );
$this -> define ( 'WC_TAX_ROUNDING_MODE' , 'yes' === get_option ( 'woocommerce_prices_include_tax' , 'no' ) ? 2 : 1 );
$this -> define ( 'WC_DELIMITER' , '|' );
$this -> define ( 'WC_LOG_DIR' , $upload_dir [ 'basedir' ] . '/wc-logs/' );
$this -> define ( 'WC_SESSION_CACHE_GROUP' , 'wc_session_id' );
$this -> define ( 'WC_TEMPLATE_DEBUG_MODE' , false );
2020-06-15 16:21:03 +00:00
$this -> define ( 'WC_NOTICE_MIN_PHP_VERSION' , '7.2' );
2020-04-07 09:25:29 +00:00
$this -> define ( 'WC_NOTICE_MIN_WP_VERSION' , '5.2' );
2019-10-15 10:33:58 +00:00
$this -> define ( 'WC_PHP_MIN_REQUIREMENTS_NOTICE' , 'wp_php_min_requirements_' . WC_NOTICE_MIN_PHP_VERSION . '_' . WC_NOTICE_MIN_WP_VERSION );
2021-02-24 13:29:45 +00:00
/** Define if we ' re checking against major , minor or no versions in the following places :
* - plugin screen in WP Admin ( displaying extra warning when updating to new major versions )
* - System Status Report ( 'Installed version not tested with active version of WooCommerce' warning )
* - core update screen in WP Admin ( displaying extra warning when updating to new major versions )
* - enable / disable automated updates in the plugin screen in WP Admin ( if there are any plugins
* that don ' t declare compatibility , the auto - update is disabled )
*
* We dropped SemVer before WC 5.0 , so all versions are backwards compatible now , thus no more check needed .
* The SSR in the name is preserved for bw compatibility , as this was initially used in System Status Report .
*/
$this -> define ( 'WC_SSR_PLUGIN_UPDATE_RELEASE_VERSION_TYPE' , 'none' );
2017-07-10 23:51:27 +00:00
}
2019-04-26 13:03:23 +00:00
/**
* Register custom tables within $wpdb object .
*/
private function define_tables () {
global $wpdb ;
// List of tables without prefixes.
$tables = array (
'payment_tokenmeta' => 'woocommerce_payment_tokenmeta' ,
'order_itemmeta' => 'woocommerce_order_itemmeta' ,
'wc_product_meta_lookup' => 'wc_product_meta_lookup' ,
2019-07-08 21:12:23 +00:00
'wc_tax_rate_classes' => 'wc_tax_rate_classes' ,
2020-05-06 16:14:53 +00:00
'wc_reserved_stock' => 'wc_reserved_stock' ,
2019-04-26 13:03:23 +00:00
);
foreach ( $tables as $name => $table ) {
$wpdb -> $name = $wpdb -> prefix . $table ;
$wpdb -> tables [] = $table ;
}
}
2017-07-10 23:51:27 +00:00
/**
* Define constant if not already set .
*
2017-07-13 18:57:46 +00:00
* @ param string $name Constant name .
* @ param string | bool $value Constant value .
2017-07-10 23:51:27 +00:00
*/
private function define ( $name , $value ) {
if ( ! defined ( $name ) ) {
define ( $name , $value );
}
}
2018-08-17 17:13:44 +00:00
/**
2019-01-24 11:06:47 +00:00
* Returns true if the request is a non - legacy REST API request .
*
2019-01-25 09:07:32 +00:00
* Legacy REST requests should still run some extra code for backwards compatibility .
2018-08-17 17:13:44 +00:00
*
2019-01-28 12:13:12 +00:00
* @ todo : replace this function once core WP function is available : https :// core . trac . wordpress . org / ticket / 42061.
*
2018-08-17 17:13:44 +00:00
* @ return bool
*/
2019-02-18 17:54:56 +00:00
public function is_rest_api_request () {
if ( empty ( $_SERVER [ 'REQUEST_URI' ] ) ) {
2019-02-18 21:52:39 +00:00
return false ;
2018-08-17 17:13:44 +00:00
}
2019-03-26 14:06:22 +00:00
$rest_prefix = trailingslashit ( rest_get_url_prefix () );
$is_rest_api_request = ( false !== strpos ( $_SERVER [ 'REQUEST_URI' ], $rest_prefix ) ); // phpcs:disable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2018-08-17 17:13:44 +00:00
2019-03-26 14:06:22 +00:00
return apply_filters ( 'woocommerce_is_rest_api_request' , $is_rest_api_request );
2018-08-17 17:13:44 +00:00
}
2020-07-27 10:24:46 +00:00
/**
* Load REST API .
*/
public function load_rest_api () {
2020-07-29 18:40:14 +00:00
\Automattic\WooCommerce\RestApi\Server :: instance () -> init ();
2020-07-27 10:24:46 +00:00
}
2017-07-10 23:51:27 +00:00
/**
* What type of request is this ?
*
* @ param string $type admin , ajax , cron or frontend .
* @ return bool
*/
private function is_request ( $type ) {
switch ( $type ) {
2017-11-14 12:39:28 +00:00
case 'admin' :
2017-07-10 23:51:27 +00:00
return is_admin ();
2017-11-14 12:39:28 +00:00
case 'ajax' :
2020-02-18 15:13:30 +00:00
return defined ( 'DOING_AJAX' );
2017-11-14 12:39:28 +00:00
case 'cron' :
2020-02-18 15:13:30 +00:00
return defined ( 'DOING_CRON' );
2017-11-14 12:39:28 +00:00
case 'frontend' :
2020-02-18 15:13:30 +00:00
return ( ! is_admin () || defined ( 'DOING_AJAX' ) ) && ! defined ( 'DOING_CRON' ) && ! $this -> is_rest_api_request ();
2017-07-10 23:51:27 +00:00
}
}
/**
* Include required core files used in admin and on the frontend .
*/
public function includes () {
/**
* Class autoloader .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-autoloader.php' ;
2017-07-10 23:51:27 +00:00
/**
* Interfaces .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/interfaces/class-wc-abstract-order-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-coupon-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-customer-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-customer-download-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-customer-download-log-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-object-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-order-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-order-item-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-order-item-product-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-order-item-type-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-order-refund-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-payment-token-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-product-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-product-variable-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-shipping-zone-data-store-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-logger-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-log-handler-interface.php' ;
include_once WC_ABSPATH . 'includes/interfaces/class-wc-webhooks-data-store-interface.php' ;
2018-07-26 02:12:22 +00:00
include_once WC_ABSPATH . 'includes/interfaces/class-wc-queue-interface.php' ;
2017-07-10 23:51:27 +00:00
2019-10-14 15:14:13 +00:00
/**
* Core traits .
*/
include_once WC_ABSPATH . 'includes/traits/trait-wc-item-totals.php' ;
2017-07-10 23:51:27 +00:00
/**
* Abstract classes .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-data.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-object-query.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-payment-token.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-product.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-order.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-settings-api.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-shipping-method.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-payment-gateway.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-integration.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-log-handler.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-deprecated-hooks.php' ;
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-session.php' ;
2018-04-25 01:13:59 +00:00
include_once WC_ABSPATH . 'includes/abstracts/abstract-wc-privacy.php' ;
2017-07-10 23:51:27 +00:00
/**
* Core classes .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/wc-core-functions.php' ;
include_once WC_ABSPATH . 'includes/class-wc-datetime.php' ;
include_once WC_ABSPATH . 'includes/class-wc-post-types.php' ;
include_once WC_ABSPATH . 'includes/class-wc-install.php' ;
include_once WC_ABSPATH . 'includes/class-wc-geolocation.php' ;
include_once WC_ABSPATH . 'includes/class-wc-download-handler.php' ;
include_once WC_ABSPATH . 'includes/class-wc-comments.php' ;
include_once WC_ABSPATH . 'includes/class-wc-post-data.php' ;
include_once WC_ABSPATH . 'includes/class-wc-ajax.php' ;
include_once WC_ABSPATH . 'includes/class-wc-emails.php' ;
include_once WC_ABSPATH . 'includes/class-wc-data-exception.php' ;
include_once WC_ABSPATH . 'includes/class-wc-query.php' ;
include_once WC_ABSPATH . 'includes/class-wc-meta-data.php' ;
include_once WC_ABSPATH . 'includes/class-wc-order-factory.php' ;
include_once WC_ABSPATH . 'includes/class-wc-order-query.php' ;
include_once WC_ABSPATH . 'includes/class-wc-product-factory.php' ;
include_once WC_ABSPATH . 'includes/class-wc-product-query.php' ;
include_once WC_ABSPATH . 'includes/class-wc-payment-tokens.php' ;
include_once WC_ABSPATH . 'includes/class-wc-shipping-zone.php' ;
include_once WC_ABSPATH . 'includes/gateways/class-wc-payment-gateway-cc.php' ;
include_once WC_ABSPATH . 'includes/gateways/class-wc-payment-gateway-echeck.php' ;
include_once WC_ABSPATH . 'includes/class-wc-countries.php' ;
include_once WC_ABSPATH . 'includes/class-wc-integrations.php' ;
include_once WC_ABSPATH . 'includes/class-wc-cache-helper.php' ;
include_once WC_ABSPATH . 'includes/class-wc-https.php' ;
include_once WC_ABSPATH . 'includes/class-wc-deprecated-action-hooks.php' ;
include_once WC_ABSPATH . 'includes/class-wc-deprecated-filter-hooks.php' ;
include_once WC_ABSPATH . 'includes/class-wc-background-emailer.php' ;
include_once WC_ABSPATH . 'includes/class-wc-discounts.php' ;
include_once WC_ABSPATH . 'includes/class-wc-cart-totals.php' ;
include_once WC_ABSPATH . 'includes/customizer/class-wc-shop-customizer.php' ;
2018-02-14 13:20:34 +00:00
include_once WC_ABSPATH . 'includes/class-wc-regenerate-images.php' ;
2018-04-17 11:25:03 +00:00
include_once WC_ABSPATH . 'includes/class-wc-privacy.php' ;
2018-05-22 11:15:13 +00:00
include_once WC_ABSPATH . 'includes/class-wc-structured-data.php' ;
include_once WC_ABSPATH . 'includes/class-wc-shortcodes.php' ;
include_once WC_ABSPATH . 'includes/class-wc-logger.php' ;
2018-07-26 02:16:02 +00:00
include_once WC_ABSPATH . 'includes/queue/class-wc-action-queue.php' ;
2018-07-26 02:18:53 +00:00
include_once WC_ABSPATH . 'includes/queue/class-wc-queue.php' ;
2019-02-22 19:34:18 +00:00
include_once WC_ABSPATH . 'includes/admin/marketplace-suggestions/class-wc-marketplace-updater.php' ;
2021-01-06 10:33:28 +00:00
include_once WC_ABSPATH . 'includes/blocks/class-wc-blocks-utils.php' ;
2017-07-10 23:51:27 +00:00
/**
* Data stores - used to store and retrieve CRUD object data from the database .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-data-store-wp.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-coupon-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-product-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-product-grouped-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-product-variable-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-product-variation-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/abstract-wc-order-item-type-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-coupon-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-fee-data-store.php' ;
2018-03-08 19:30:33 +00:00
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-product-data-store.php' ;
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-shipping-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-item-tax-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-payment-token-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-customer-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-customer-data-store-session.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-customer-download-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-customer-download-log-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-shipping-zone-data-store.php' ;
include_once WC_ABSPATH . 'includes/data-stores/abstract-wc-order-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-order-refund-data-store-cpt.php' ;
include_once WC_ABSPATH . 'includes/data-stores/class-wc-webhook-data-store.php' ;
2017-07-10 23:51:27 +00:00
/**
* REST API .
*/
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/legacy/class-wc-legacy-api.php' ;
include_once WC_ABSPATH . 'includes/class-wc-api.php' ;
2019-06-19 10:52:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-rest-authentication.php' ;
include_once WC_ABSPATH . 'includes/class-wc-rest-exception.php' ;
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-auth.php' ;
include_once WC_ABSPATH . 'includes/class-wc-register-wp-admin-settings.php' ;
2017-07-10 23:51:27 +00:00
2019-07-10 15:47:44 +00:00
/**
* WCCOM Site .
*/
include_once WC_ABSPATH . 'includes/wccom-site/class-wc-wccom-site.php' ;
2018-05-10 01:37:15 +00:00
/**
2020-01-15 14:31:04 +00:00
* Libraries and packages .
2018-05-10 01:37:15 +00:00
*/
2020-01-15 14:31:04 +00:00
include_once WC_ABSPATH . 'packages/action-scheduler/action-scheduler.php' ;
2018-05-10 01:37:15 +00:00
2020-02-18 15:13:30 +00:00
if ( defined ( 'WP_CLI' ) && WP_CLI ) {
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-cli.php' ;
2017-07-13 18:57:46 +00:00
}
2017-07-10 23:51:27 +00:00
if ( $this -> is_request ( 'admin' ) ) {
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/admin/class-wc-admin.php' ;
2017-07-10 23:51:27 +00:00
}
if ( $this -> is_request ( 'frontend' ) ) {
$this -> frontend_includes ();
}
if ( $this -> is_request ( 'cron' ) && 'yes' === get_option ( 'woocommerce_allow_tracking' , 'no' ) ) {
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/class-wc-tracker.php' ;
2017-07-10 23:51:27 +00:00
}
2017-11-07 12:34:11 +00:00
$this -> theme_support_includes ();
2020-06-11 07:53:26 +00:00
$this -> query = new WC_Query ();
$this -> api = new WC_API ();
2019-06-19 10:29:49 +00:00
$this -> api -> init ();
2017-07-10 23:51:27 +00:00
}
2017-11-07 12:34:11 +00:00
/**
2017-11-14 12:08:57 +00:00
* Include classes for theme support .
2017-11-07 12:34:11 +00:00
*
* @ since 3.3 . 0
*/
private function theme_support_includes () {
2019-12-11 17:35:04 +00:00
if ( wc_is_wp_default_theme_active () ) {
2017-11-07 12:34:11 +00:00
switch ( get_template () ) {
2017-11-14 12:39:28 +00:00
case 'twentyten' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-ten.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentyeleven' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-eleven.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentytwelve' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-twelve.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentythirteen' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-thirteen.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentyfourteen' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-fourteen.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentyfifteen' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-fifteen.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentysixteen' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-sixteen.php' ;
2017-11-07 12:34:11 +00:00
break ;
2017-11-14 12:39:28 +00:00
case 'twentyseventeen' :
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-seventeen.php' ;
2017-11-07 12:34:11 +00:00
break ;
2018-11-16 16:38:05 +00:00
case 'twentynineteen' :
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-nineteen.php' ;
break ;
2019-11-19 16:58:16 +00:00
case 'twentytwenty' :
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-twenty.php' ;
break ;
2020-10-03 13:15:33 +00:00
case 'twentytwentyone' :
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-twenty-one.php' ;
break ;
2017-11-07 12:34:11 +00:00
}
}
}
2017-07-10 23:51:27 +00:00
/**
* Include required frontend files .
*/
public function frontend_includes () {
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/wc-cart-functions.php' ;
include_once WC_ABSPATH . 'includes/wc-notice-functions.php' ;
include_once WC_ABSPATH . 'includes/wc-template-hooks.php' ;
include_once WC_ABSPATH . 'includes/class-wc-template-loader.php' ;
include_once WC_ABSPATH . 'includes/class-wc-frontend-scripts.php' ;
include_once WC_ABSPATH . 'includes/class-wc-form-handler.php' ;
include_once WC_ABSPATH . 'includes/class-wc-cart.php' ;
include_once WC_ABSPATH . 'includes/class-wc-tax.php' ;
include_once WC_ABSPATH . 'includes/class-wc-shipping-zones.php' ;
include_once WC_ABSPATH . 'includes/class-wc-customer.php' ;
include_once WC_ABSPATH . 'includes/class-wc-embed.php' ;
include_once WC_ABSPATH . 'includes/class-wc-session-handler.php' ;
2017-07-10 23:51:27 +00:00
}
/**
* Function used to Init WooCommerce Template Functions - This makes them pluggable by plugins and themes .
*/
public function include_template_functions () {
2018-01-25 17:27:50 +00:00
include_once WC_ABSPATH . 'includes/wc-template-functions.php' ;
2017-07-10 23:51:27 +00:00
}
/**
* Init WooCommerce when WordPress Initialises .
*/
public function init () {
// Before init action.
do_action ( 'before_woocommerce_init' );
// Set up localisation.
$this -> load_plugin_textdomain ();
// Load class instances.
2020-06-11 07:53:26 +00:00
$this -> product_factory = new WC_Product_Factory ();
$this -> order_factory = new WC_Order_Factory ();
$this -> countries = new WC_Countries ();
$this -> integrations = new WC_Integrations ();
$this -> structured_data = new WC_Structured_Data ();
$this -> deprecated_hook_handlers [ 'actions' ] = new WC_Deprecated_Action_Hooks ();
$this -> deprecated_hook_handlers [ 'filters' ] = new WC_Deprecated_Filter_Hooks ();
2017-07-10 23:51:27 +00:00
// Classes/actions loaded for the frontend and for ajax requests.
if ( $this -> is_request ( 'frontend' ) ) {
2019-05-22 10:24:31 +00:00
wc_load_cart ();
2017-07-10 23:51:27 +00:00
}
$this -> load_webhooks ();
// Init action.
do_action ( 'woocommerce_init' );
}
/**
* Load Localisation files .
*
* Note : the first - loaded translation file overrides any following ones if the same translation is present .
*
* Locales found in :
* - WP_LANG_DIR / woocommerce / woocommerce - LOCALE . mo
* - WP_LANG_DIR / plugins / woocommerce - LOCALE . mo
*/
public function load_plugin_textdomain () {
2020-11-24 10:07:13 +00:00
$locale = determine_locale ();
2017-07-10 23:51:27 +00:00
$locale = apply_filters ( 'plugin_locale' , $locale , 'woocommerce' );
unload_textdomain ( 'woocommerce' );
load_textdomain ( 'woocommerce' , WP_LANG_DIR . '/woocommerce/woocommerce-' . $locale . '.mo' );
2017-07-10 23:53:54 +00:00
load_plugin_textdomain ( 'woocommerce' , false , plugin_basename ( dirname ( WC_PLUGIN_FILE ) ) . '/i18n/languages' );
2017-07-10 23:51:27 +00:00
}
/**
* Ensure theme and server variable compatibility and setup image sizes .
*/
public function setup_environment () {
2019-01-23 16:20:26 +00:00
/**
* WC_TEMPLATE_PATH constant .
*
* @ deprecated 2.2 Use WC () -> template_path () instead .
*/
2017-07-10 23:51:27 +00:00
$this -> define ( 'WC_TEMPLATE_PATH' , $this -> template_path () );
$this -> add_thumbnail_support ();
}
/**
* Ensure post thumbnail support is turned on .
*/
private function add_thumbnail_support () {
if ( ! current_theme_supports ( 'post-thumbnails' ) ) {
add_theme_support ( 'post-thumbnails' );
}
add_post_type_support ( 'product' , 'thumbnail' );
}
/**
* Add WC Image sizes to WP .
*
2017-11-07 11:03:56 +00:00
* As of 3.3 , image sizes can be registered via themes using add_theme_support for woocommerce
* and defining an array of args . If these are not defined , we will use defaults . This is
* handled in wc_get_image_size function .
*
2017-11-07 18:32:43 +00:00
* 3.3 sizes :
2017-11-07 11:03:56 +00:00
*
2018-01-25 17:27:50 +00:00
* woocommerce_thumbnail - Used in product listings . We assume these work for a 3 column grid layout .
* woocommerce_single - Used on single product pages for the main image .
2017-11-07 11:03:56 +00:00
*
2017-07-10 23:51:27 +00:00
* @ since 2.3
*/
2018-01-23 10:56:37 +00:00
public function add_image_sizes () {
2018-02-12 17:47:22 +00:00
$thumbnail = wc_get_image_size ( 'thumbnail' );
$single = wc_get_image_size ( 'single' );
$gallery_thumbnail = wc_get_image_size ( 'gallery_thumbnail' );
2017-11-07 18:32:43 +00:00
add_image_size ( 'woocommerce_thumbnail' , $thumbnail [ 'width' ], $thumbnail [ 'height' ], $thumbnail [ 'crop' ] );
add_image_size ( 'woocommerce_single' , $single [ 'width' ], $single [ 'height' ], $single [ 'crop' ] );
2018-02-12 17:47:22 +00:00
add_image_size ( 'woocommerce_gallery_thumbnail' , $gallery_thumbnail [ 'width' ], $gallery_thumbnail [ 'height' ], $gallery_thumbnail [ 'crop' ] );
2018-01-25 17:27:50 +00:00
2019-01-23 16:20:26 +00:00
/**
* Legacy image sizes .
*
2020-07-16 20:13:08 +00:00
* @ deprecated 3.3 . 0 These sizes will be removed in 4.6 . 0.
2019-01-23 16:20:26 +00:00
*/
2017-11-07 18:32:43 +00:00
add_image_size ( 'shop_catalog' , $thumbnail [ 'width' ], $thumbnail [ 'height' ], $thumbnail [ 'crop' ] );
add_image_size ( 'shop_single' , $single [ 'width' ], $single [ 'height' ], $single [ 'crop' ] );
2018-02-13 12:51:55 +00:00
add_image_size ( 'shop_thumbnail' , $gallery_thumbnail [ 'width' ], $gallery_thumbnail [ 'height' ], $gallery_thumbnail [ 'crop' ] );
2017-07-10 23:51:27 +00:00
}
/**
* Get the plugin url .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return string
*/
public function plugin_url () {
2017-07-10 23:53:54 +00:00
return untrailingslashit ( plugins_url ( '/' , WC_PLUGIN_FILE ) );
2017-07-10 23:51:27 +00:00
}
/**
* Get the plugin path .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return string
*/
public function plugin_path () {
2017-07-10 23:53:54 +00:00
return untrailingslashit ( plugin_dir_path ( WC_PLUGIN_FILE ) );
2017-07-10 23:51:27 +00:00
}
/**
* Get the template path .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return string
*/
public function template_path () {
return apply_filters ( 'woocommerce_template_path' , 'woocommerce/' );
}
/**
* Get Ajax URL .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return string
*/
public function ajax_url () {
return admin_url ( 'admin-ajax.php' , 'relative' );
}
/**
* Return the WC API URL for a given request .
*
2017-07-13 18:57:46 +00:00
* @ param string $request Requested endpoint .
* @ param bool | null $ssl If should use SSL , null if should auto detect . Default : null .
2017-07-10 23:51:27 +00:00
* @ return string
*/
public function api_request_url ( $request , $ssl = null ) {
if ( is_null ( $ssl ) ) {
2018-01-25 17:27:50 +00:00
$scheme = wp_parse_url ( home_url (), PHP_URL_SCHEME );
2017-07-10 23:51:27 +00:00
} elseif ( $ssl ) {
$scheme = 'https' ;
} else {
$scheme = 'http' ;
}
if ( strstr ( get_option ( 'permalink_structure' ), '/index.php/' ) ) {
$api_request_url = trailingslashit ( home_url ( '/index.php/wc-api/' . $request , $scheme ) );
} elseif ( get_option ( 'permalink_structure' ) ) {
$api_request_url = trailingslashit ( home_url ( '/wc-api/' . $request , $scheme ) );
} else {
$api_request_url = add_query_arg ( 'wc-api' , $request , trailingslashit ( home_url ( '' , $scheme ) ) );
}
return esc_url_raw ( apply_filters ( 'woocommerce_api_request_url' , $api_request_url , $request , $ssl ) );
}
/**
* Load & enqueue active webhooks .
*
* @ since 2.2
*/
private function load_webhooks () {
if ( ! is_blog_installed () ) {
return ;
}
2019-02-18 12:49:07 +00:00
/**
* Hook : woocommerce_load_webhooks_limit .
*
* @ since 3.6 . 0
* @ param int $limit Used to limit how many webhooks are loaded . Default : no limit .
*/
$limit = apply_filters ( 'woocommerce_load_webhooks_limit' , null );
2018-09-24 02:15:22 +00:00
wc_load_webhooks ( 'active' , $limit );
2017-07-10 23:51:27 +00:00
}
2019-05-22 10:24:31 +00:00
/**
* Initialize the customer and cart objects and setup customer saving on shutdown .
*
* @ since 3.6 . 4
* @ return void
*/
public function initialize_cart () {
// Cart needs customer info.
if ( is_null ( $this -> customer ) || ! $this -> customer instanceof WC_Customer ) {
2020-06-11 07:53:26 +00:00
$this -> customer = new WC_Customer ( get_current_user_id (), true );
2019-05-22 10:24:31 +00:00
// Customer should be saved during shutdown.
add_action ( 'shutdown' , array ( $this -> customer , 'save' ), 10 );
}
if ( is_null ( $this -> cart ) || ! $this -> cart instanceof WC_Cart ) {
2020-06-11 07:53:26 +00:00
$this -> cart = new WC_Cart ();
2019-05-22 10:24:31 +00:00
}
}
/**
* Initialize the session class .
*
* @ since 3.6 . 4
* @ return void
*/
public function initialize_session () {
// Session class, handles session data for users - can be overwritten if custom handler is needed.
$session_class = apply_filters ( 'woocommerce_session_handler' , 'WC_Session_Handler' );
if ( is_null ( $this -> session ) || ! $this -> session instanceof $session_class ) {
2020-06-11 07:53:26 +00:00
$this -> session = new $session_class ();
2019-05-22 10:24:31 +00:00
$this -> session -> init ();
}
}
2017-07-10 23:51:27 +00:00
/**
2019-02-12 14:04:22 +00:00
* Set tablenames inside WPDB object .
2017-07-10 23:51:27 +00:00
*/
public function wpdb_table_fix () {
2019-04-26 13:03:23 +00:00
$this -> define_tables ();
2017-07-10 23:51:27 +00:00
}
2019-03-08 12:50:06 +00:00
/**
* Ran when any plugin is activated .
*
* @ since 3.6 . 0
* @ param string $filename The filename of the activated plugin .
*/
public function activated_plugin ( $filename ) {
2019-03-08 13:11:30 +00:00
include_once dirname ( __FILE__ ) . '/admin/helper/class-wc-helper.php' ;
2019-03-08 12:50:06 +00:00
2021-01-13 01:52:17 +00:00
if ( '/woocommerce.php' === substr ( $filename , - 16 ) ) {
set_transient ( 'woocommerce_activated_plugin' , $filename );
2020-12-31 06:30:29 +00:00
}
2019-03-08 12:50:06 +00:00
WC_Helper :: activated_plugin ( $filename );
}
/**
* Ran when any plugin is deactivated .
*
* @ since 3.6 . 0
* @ param string $filename The filename of the deactivated plugin .
*/
public function deactivated_plugin ( $filename ) {
2019-03-08 13:11:30 +00:00
include_once dirname ( __FILE__ ) . '/admin/helper/class-wc-helper.php' ;
2019-03-08 12:50:06 +00:00
WC_Helper :: deactivated_plugin ( $filename );
}
2018-07-26 02:18:53 +00:00
/**
* Get queue instance .
*
* @ return WC_Queue_Interface
*/
public function queue () {
2020-06-11 07:53:26 +00:00
return WC_Queue :: instance ();
2018-07-26 02:18:53 +00:00
}
2017-07-10 23:51:27 +00:00
/**
* Get Checkout Class .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return WC_Checkout
*/
public function checkout () {
2020-06-11 07:53:26 +00:00
return WC_Checkout :: instance ();
2017-07-10 23:51:27 +00:00
}
/**
* Get gateways class .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return WC_Payment_Gateways
*/
public function payment_gateways () {
2020-06-11 07:53:26 +00:00
return WC_Payment_Gateways :: instance ();
2017-07-10 23:51:27 +00:00
}
/**
* Get shipping class .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return WC_Shipping
*/
public function shipping () {
2020-06-11 07:53:26 +00:00
return WC_Shipping :: instance ();
2017-07-10 23:51:27 +00:00
}
/**
* Email Class .
2017-07-13 18:57:46 +00:00
*
2017-07-10 23:51:27 +00:00
* @ return WC_Emails
*/
public function mailer () {
2020-06-11 07:53:26 +00:00
return WC_Emails :: instance ();
2017-07-10 23:51:27 +00:00
}
2019-07-03 09:46:28 +00:00
/**
* Check if plugin assets are built and minified
*
* @ return bool
*/
public function build_dependencies_satisfied () {
// Check if we have compiled CSS.
2019-07-03 09:49:51 +00:00
if ( ! file_exists ( WC () -> plugin_path () . '/assets/css/admin.css' ) ) {
2019-07-03 09:46:28 +00:00
return false ;
}
// Check if we have minified JS.
2019-07-03 09:49:51 +00:00
if ( ! file_exists ( WC () -> plugin_path () . '/assets/js/admin/woocommerce_admin.min.js' ) ) {
2019-07-03 09:46:28 +00:00
return false ;
}
return true ;
}
/**
* Output a admin notice when build dependencies not met .
*
* @ return void
*/
public function build_dependencies_notice () {
if ( $this -> build_dependencies_satisfied () ) {
return ;
}
$message_one = __ ( 'You have installed a development version of WooCommerce which requires files to be built and minified. From the plugin directory, run <code>grunt assets</code> to build and minify assets.' , 'woocommerce' );
$message_two = sprintf (
/* translators: 1: URL of WordPress.org Repository 2: URL of the GitHub Repository release page */
__ ( 'Or you can download a pre-built version of the plugin from the <a href="%1$s">WordPress.org repository</a> or by visiting <a href="%2$s">the releases page in the GitHub repository</a>.' , 'woocommerce' ),
'https://wordpress.org/plugins/woocommerce/' ,
'https://github.com/woocommerce/woocommerce/releases'
);
2021-01-14 10:40:11 +00:00
printf ( '<div class="error"><p>%s %s</p></div>' , $message_one , $message_two ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2019-07-03 09:46:28 +00:00
}
2020-02-23 20:59:03 +00:00
/**
* Is the WooCommerce Admin actively included in the WooCommerce core ?
* Based on presence of a basic WC Admin function .
*
* @ return boolean
*/
public function is_wc_admin_active () {
return function_exists ( 'wc_admin_url' );
}
2020-09-21 14:24:24 +00:00
/**
* Call a user function . This should be used to execute any non - idempotent function , especially
* those in the `includes` directory or provided by WordPress .
*
* This method can be useful for unit tests , since functions called using this method
* can be easily mocked by using WC_Unit_Test_Case :: register_legacy_proxy_function_mocks .
*
* @ param string $function_name The function to execute .
* @ param mixed ... $parameters The parameters to pass to the function .
*
* @ return mixed The result from the function .
*
* @ since 4.4
*/
public function call_function ( $function_name , ... $parameters ) {
return wc_get_container () -> get ( LegacyProxy :: class ) -> call_function ( $function_name , ... $parameters );
}
/**
* Call a static method in a class . This should be used to execute any non - idempotent method in classes
* from the `includes` directory .
*
* This method can be useful for unit tests , since methods called using this method
* can be easily mocked by using WC_Unit_Test_Case :: register_legacy_proxy_static_mocks .
*
* @ param string $class_name The name of the class containing the method .
* @ param string $method_name The name of the method .
* @ param mixed ... $parameters The parameters to pass to the method .
*
* @ return mixed The result from the method .
*
* @ since 4.4
*/
public function call_static ( $class_name , $method_name , ... $parameters ) {
return wc_get_container () -> get ( LegacyProxy :: class ) -> call_static ( $class_name , $method_name , ... $parameters );
}
/**
* Gets an instance of a given legacy class .
* This must not be used to get instances of classes in the `src` directory .
*
* This method can be useful for unit tests , since objects obtained using this method
* can be easily mocked by using WC_Unit_Test_Case :: register_legacy_proxy_class_mocks .
*
* @ param string $class_name The name of the class to get an instance for .
* @ param mixed ... $args Parameters to be passed to the class constructor or to the appropriate internal 'get_instance_of_' method .
*
* @ return object The instance of the class .
* @ throws \Exception The requested class belongs to the `src` directory , or there was an error creating an instance of the class .
*
* @ since 4.4
*/
public function get_instance_of ( string $class_name , ... $args ) {
return wc_get_container () -> get ( LegacyProxy :: class ) -> get_instance_of ( $class_name , ... $args );
}
2017-07-10 23:51:27 +00:00
}