2018-02-13 19:03:53 +00:00
< ? php
/**
* Plugin Name : WooCommerce Gutenberg Products Block
* Plugin URI : https :// github . com / woocommerce / woocommerce - gutenberg - products - block
2018-04-20 17:17:55 +00:00
* Description : WooCommerce Products block for the Gutenberg editor .
2018-09-07 15:51:45 +00:00
* Version : 1.1 . 2
2018-02-13 19:03:53 +00:00
* Author : Automattic
* Author URI : https :// woocommerce . com
2018-04-20 17:17:55 +00:00
* Text Domain : woocommerce
* Domain Path : / languages
2018-06-06 16:08:17 +00:00
* WC requires at least : 3.3
2018-11-21 15:56:05 +00:00
* WC tested up to : 3.5
2018-02-13 19:03:53 +00:00
*/
defined ( 'ABSPATH' ) || die ();
2018-09-07 15:51:45 +00:00
define ( 'WGPB_VERSION' , '1.1.2' );
2018-04-19 16:53:21 +00:00
2018-11-13 19:12:32 +00:00
define ( 'WGPB_DEVELOPMENT_MODE' , true );
2018-02-15 17:42:24 +00:00
/**
* Load up the assets if Gutenberg is active .
*/
2018-02-13 19:03:53 +00:00
function wgpb_initialize () {
2018-11-13 19:12:32 +00:00
$files_exist = file_exists ( plugin_dir_path ( __FILE__ ) . '/build/products-block.js' );
2018-02-13 19:03:53 +00:00
2018-11-13 19:12:32 +00:00
if ( $files_exist && function_exists ( 'register_block_type' ) ) {
2018-02-13 19:03:53 +00:00
add_action ( 'init' , 'wgpb_register_products_block' );
2018-11-13 19:12:32 +00:00
add_action ( 'enqueue_block_editor_assets' , 'wgpb_extra_gutenberg_scripts' );
}
2018-11-19 16:33:17 +00:00
2018-11-13 19:12:32 +00:00
if ( defined ( 'WGPB_DEVELOPMENT_MODE' ) && WGPB_DEVELOPMENT_MODE && ! $files_exist ) {
add_action ( 'admin_notices' , 'wgpb_plugins_notice' );
2018-02-13 19:03:53 +00:00
}
2018-11-27 17:12:48 +00:00
add_action ( 'rest_api_init' , 'wgpb_register_api_routes' );
2018-02-13 19:03:53 +00:00
}
add_action ( 'woocommerce_loaded' , 'wgpb_initialize' );
2018-11-13 19:12:32 +00:00
/**
* Display a warning about building files .
*/
function wgpb_plugins_notice () {
echo '<div class="error"><p>' ;
echo __ ( 'WooCommerce Product Blocks development mode requires files to be built. From the plugin directory, run <code>npm install</code> to install dependencies, <code>npm run build</code> to build the files or <code>npm start</code> to build the files and watch for changes.' , 'woocommerce' );
echo '</p></div>' ;
}
2018-02-13 19:03:53 +00:00
/**
* Register the Products block and its scripts .
*/
function wgpb_register_products_block () {
2018-06-01 16:35:46 +00:00
register_block_type ( 'woocommerce/products' , array (
'editor_script' => 'woocommerce-products-block-editor' ,
'editor_style' => 'woocommerce-products-block-editor' ,
) );
}
/**
* Register extra scripts needed .
*/
function wgpb_extra_gutenberg_scripts () {
2018-08-22 17:28:39 +00:00
if ( ! function_exists ( 'wc_get_theme_support' ) ) {
return ;
}
2018-11-13 19:12:32 +00:00
// @todo Remove this dependency (as it adds a separate react instance).
2018-06-01 16:35:46 +00:00
wp_enqueue_script (
'react-transition-group' ,
plugins_url ( 'assets/js/vendor/react-transition-group.js' , __FILE__ ),
2018-11-13 15:48:13 +00:00
array (),
2018-11-19 16:33:17 +00:00
'2.2.1' ,
true
);
wp_register_script (
'woocommerce-products-category-block' ,
plugins_url ( 'build/product-category-block.js' , __FILE__ ),
2018-11-27 17:13:16 +00:00
array (
'wp-api-fetch' ,
'wp-blocks' ,
'wp-components' ,
'wp-compose' ,
'wp-data' ,
'wp-element' ,
'wp-editor' ,
'wp-i18n' ,
'wp-url' ,
'lodash' ,
),
2018-11-19 16:33:17 +00:00
defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? filemtime ( plugin_dir_path ( __FILE__ ) . '/build/product-category-block.js' ) : WGPB_VERSION ,
true
2018-06-01 16:35:46 +00:00
);
2018-02-13 19:03:53 +00:00
wp_register_script (
'woocommerce-products-block-editor' ,
2018-11-13 19:12:32 +00:00
plugins_url ( 'build/products-block.js' , __FILE__ ),
array ( 'wp-api-fetch' , 'wp-element' , 'wp-components' , 'wp-blocks' , 'wp-editor' , 'wp-i18n' , 'react-transition-group' ),
2018-11-19 16:33:17 +00:00
defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? filemtime ( plugin_dir_path ( __FILE__ ) . '/build/products-block.js' ) : WGPB_VERSION ,
true
2018-02-13 19:03:53 +00:00
);
2018-03-09 19:45:53 +00:00
$product_block_data = array (
2018-03-09 19:04:01 +00:00
'min_columns' => wc_get_theme_support ( 'product_grid::min_columns' , 1 ),
'max_columns' => wc_get_theme_support ( 'product_grid::max_columns' , 6 ),
'default_columns' => wc_get_default_products_per_row (),
2018-04-03 17:26:56 +00:00
'min_rows' => wc_get_theme_support ( 'product_grid::min_rows' , 1 ),
'max_rows' => wc_get_theme_support ( 'product_grid::max_rows' , 6 ),
'default_rows' => wc_get_default_product_rows_per_page (),
2018-03-09 19:04:01 +00:00
);
2018-03-09 19:45:53 +00:00
wp_localize_script ( 'woocommerce-products-block-editor' , 'wc_product_block_data' , $product_block_data );
2018-03-09 19:04:01 +00:00
2018-11-21 21:10:16 +00:00
if ( function_exists ( 'wp_set_script_translations' ) ) {
wp_set_script_translations ( 'woocommerce-products-category-block' , 'woocommerce' );
}
2018-11-19 16:33:17 +00:00
2018-06-01 16:35:46 +00:00
wp_enqueue_script ( 'woocommerce-products-block-editor' );
2018-11-19 16:33:17 +00:00
wp_enqueue_script ( 'woocommerce-products-category-block' );
2018-06-01 16:35:46 +00:00
wp_enqueue_style (
2018-02-13 19:03:53 +00:00
'woocommerce-products-block-editor' ,
2018-11-13 19:12:32 +00:00
plugins_url ( 'build/products-block.css' , __FILE__ ),
2018-02-13 19:03:53 +00:00
array ( 'wp-edit-blocks' ),
2018-11-13 19:12:32 +00:00
defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? filemtime ( plugin_dir_path ( __FILE__ ) . '/build/products-block.css' ) : WGPB_VERSION
2018-02-13 19:03:53 +00:00
);
2018-11-19 16:33:17 +00:00
wp_enqueue_style (
'woocommerce-products-category-block' ,
plugins_url ( 'build/product-category-block.css' , __FILE__ ),
array ( 'wp-edit-blocks' ),
defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? filemtime ( plugin_dir_path ( __FILE__ ) . '/build/product-category-block.css' ) : WGPB_VERSION
);
}
/**
* Output the wcSettings global before printing any script tags .
*/
function wgpb_print_script_settings () {
$code = get_woocommerce_currency ();
// Settings and variables can be passed here for access in the app.
$settings = array (
'adminUrl' => admin_url (),
'wcAssetUrl' => plugins_url ( 'assets/' , WC_PLUGIN_FILE ),
'siteLocale' => esc_attr ( get_bloginfo ( 'language' ) ),
'currency' => array (
'code' => $code ,
'precision' => wc_get_price_decimals (),
'symbol' => get_woocommerce_currency_symbol ( $code ),
),
'date' => array (
'dow' => get_option ( 'start_of_week' , 0 ),
),
);
?>
< script type = " text/javascript " >
var wcSettings = < ? php echo json_encode ( $settings ); ?> ;
</ script >
< ? php
2018-02-22 18:48:34 +00:00
}
2018-11-19 16:33:17 +00:00
add_action ( 'admin_print_footer_scripts' , 'wgpb_print_script_settings' , 1 );
2018-04-19 16:53:21 +00:00
2018-06-01 17:22:58 +00:00
/**
2018-11-30 19:12:56 +00:00
* Register extra API routes with functionality specific for product blocks .
2018-06-01 17:22:58 +00:00
*/
function wgpb_register_api_routes () {
2018-11-30 19:12:56 +00:00
include_once dirname ( __FILE__ ) . '/includes/class-wgpb-products-controller.php' ;
include_once dirname ( __FILE__ ) . '/includes/class-wgpb-product-categories-controller.php' ;
include_once dirname ( __FILE__ ) . '/includes/class-wgpb-product-attributes-controller.php' ;
include_once dirname ( __FILE__ ) . '/includes/class-wgpb-product-attribute-terms-controller.php' ;
$products = new WGPB_Products_Controller ();
$products -> register_routes ();
$categories = new WGPB_Product_Categories_Controller ();
$categories -> register_routes ();
$attributes = new WGPB_Product_Attributes_Controller ();
$attributes -> register_routes ();
$attribute_terms = new WGPB_Product_Attribute_Terms_Controller ();
$attribute_terms -> register_routes ();
2018-06-01 17:22:58 +00:00
}
2018-04-19 16:53:21 +00:00
/**
* Brings some extra required shortcode features from WC core 3.4 + to this feature plugin .
*
* @ todo Remove this function when merging into core because it won ' t be necessary .
*
* @ param array $args WP_Query args .
* @ param array $attributes Shortcode attributes .
* @ param string $type Type of shortcode currently processing .
*/
function wgpb_extra_shortcode_features ( $args , $attributes , $type ) {
if ( 'products' !== $type ) {
return $args ;
}
// Enable term ids in the category shortcode.
if ( ! empty ( $attributes [ 'category' ] ) ) {
$categories = array_map ( 'sanitize_title' , explode ( ',' , $attributes [ 'category' ] ) );
$field = 'slug' ;
if ( empty ( $args [ 'tax_query' ] ) ) {
$args [ 'tax_query' ] = array ();
}
// Unset old category tax query.
foreach ( $args [ 'tax_query' ] as $index => $tax_query ) {
if ( 'product_cat' === $tax_query [ 'taxonomy' ] ) {
unset ( $args [ 'tax_query' ][ $index ] );
}
}
if ( is_numeric ( $categories [ 0 ] ) ) {
$categories = array_map ( 'absint' , $categories );
$field = 'term_id' ;
}
$args [ 'tax_query' ][] = array (
'taxonomy' => 'product_cat' ,
'terms' => $categories ,
'field' => $field ,
'operator' => $attributes [ 'cat_operator' ],
);
}
// Enable term ids in the attributes shortcode and just-attribute queries.
if ( ! empty ( $attributes [ 'attribute' ] ) || ! empty ( $attributes [ 'terms' ] ) ) {
$taxonomy = strstr ( $attributes [ 'attribute' ], 'pa_' ) ? sanitize_title ( $attributes [ 'attribute' ] ) : 'pa_' . sanitize_title ( $attributes [ 'attribute' ] );
$terms = $attributes [ 'terms' ] ? array_map ( 'sanitize_title' , explode ( ',' , $attributes [ 'terms' ] ) ) : array ();
$field = 'slug' ;
if ( empty ( $args [ 'tax_query' ] ) ) {
$args [ 'tax_query' ] = array ();
}
// Unset old attribute tax query.
foreach ( $args [ 'tax_query' ] as $index => $tax_query ) {
if ( $taxonomy === $tax_query [ 'taxonomy' ] ) {
unset ( $args [ 'tax_query' ][ $index ] );
}
}
if ( $terms && is_numeric ( $terms [ 0 ] ) ) {
$terms = array_map ( 'absint' , $terms );
$field = 'term_id' ;
}
// If no terms were specified get all products that are in the attribute taxonomy.
if ( ! $terms ) {
$terms = get_terms (
array (
'taxonomy' => $taxonomy ,
'fields' => 'ids' ,
)
);
$field = 'term_id' ;
}
$args [ 'tax_query' ][] = array (
'taxonomy' => $taxonomy ,
'terms' => $terms ,
'field' => $field ,
'operator' => $attributes [ 'terms_operator' ],
);
}
return $args ;
}
2018-11-19 16:33:17 +00:00
add_filter ( 'woocommerce_shortcode_products_query' , 'wgpb_extra_shortcode_features' , 10 , 3 );