2019-07-01 12:52:44 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Initializes block assets.
|
|
|
|
*
|
|
|
|
* @package WooCommerce/Blocks
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Automattic\WooCommerce\Blocks;
|
|
|
|
|
2020-04-14 22:44:31 +00:00
|
|
|
use Automattic\WooCommerce\Blocks\Assets\PaymentMethodAssets;
|
|
|
|
|
2019-07-01 12:52:44 +00:00
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Assets class.
|
|
|
|
*/
|
|
|
|
class Assets {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize class features on init.
|
2019-09-23 18:07:13 +00:00
|
|
|
*
|
2019-11-19 17:20:22 +00:00
|
|
|
* @since 2.5.0
|
2019-09-23 18:07:13 +00:00
|
|
|
* Moved most initialization to BootStrap and AssetDataRegistry
|
|
|
|
* classes as a part of ongoing refactor
|
2019-07-01 12:52:44 +00:00
|
|
|
*/
|
|
|
|
public static function init() {
|
|
|
|
add_action( 'init', array( __CLASS__, 'register_assets' ) );
|
|
|
|
add_action( 'body_class', array( __CLASS__, 'add_theme_body_class' ), 1 );
|
2019-09-23 18:07:13 +00:00
|
|
|
add_filter( 'woocommerce_shared_settings', array( __CLASS__, 'get_wc_block_data' ) );
|
2019-07-01 12:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Register block scripts & styles.
|
2019-09-23 18:07:13 +00:00
|
|
|
*
|
2019-11-19 17:20:22 +00:00
|
|
|
* @since 2.5.0
|
2019-09-23 18:07:13 +00:00
|
|
|
* Moved data related enqueuing to new AssetDataRegistry class
|
|
|
|
* as part of ongoing refactoring.
|
2019-07-01 12:52:44 +00:00
|
|
|
*/
|
|
|
|
public static function register_assets() {
|
2020-03-13 15:49:33 +00:00
|
|
|
self::register_style( 'wc-block-vendors-style', plugins_url( self::get_block_asset_build_path( 'vendors-style', 'css' ), __DIR__ ), [] );
|
2019-10-28 13:53:09 +00:00
|
|
|
self::register_style( 'wc-block-editor', plugins_url( self::get_block_asset_build_path( 'editor', 'css' ), __DIR__ ), array( 'wp-edit-blocks' ) );
|
2019-09-03 17:55:20 +00:00
|
|
|
wp_style_add_data( 'wc-block-editor', 'rtl', 'replace' );
|
2020-03-13 15:49:33 +00:00
|
|
|
self::register_style( 'wc-block-style', plugins_url( self::get_block_asset_build_path( 'style', 'css' ), __DIR__ ), array( 'wc-block-vendors-style' ) );
|
2019-09-03 17:55:20 +00:00
|
|
|
wp_style_add_data( 'wc-block-style', 'rtl', 'replace' );
|
2019-07-01 12:52:44 +00:00
|
|
|
|
|
|
|
// Shared libraries and components across all blocks.
|
2019-10-28 13:53:09 +00:00
|
|
|
self::register_script( 'wc-blocks-data-store', plugins_url( 'build/wc-blocks-data.js', __DIR__ ), [], false );
|
|
|
|
self::register_script( 'wc-blocks', plugins_url( self::get_block_asset_build_path( 'blocks' ), __DIR__ ), [], false );
|
|
|
|
self::register_script( 'wc-vendors', plugins_url( self::get_block_asset_build_path( 'vendors' ), __DIR__ ), [], false );
|
|
|
|
|
|
|
|
self::register_script( 'wc-blocks-registry', plugins_url( 'build/wc-blocks-registry.js', __DIR__ ), [], false );
|
2019-07-01 12:52:44 +00:00
|
|
|
|
|
|
|
// Individual blocks.
|
2019-10-28 13:53:09 +00:00
|
|
|
$block_dependencies = array( 'wc-vendors', 'wc-blocks' );
|
|
|
|
|
|
|
|
self::register_script( 'wc-handpicked-products', plugins_url( self::get_block_asset_build_path( 'handpicked-products' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-best-sellers', plugins_url( self::get_block_asset_build_path( 'product-best-sellers' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-category', plugins_url( self::get_block_asset_build_path( 'product-category' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-new', plugins_url( self::get_block_asset_build_path( 'product-new' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-on-sale', plugins_url( self::get_block_asset_build_path( 'product-on-sale' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-top-rated', plugins_url( self::get_block_asset_build_path( 'product-top-rated' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-products-by-attribute', plugins_url( self::get_block_asset_build_path( 'products-by-attribute' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-featured-product', plugins_url( self::get_block_asset_build_path( 'featured-product' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-featured-category', plugins_url( self::get_block_asset_build_path( 'featured-category' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-categories', plugins_url( self::get_block_asset_build_path( 'product-categories' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-tag', plugins_url( self::get_block_asset_build_path( 'product-tag' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-all-reviews', plugins_url( self::get_block_asset_build_path( 'all-reviews' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-reviews-by-product', plugins_url( self::get_block_asset_build_path( 'reviews-by-product' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-reviews-by-category', plugins_url( self::get_block_asset_build_path( 'reviews-by-category' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-product-search', plugins_url( self::get_block_asset_build_path( 'product-search' ), __DIR__ ), $block_dependencies );
|
|
|
|
self::register_script( 'wc-all-products', plugins_url( self::get_block_asset_build_path( 'all-products' ), __DIR__ ), $block_dependencies );
|
2019-11-01 13:56:14 +00:00
|
|
|
self::register_script( 'wc-price-filter', plugins_url( self::get_block_asset_build_path( 'price-filter' ), __DIR__ ), $block_dependencies );
|
2019-11-11 10:32:56 +00:00
|
|
|
self::register_script( 'wc-attribute-filter', plugins_url( self::get_block_asset_build_path( 'attribute-filter' ), __DIR__ ), $block_dependencies );
|
2019-11-15 14:41:23 +00:00
|
|
|
self::register_script( 'wc-active-filters', plugins_url( self::get_block_asset_build_path( 'active-filters' ), __DIR__ ), $block_dependencies );
|
2020-04-20 14:55:59 +00:00
|
|
|
$payment_method_handles = Package::container()->get( PaymentMethodAssets::class )->get_all_registered_payment_method_script_handles();
|
|
|
|
self::register_script( 'wc-checkout-block', plugins_url( self::get_block_asset_build_path( 'checkout' ), __DIR__ ), array_merge( $block_dependencies, $payment_method_handles ) );
|
|
|
|
self::register_script( 'wc-cart-block', plugins_url( self::get_block_asset_build_path( 'cart' ), __DIR__ ), $block_dependencies );
|
2019-08-27 15:25:32 +00:00
|
|
|
}
|
2019-08-22 20:56:47 +00:00
|
|
|
|
2019-07-01 12:52:44 +00:00
|
|
|
/**
|
|
|
|
* Add body classes.
|
|
|
|
*
|
|
|
|
* @param array $classes Array of CSS classnames.
|
|
|
|
* @return array Modified array of CSS classnames.
|
|
|
|
*/
|
2019-08-27 15:25:32 +00:00
|
|
|
public static function add_theme_body_class( $classes = [] ) {
|
2019-07-01 12:52:44 +00:00
|
|
|
$classes[] = 'theme-' . get_template();
|
|
|
|
return $classes;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-09-02 10:10:47 +00:00
|
|
|
* Returns block-related data for enqueued wc-block-settings script.
|
2019-07-01 12:52:44 +00:00
|
|
|
*
|
|
|
|
* This is used to map site settings & data into JS-accessible variables.
|
|
|
|
*
|
2019-09-23 18:07:13 +00:00
|
|
|
* @param array $settings The original settings array from the filter.
|
|
|
|
*
|
2019-08-22 20:56:47 +00:00
|
|
|
* @since 2.4.0
|
2019-11-19 17:20:22 +00:00
|
|
|
* @since 2.5.0 returned merged data along with incoming $settings
|
2019-07-01 12:52:44 +00:00
|
|
|
*/
|
2019-09-23 18:07:13 +00:00
|
|
|
public static function get_wc_block_data( $settings ) {
|
2019-10-16 12:02:43 +00:00
|
|
|
$tag_count = wp_count_terms( 'product_tag' );
|
|
|
|
$product_counts = wp_count_posts( 'product' );
|
2020-03-06 12:20:17 +00:00
|
|
|
$page_ids = [
|
|
|
|
'shop' => wc_get_page_id( 'shop' ),
|
2020-03-16 16:38:24 +00:00
|
|
|
'cart' => wc_get_page_id( 'cart' ),
|
2020-03-06 12:20:17 +00:00
|
|
|
'checkout' => wc_get_page_id( 'checkout' ),
|
|
|
|
'privacy' => wc_privacy_policy_page_id(),
|
|
|
|
'terms' => wc_terms_and_conditions_page_id(),
|
|
|
|
];
|
2019-07-01 12:52:44 +00:00
|
|
|
|
|
|
|
// Global settings used in each block.
|
2019-09-23 18:07:13 +00:00
|
|
|
return array_merge(
|
|
|
|
$settings,
|
|
|
|
[
|
2020-03-06 11:43:40 +00:00
|
|
|
'currentUserIsAdmin' => is_user_logged_in() && current_user_can( 'manage_woocommerce' ),
|
2020-03-03 10:12:18 +00:00
|
|
|
'min_columns' => wc_get_theme_support( 'product_blocks::min_columns', 1 ),
|
|
|
|
'max_columns' => wc_get_theme_support( 'product_blocks::max_columns', 6 ),
|
|
|
|
'default_columns' => wc_get_theme_support( 'product_blocks::default_columns', 3 ),
|
|
|
|
'min_rows' => wc_get_theme_support( 'product_blocks::min_rows', 1 ),
|
|
|
|
'max_rows' => wc_get_theme_support( 'product_blocks::max_rows', 6 ),
|
|
|
|
'default_rows' => wc_get_theme_support( 'product_blocks::default_rows', 3 ),
|
|
|
|
'thumbnail_size' => wc_get_theme_support( 'thumbnail_image_width', 300 ),
|
|
|
|
'placeholderImgSrc' => wc_placeholder_img_src(),
|
|
|
|
'min_height' => wc_get_theme_support( 'featured_block::min_height', 500 ),
|
|
|
|
'default_height' => wc_get_theme_support( 'featured_block::default_height', 500 ),
|
|
|
|
'isLargeCatalog' => $product_counts->publish > 100,
|
|
|
|
'limitTags' => $tag_count > 100,
|
|
|
|
'hasTags' => $tag_count > 0,
|
2020-04-22 13:16:17 +00:00
|
|
|
'taxesEnabled' => wc_tax_enabled(),
|
2020-03-03 10:12:18 +00:00
|
|
|
'couponsEnabled' => wc_coupons_enabled(),
|
|
|
|
'shippingEnabled' => wc_shipping_enabled(),
|
|
|
|
'displayShopPricesIncludingTax' => 'incl' === get_option( 'woocommerce_tax_display_shop' ),
|
|
|
|
'displayCartPricesIncludingTax' => 'incl' === get_option( 'woocommerce_tax_display_cart' ),
|
|
|
|
'showAvatars' => '1' === get_option( 'show_avatars' ),
|
|
|
|
'reviewRatingsEnabled' => wc_review_ratings_enabled(),
|
|
|
|
'productCount' => array_sum( (array) $product_counts ),
|
|
|
|
'attributes' => array_values( wc_get_attribute_taxonomies() ),
|
|
|
|
'isShippingCalculatorEnabled' => filter_var( get_option( 'woocommerce_enable_shipping_calc' ), FILTER_VALIDATE_BOOLEAN ),
|
|
|
|
'isShippingCostHidden' => filter_var( get_option( 'woocommerce_shipping_cost_requires_address' ), FILTER_VALIDATE_BOOLEAN ),
|
|
|
|
'wcBlocksAssetUrl' => plugins_url( 'assets/', __DIR__ ),
|
|
|
|
'restApiRoutes' => [
|
2019-11-23 16:29:35 +00:00
|
|
|
'/wc/store' => array_keys( \Automattic\WooCommerce\Blocks\RestApi::get_routes_from_namespace( 'wc/store' ) ),
|
|
|
|
],
|
2020-03-19 11:50:51 +00:00
|
|
|
'storeApiNonce' => wp_create_nonce( 'wc_store_api' ),
|
2020-03-06 12:20:17 +00:00
|
|
|
'homeUrl' => esc_url( home_url( '/' ) ),
|
|
|
|
'storePages' => [
|
2020-03-16 16:38:24 +00:00
|
|
|
'shop' => self::format_page_resource( $page_ids['shop'] ),
|
|
|
|
'cart' => self::format_page_resource( $page_ids['cart'] ),
|
|
|
|
'checkout' => self::format_page_resource( $page_ids['checkout'] ),
|
|
|
|
'privacy' => self::format_page_resource( $page_ids['privacy'] ),
|
|
|
|
'terms' => self::format_page_resource( $page_ids['terms'] ),
|
2020-03-06 12:20:17 +00:00
|
|
|
],
|
2019-09-23 18:07:13 +00:00
|
|
|
]
|
2019-07-01 12:52:44 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-03-16 16:38:24 +00:00
|
|
|
/**
|
|
|
|
* Format a page object into a standard array of data.
|
|
|
|
*
|
|
|
|
* @param WP_Post|int $page Page object or ID.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected static function format_page_resource( $page ) {
|
|
|
|
if ( is_numeric( $page ) ) {
|
|
|
|
$page = get_post( $page );
|
|
|
|
}
|
|
|
|
if ( ! $page ) {
|
|
|
|
return [
|
|
|
|
'id' => 0,
|
|
|
|
'title' => '',
|
|
|
|
'permalink' => false,
|
|
|
|
];
|
|
|
|
}
|
|
|
|
return [
|
|
|
|
'id' => $page->ID,
|
|
|
|
'title' => $page->post_title,
|
|
|
|
'permalink' => get_permalink( $page->ID ),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2019-07-01 12:52:44 +00:00
|
|
|
/**
|
|
|
|
* Get the file modified time as a cache buster if we're in dev mode.
|
|
|
|
*
|
|
|
|
* @param string $file Local path to the file.
|
|
|
|
* @return string The cache buster value to use for the given file.
|
|
|
|
*/
|
|
|
|
protected static function get_file_version( $file ) {
|
2019-10-28 13:53:09 +00:00
|
|
|
if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG && file_exists( \Automattic\WooCommerce\Blocks\Package::get_path() . $file ) ) {
|
|
|
|
return filemtime( \Automattic\WooCommerce\Blocks\Package::get_path() . $file );
|
2019-07-01 12:52:44 +00:00
|
|
|
}
|
2019-07-22 15:20:51 +00:00
|
|
|
return \Automattic\WooCommerce\Blocks\Package::get_version();
|
2019-07-01 12:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers a script according to `wp_register_script`, additionally loading the translations for the file.
|
|
|
|
*
|
|
|
|
* @since 2.0.0
|
|
|
|
*
|
2019-12-10 17:17:46 +00:00
|
|
|
* @param string $handle Name of the script. Should be unique.
|
|
|
|
* @param string $src Full URL of the script, or path of the script relative to the WordPress root directory.
|
|
|
|
* @param array $dependencies Optional. An array of registered script handles this script depends on. Default empty array.
|
|
|
|
* @param bool $has_i18n Optional. Whether to add a script translation call to this file. Default 'true'.
|
2019-07-01 12:52:44 +00:00
|
|
|
*/
|
2019-12-10 17:17:46 +00:00
|
|
|
protected static function register_script( $handle, $src, $dependencies = [], $has_i18n = true ) {
|
2019-11-23 16:28:54 +00:00
|
|
|
$relative_src = str_replace( plugins_url( '/', __DIR__ ), '', $src );
|
2019-12-10 17:17:46 +00:00
|
|
|
$asset_path = dirname( __DIR__ ) . '/' . str_replace( '.js', '.asset.php', $relative_src );
|
|
|
|
|
|
|
|
if ( file_exists( $asset_path ) ) {
|
|
|
|
$asset = require $asset_path;
|
|
|
|
$dependencies = isset( $asset['dependencies'] ) ? array_merge( $asset['dependencies'], $dependencies ) : $dependencies;
|
|
|
|
$version = ! empty( $asset['version'] ) ? $asset['version'] : self::get_file_version( $relative_src );
|
|
|
|
} else {
|
|
|
|
$version = self::get_file_version( $relative_src );
|
|
|
|
}
|
|
|
|
|
|
|
|
wp_register_script( $handle, $src, $dependencies, $version, true );
|
2019-07-01 12:52:44 +00:00
|
|
|
|
|
|
|
if ( $has_i18n && function_exists( 'wp_set_script_translations' ) ) {
|
|
|
|
wp_set_script_translations( $handle, 'woo-gutenberg-products-block', dirname( __DIR__ ) . '/languages' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-22 09:36:51 +00:00
|
|
|
/**
|
2019-07-29 10:46:15 +00:00
|
|
|
* Queues a block script.
|
2019-07-22 09:36:51 +00:00
|
|
|
*
|
|
|
|
* @since 2.3.0
|
2019-12-11 09:18:00 +00:00
|
|
|
* @since $VID:$ Changed $name to $script_name and added $handle argument.
|
2019-07-22 09:36:51 +00:00
|
|
|
*
|
2020-01-10 14:37:27 +00:00
|
|
|
* @param string $script_name Name of the script used to identify the file inside build folder.
|
|
|
|
* @param string $handle Optional. Provided if the handle should be different than the script name. `wc-` prefix automatically added.
|
|
|
|
* @param array $dependencies Optional. An array of registered script handles this script depends on. Default empty array.
|
2019-07-22 09:36:51 +00:00
|
|
|
*/
|
2020-01-10 14:37:27 +00:00
|
|
|
public static function register_block_script( $script_name, $handle = '', $dependencies = [] ) {
|
2019-12-11 09:18:00 +00:00
|
|
|
$handle = '' !== $handle ? $handle : $script_name;
|
2020-01-10 14:37:27 +00:00
|
|
|
self::register_script( 'wc-' . $handle, plugins_url( self::get_block_asset_build_path( $script_name ), __DIR__ ), $dependencies );
|
2019-12-11 09:18:00 +00:00
|
|
|
wp_enqueue_script( 'wc-' . $handle );
|
2019-07-22 09:36:51 +00:00
|
|
|
}
|
|
|
|
|
2019-07-01 12:52:44 +00:00
|
|
|
/**
|
|
|
|
* Registers a style according to `wp_register_style`.
|
|
|
|
*
|
|
|
|
* @since 2.0.0
|
|
|
|
*
|
|
|
|
* @param string $handle Name of the stylesheet. Should be unique.
|
|
|
|
* @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
|
|
|
|
* @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
|
|
|
|
* @param string $media Optional. The media for which this stylesheet has been defined. Default 'all'. Accepts media types like
|
|
|
|
* 'all', 'print' and 'screen', or media queries like '(orientation: portrait)' and '(max-width: 640px)'.
|
|
|
|
*/
|
2019-08-27 15:25:32 +00:00
|
|
|
protected static function register_style( $handle, $src, $deps = [], $media = 'all' ) {
|
2019-07-01 12:52:44 +00:00
|
|
|
$filename = str_replace( plugins_url( '/', __DIR__ ), '', $src );
|
|
|
|
$ver = self::get_file_version( $filename );
|
|
|
|
wp_register_style( $handle, $src, $deps, $ver, $media );
|
|
|
|
}
|
2019-10-28 13:53:09 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the appropriate asset path for loading either legacy builds or
|
|
|
|
* current builds.
|
|
|
|
*
|
|
|
|
* @param string $filename Filename for asset path (without extension).
|
|
|
|
* @param string $type File type (.css or .js).
|
|
|
|
*
|
|
|
|
* @return string The generated path.
|
|
|
|
*/
|
|
|
|
protected static function get_block_asset_build_path( $filename, $type = 'js' ) {
|
|
|
|
global $wp_version;
|
|
|
|
$suffix = version_compare( $wp_version, '5.2', '>' )
|
|
|
|
? ''
|
|
|
|
: '-legacy';
|
|
|
|
return "build/$filename$suffix.$type";
|
|
|
|
}
|
2019-07-01 12:52:44 +00:00
|
|
|
}
|