2013-06-06 13:20:47 +00:00
< ? php
2015-02-04 16:07:33 +00:00
/**
2015-11-03 13:53:50 +00:00
* Handle frontend scripts
2015-02-04 16:07:33 +00:00
*
* @ class WC_Frontend_Scripts
* @ version 2.3 . 0
* @ package WooCommerce / Classes /
* @ category Class
* @ author WooThemes
*/
2014-05-28 13:52:50 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
2015-02-04 16:07:33 +00:00
exit ;
2014-05-28 13:52:50 +00:00
}
2013-06-11 12:31:41 +00:00
/**
2015-11-03 13:31:20 +00:00
* WC_Frontend_Scripts Class .
2013-06-11 12:31:41 +00:00
*/
class WC_Frontend_Scripts {
2013-06-06 13:20:47 +00:00
2014-09-24 09:57:39 +00:00
/**
2015-11-03 13:31:20 +00:00
* Contains an array of script handles registered by WC .
2014-09-24 09:57:39 +00:00
* @ var array
*/
private static $scripts = array ();
2015-10-01 13:31:05 +00:00
/**
2015-11-03 13:31:20 +00:00
* Contains an array of script handles registered by WC .
2015-10-01 13:31:05 +00:00
* @ var array
*/
private static $styles = array ();
2014-09-24 09:57:39 +00:00
/**
2015-11-03 13:31:20 +00:00
* Contains an array of script handles localized by WC .
2014-09-24 09:57:39 +00:00
* @ var array
*/
private static $wp_localize_scripts = array ();
2013-06-11 12:31:41 +00:00
/**
2015-02-04 16:07:33 +00:00
* Hook in methods .
2013-06-11 12:31:41 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function init () {
add_action ( 'wp_enqueue_scripts' , array ( __CLASS__ , 'load_scripts' ) );
2014-05-30 11:01:01 +00:00
add_action ( 'wp_print_scripts' , array ( __CLASS__ , 'localize_printed_scripts' ), 5 );
add_action ( 'wp_print_footer_scripts' , array ( __CLASS__ , 'localize_printed_scripts' ), 5 );
2013-06-11 12:31:41 +00:00
}
2013-06-06 13:20:47 +00:00
2013-08-02 11:27:31 +00:00
/**
2015-02-04 16:07:33 +00:00
* Get styles for the frontend .
2014-09-24 09:57:39 +00:00
* @ access private
2013-08-02 11:27:31 +00:00
* @ return array
*/
public static function get_styles () {
return apply_filters ( 'woocommerce_enqueue_styles' , array (
'woocommerce-layout' => array (
'src' => str_replace ( array ( 'http:' , 'https:' ), '' , WC () -> plugin_url () ) . '/assets/css/woocommerce-layout.css' ,
'deps' => '' ,
2013-10-24 18:36:22 +00:00
'version' => WC_VERSION ,
2013-11-18 12:53:45 +00:00
'media' => 'all'
2013-08-02 11:27:31 +00:00
),
'woocommerce-smallscreen' => array (
'src' => str_replace ( array ( 'http:' , 'https:' ), '' , WC () -> plugin_url () ) . '/assets/css/woocommerce-smallscreen.css' ,
'deps' => 'woocommerce-layout' ,
2013-10-24 18:36:22 +00:00
'version' => WC_VERSION ,
2013-08-02 11:27:31 +00:00
'media' => 'only screen and (max-width: ' . apply_filters ( 'woocommerce_style_smallscreen_breakpoint' , $breakpoint = '768px' ) . ')'
),
'woocommerce-general' => array (
'src' => str_replace ( array ( 'http:' , 'https:' ), '' , WC () -> plugin_url () ) . '/assets/css/woocommerce.css' ,
'deps' => '' ,
2013-10-24 18:36:22 +00:00
'version' => WC_VERSION ,
2013-11-18 12:53:45 +00:00
'media' => 'all'
2013-08-02 11:27:31 +00:00
),
) );
}
2014-09-24 09:57:39 +00:00
/**
2015-02-04 16:07:33 +00:00
* Register a script for use .
2014-09-24 09:57:39 +00:00
*
* @ uses wp_register_script ()
* @ access private
2015-10-01 13:31:05 +00:00
* @ param string $handle
* @ param string $path
* @ param string [] $deps
* @ param string $version
* @ param boolean $in_footer
2014-09-24 09:57:39 +00:00
*/
private static function register_script ( $handle , $path , $deps = array ( 'jquery' ), $version = WC_VERSION , $in_footer = true ) {
self :: $scripts [] = $handle ;
wp_register_script ( $handle , $path , $deps , $version , $in_footer );
}
/**
2015-02-04 16:07:33 +00:00
* Register and enqueue a script for use .
2014-09-24 09:57:39 +00:00
*
* @ uses wp_enqueue_script ()
* @ access private
2015-10-01 13:31:05 +00:00
* @ param string $handle
* @ param string $path
* @ param string [] $deps
* @ param string $version
* @ param boolean $in_footer
2014-09-24 09:57:39 +00:00
*/
private static function enqueue_script ( $handle , $path = '' , $deps = array ( 'jquery' ), $version = WC_VERSION , $in_footer = true ) {
if ( ! in_array ( $handle , self :: $scripts ) && $path ) {
self :: register_script ( $handle , $path , $deps , $version , $in_footer );
}
wp_enqueue_script ( $handle );
}
2015-10-01 13:31:05 +00:00
/**
* Register a style for use .
*
* @ uses wp_register_style ()
* @ access private
* @ param string $handle
* @ param string $path
* @ param string [] $deps
* @ param string $version
* @ param string $media
*/
private static function register_style ( $handle , $path , $deps = array (), $version = WC_VERSION , $media = 'all' ) {
self :: $styles [] = $handle ;
wp_register_style ( $handle , $path , $deps , $version , $media );
}
/**
* Register and enqueue a styles for use .
*
* @ uses wp_enqueue_style ()
* @ access private
* @ param string $handle
* @ param string $path
* @ param string [] $deps
* @ param string $version
* @ param string $media
*/
private static function enqueue_style ( $handle , $path = '' , $deps = array (), $version = WC_VERSION , $media = 'all' ) {
if ( ! in_array ( $handle , self :: $styles ) && $path ) {
self :: register_style ( $handle , $path , $deps , $version , $media );
}
wp_enqueue_style ( $handle );
}
2013-06-06 13:20:47 +00:00
/**
* Register / queue frontend scripts .
*/
2014-05-28 13:52:50 +00:00
public static function load_scripts () {
2014-06-08 20:33:11 +00:00
global $post ;
2013-06-06 13:20:47 +00:00
2015-10-05 18:12:19 +00:00
if ( ! did_action ( 'before_woocommerce_init' ) ) {
return ;
}
2013-06-06 13:20:47 +00:00
$suffix = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' ;
2014-09-24 09:57:39 +00:00
$lightbox_en = 'yes' === get_option ( 'woocommerce_enable_lightbox' );
$ajax_cart_en = 'yes' === get_option ( 'woocommerce_enable_ajax_add_to_cart' );
2013-08-02 11:06:32 +00:00
$assets_path = str_replace ( array ( 'http:' , 'https:' ), '' , WC () -> plugin_url () ) . '/assets/' ;
2013-06-06 13:20:47 +00:00
$frontend_script_path = $assets_path . 'js/frontend/' ;
2015-01-12 16:16:10 +00:00
// Register any scripts for later use, or used as dependencies
2016-02-08 12:10:42 +00:00
self :: register_script ( 'select2' , $assets_path . 'js/select2/select2' . $suffix . '.js' , array ( 'jquery' ), '3.5.4' );
2015-05-25 11:18:41 +00:00
self :: register_script ( 'jquery-blockui' , $assets_path . 'js/jquery-blockui/jquery.blockUI' . $suffix . '.js' , array ( 'jquery' ), '2.70' );
2015-07-09 20:17:34 +00:00
self :: register_script ( 'jquery-payment' , $assets_path . 'js/jquery-payment/jquery.payment' . $suffix . '.js' , array ( 'jquery' ), '1.2.4' );
2015-02-02 16:20:00 +00:00
self :: register_script ( 'jquery-cookie' , $assets_path . 'js/jquery-cookie/jquery.cookie' . $suffix . '.js' , array ( 'jquery' ), '1.4.1' );
2014-09-24 09:57:39 +00:00
self :: register_script ( 'wc-credit-card-form' , $frontend_script_path . 'credit-card-form' . $suffix . '.js' , array ( 'jquery' , 'jquery-payment' ) );
2015-10-28 13:04:28 +00:00
self :: register_script ( 'wc-add-to-cart-variation' , $frontend_script_path . 'add-to-cart-variation' . $suffix . '.js' , array ( 'jquery' , 'wp-util' ) );
2016-04-25 13:40:08 +00:00
self :: register_script ( 'wc-single-product' , $frontend_script_path . 'single-product' . $suffix . '.js' , array ( 'jquery' ) );
self :: register_script ( 'wc-country-select' , $frontend_script_path . 'country-select' . $suffix . '.js' , array ( 'jquery' ) );
self :: register_script ( 'wc-address-i18n' , $frontend_script_path . 'address-i18n' . $suffix . '.js' , array ( 'jquery' ) );
2015-10-09 16:31:47 +00:00
self :: register_script ( 'wc-password-strength-meter' , $frontend_script_path . 'password-strength-meter' . $suffix . '.js' , array ( 'jquery' , 'password-strength-meter' ) );
2013-06-06 13:20:47 +00:00
2014-09-24 09:57:39 +00:00
// Register frontend scripts conditionally
if ( $ajax_cart_en ) {
self :: enqueue_script ( 'wc-add-to-cart' , $frontend_script_path . 'add-to-cart' . $suffix . '.js' );
}
if ( is_cart () ) {
2015-03-06 12:37:21 +00:00
self :: enqueue_script ( 'wc-cart' , $frontend_script_path . 'cart' . $suffix . '.js' , array ( 'jquery' , 'wc-country-select' , 'wc-address-i18n' ) );
2014-09-24 09:57:39 +00:00
}
2015-10-09 14:22:31 +00:00
if ( is_checkout () || is_account_page () ) {
2015-01-12 16:16:10 +00:00
self :: enqueue_script ( 'select2' );
2015-10-01 13:31:05 +00:00
self :: enqueue_style ( 'select2' , $assets_path . 'css/select2.css' );
2015-10-09 14:22:31 +00:00
2016-01-22 19:33:35 +00:00
// Password strength meter.
// Load in checkout, account login and edit account page.
if ( ( 'no' === get_option ( 'woocommerce_registration_generate_password' ) && ! is_user_logged_in () ) || is_edit_account_page () ) {
2015-10-09 16:31:47 +00:00
self :: enqueue_script ( 'wc-password-strength-meter' );
2015-10-09 14:22:31 +00:00
}
2014-09-24 09:57:39 +00:00
}
2013-06-06 13:20:47 +00:00
if ( is_checkout () ) {
2014-09-24 09:57:39 +00:00
self :: enqueue_script ( 'wc-checkout' , $frontend_script_path . 'checkout' . $suffix . '.js' , array ( 'jquery' , 'woocommerce' , 'wc-country-select' , 'wc-address-i18n' ) );
2013-06-06 13:20:47 +00:00
}
2014-09-24 09:57:39 +00:00
if ( is_add_payment_method_page () ) {
self :: enqueue_script ( 'wc-add-payment-method' , $frontend_script_path . 'add-payment-method' . $suffix . '.js' , array ( 'jquery' , 'woocommerce' ) );
2014-02-08 08:58:50 +00:00
}
2014-10-16 19:59:45 +00:00
if ( is_lost_password_page () ) {
self :: enqueue_script ( 'wc-lost-password' , $frontend_script_path . 'lost-password' . $suffix . '.js' , array ( 'jquery' , 'woocommerce' ) );
}
2013-06-06 13:20:47 +00:00
if ( $lightbox_en && ( is_product () || ( ! empty ( $post -> post_content ) && strstr ( $post -> post_content , '[product_page' ) ) ) ) {
2015-05-20 14:56:45 +00:00
self :: enqueue_script ( 'prettyPhoto' , $assets_path . 'js/prettyPhoto/jquery.prettyPhoto' . $suffix . '.js' , array ( 'jquery' ), '3.1.6' , true );
2014-09-24 09:57:39 +00:00
self :: enqueue_script ( 'prettyPhoto-init' , $assets_path . 'js/prettyPhoto/jquery.prettyPhoto.init' . $suffix . '.js' , array ( 'jquery' , 'prettyPhoto' ) );
2015-10-01 13:31:05 +00:00
self :: enqueue_style ( 'woocommerce_prettyPhoto_css' , $assets_path . 'css/prettyPhoto.css' );
2013-06-06 13:20:47 +00:00
}
2014-09-24 09:57:39 +00:00
if ( is_product () ) {
self :: enqueue_script ( 'wc-single-product' );
}
2015-06-17 13:16:35 +00:00
if ( 'geolocation_ajax' === get_option ( 'woocommerce_default_customer_address' ) ) {
2016-04-01 10:14:24 +00:00
// Exclude common bots from geolocation by user agent.
$ua = isset ( $_SERVER [ 'HTTP_USER_AGENT' ] ) ? strtolower ( $_SERVER [ 'HTTP_USER_AGENT' ] ) : '' ;
if ( ! strstr ( $ua , 'bot' ) && ! strstr ( $ua , 'spider' ) && ! strstr ( $ua , 'crawl' ) ) {
self :: enqueue_script ( 'wc-geolocation' , $frontend_script_path . 'geolocation' . $suffix . '.js' , array ( 'jquery' ) );
}
2015-06-17 13:16:35 +00:00
}
2013-06-06 13:20:47 +00:00
// Global frontend scripts
2014-09-24 09:57:39 +00:00
self :: enqueue_script ( 'woocommerce' , $frontend_script_path . 'woocommerce' . $suffix . '.js' , array ( 'jquery' , 'jquery-blockui' ) );
self :: enqueue_script ( 'wc-cart-fragments' , $frontend_script_path . 'cart-fragments' . $suffix . '.js' , array ( 'jquery' , 'jquery-cookie' ) );
2013-06-06 13:20:47 +00:00
// CSS Styles
2014-09-24 09:57:39 +00:00
if ( $enqueue_styles = self :: get_styles () ) {
2014-05-28 13:52:50 +00:00
foreach ( $enqueue_styles as $handle => $args ) {
2015-10-01 13:31:05 +00:00
self :: enqueue_style ( $handle , $args [ 'src' ], $args [ 'deps' ], $args [ 'version' ], $args [ 'media' ] );
2014-05-28 13:52:50 +00:00
}
}
2013-06-06 13:20:47 +00:00
}
2014-05-30 11:01:01 +00:00
/**
2014-09-24 09:57:39 +00:00
* Localize a WC script once .
* @ access private
2015-02-04 16:07:33 +00:00
* @ since 2.3 . 0 this needs less wp_script_is () calls due to https :// core . trac . wordpress . org / ticket / 28404 being added in WP 4.0 .
2014-09-24 09:57:39 +00:00
* @ param string $handle
2014-05-30 11:01:01 +00:00
*/
2014-09-24 09:57:39 +00:00
private static function localize_script ( $handle ) {
if ( ! in_array ( $handle , self :: $wp_localize_scripts ) && wp_script_is ( $handle ) && ( $data = self :: get_script_data ( $handle ) ) ) {
$name = str_replace ( '-' , '_' , $handle ) . '_params' ;
self :: $wp_localize_scripts [] = $handle ;
wp_localize_script ( $handle , $name , apply_filters ( $name , $data ) );
2014-05-30 11:01:01 +00:00
}
}
2013-06-06 13:20:47 +00:00
/**
2015-02-04 16:07:33 +00:00
* Return data for script handles .
2014-09-24 09:57:39 +00:00
* @ access private
* @ param string $handle
* @ return array | bool
2013-06-06 13:20:47 +00:00
*/
2014-09-24 09:57:39 +00:00
private static function get_script_data ( $handle ) {
global $wp ;
switch ( $handle ) {
case 'woocommerce' :
2015-06-17 13:16:35 +00:00
return array (
'ajax_url' => WC () -> ajax_url (),
2015-07-27 10:56:07 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " )
2015-06-17 13:16:35 +00:00
);
break ;
case 'wc-geolocation' :
2014-09-24 09:57:39 +00:00
return array (
2015-11-04 03:51:54 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " ),
'home_url' => home_url (),
'is_available' => ! ( is_cart () || is_account_page () || is_checkout () || is_customize_preview () ) ? '1' : '0' ,
'hash' => isset ( $_GET [ 'v' ] ) ? wc_clean ( $_GET [ 'v' ] ) : ''
2014-09-24 09:57:39 +00:00
);
break ;
case 'wc-single-product' :
return array (
'i18n_required_rating_text' => esc_attr__ ( 'Please select a rating' , 'woocommerce' ),
'review_rating_required' => get_option ( 'woocommerce_review_rating_required' ),
);
break ;
case 'wc-checkout' :
return array (
'ajax_url' => WC () -> ajax_url (),
2015-07-27 10:56:07 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " ),
2014-12-08 06:15:03 +00:00
'update_order_review_nonce' => wp_create_nonce ( 'update-order-review' ),
'apply_coupon_nonce' => wp_create_nonce ( 'apply-coupon' ),
'remove_coupon_nonce' => wp_create_nonce ( 'remove-coupon' ),
2014-09-24 09:57:39 +00:00
'option_guest_checkout' => get_option ( 'woocommerce_enable_guest_checkout' ),
2015-08-11 10:18:50 +00:00
'checkout_url' => WC_AJAX :: get_endpoint ( " checkout " ),
2015-01-26 14:24:00 +00:00
'is_checkout' => is_page ( wc_get_page_id ( 'checkout' ) ) && empty ( $wp -> query_vars [ 'order-pay' ] ) && ! isset ( $wp -> query_vars [ 'order-received' ] ) ? 1 : 0 ,
2015-05-15 12:51:51 +00:00
'debug_mode' => defined ( 'WP_DEBUG' ) && WP_DEBUG ,
'i18n_checkout_error' => esc_attr__ ( 'Error processing checkout. Please try again.' , 'woocommerce' ),
2014-09-24 09:57:39 +00:00
);
break ;
case 'wc-address-i18n' :
return array (
'locale' => json_encode ( WC () -> countries -> get_country_locale () ),
'locale_fields' => json_encode ( WC () -> countries -> get_country_locale_field_selectors () ),
'i18n_required_text' => esc_attr__ ( 'required' , 'woocommerce' ),
);
break ;
case 'wc-cart' :
return array (
'ajax_url' => WC () -> ajax_url (),
2015-07-27 10:56:07 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " ),
2014-09-24 09:57:39 +00:00
'update_shipping_method_nonce' => wp_create_nonce ( " update-shipping-method " ),
2016-02-11 06:26:41 +00:00
'apply_coupon_nonce' => wp_create_nonce ( " apply-coupon " ),
2016-02-11 19:55:34 +00:00
'remove_coupon_nonce' => wp_create_nonce ( " remove-coupon " ),
2014-09-24 09:57:39 +00:00
);
break ;
case 'wc-cart-fragments' :
return array (
'ajax_url' => WC () -> ajax_url (),
2015-07-27 10:56:07 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " ),
2014-09-24 09:57:39 +00:00
'fragment_name' => apply_filters ( 'woocommerce_cart_fragment_name' , 'wc_fragments' )
);
break ;
case 'wc-add-to-cart' :
return array (
'ajax_url' => WC () -> ajax_url (),
2015-07-27 10:56:07 +00:00
'wc_ajax_url' => WC_AJAX :: get_endpoint ( " %%endpoint%% " ),
2014-09-24 09:57:39 +00:00
'i18n_view_cart' => esc_attr__ ( 'View Cart' , 'woocommerce' ),
2015-10-28 17:56:31 +00:00
'cart_url' => apply_filters ( 'woocommerce_add_to_cart_redirect' , wc_get_cart_url () ),
2014-09-24 09:57:39 +00:00
'is_cart' => is_cart (),
'cart_redirect_after_add' => get_option ( 'woocommerce_cart_redirect_after_add' )
);
break ;
case 'wc-add-to-cart-variation' :
2015-12-04 14:28:32 +00:00
// We also need the wp.template for this script :)
wc_get_template ( 'single-product/add-to-cart/variation.php' );
2014-09-24 09:57:39 +00:00
return array (
'i18n_no_matching_variations_text' => esc_attr__ ( 'Sorry, no products matched your selection. Please choose a different combination.' , 'woocommerce' ),
2016-02-08 16:21:02 +00:00
'i18n_make_a_selection_text' => esc_attr__ ( 'Please select some product options before adding this product to your cart.' , 'woocommerce' ),
2015-12-04 14:28:32 +00:00
'i18n_unavailable_text' => esc_attr__ ( 'Sorry, this product is unavailable. Please choose a different combination.' , 'woocommerce' )
2014-09-24 09:57:39 +00:00
);
break ;
case 'wc-country-select' :
return array (
2016-01-27 10:53:59 +00:00
'countries' => json_encode ( array_merge ( WC () -> countries -> get_allowed_country_states (), WC () -> countries -> get_shipping_country_states () ) ),
'i18n_select_state_text' => esc_attr__ ( 'Select an option…' , 'woocommerce' ),
2015-03-03 10:58:06 +00:00
'i18n_matches_1' => _x ( 'One result is available, press enter to select it.' , 'enhanced select' , 'woocommerce' ),
'i18n_matches_n' => _x ( '%qty% results are available, use up and down arrow keys to navigate.' , 'enhanced select' , 'woocommerce' ),
'i18n_no_matches' => _x ( 'No matches found' , 'enhanced select' , 'woocommerce' ),
'i18n_ajax_error' => _x ( 'Loading failed' , 'enhanced select' , 'woocommerce' ),
'i18n_input_too_short_1' => _x ( 'Please enter 1 or more characters' , 'enhanced select' , 'woocommerce' ),
'i18n_input_too_short_n' => _x ( 'Please enter %qty% or more characters' , 'enhanced select' , 'woocommerce' ),
'i18n_input_too_long_1' => _x ( 'Please delete 1 character' , 'enhanced select' , 'woocommerce' ),
'i18n_input_too_long_n' => _x ( 'Please delete %qty% characters' , 'enhanced select' , 'woocommerce' ),
'i18n_selection_too_long_1' => _x ( 'You can only select 1 item' , 'enhanced select' , 'woocommerce' ),
'i18n_selection_too_long_n' => _x ( 'You can only select %qty% items' , 'enhanced select' , 'woocommerce' ),
'i18n_load_more' => _x ( 'Loading more results…' , 'enhanced select' , 'woocommerce' ),
'i18n_searching' => _x ( 'Searching…' , 'enhanced select' , 'woocommerce' ),
2014-09-24 09:57:39 +00:00
);
break ;
2016-01-27 10:53:59 +00:00
case 'wc-password-strength-meter' :
2016-01-28 15:36:24 +00:00
return array (
'min_password_strength' => apply_filters ( 'woocommerce_min_password_strength' , 3 ),
'i18n_password_error' => esc_attr__ ( 'Please enter a stronger password.' , 'woocommerce' ),
'i18n_password_hint' => esc_attr__ ( 'The password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers and symbols like ! " ? $ % ^ & ).' , 'woocommerce' )
);
2016-01-27 10:53:59 +00:00
break ;
2013-06-06 13:20:47 +00:00
}
2014-09-24 09:57:39 +00:00
return false ;
2013-06-06 13:20:47 +00:00
}
2013-08-02 11:06:32 +00:00
/**
2014-09-24 09:57:39 +00:00
* Localize scripts only when enqueued .
2013-08-02 11:06:32 +00:00
*/
2014-09-24 09:57:39 +00:00
public static function localize_printed_scripts () {
foreach ( self :: $scripts as $handle ) {
self :: localize_script ( $handle );
2013-08-02 11:06:32 +00:00
}
}
2013-06-11 12:31:41 +00:00
}
2014-05-28 13:52:50 +00:00
WC_Frontend_Scripts :: init ();