diff --git a/plugins/woocommerce-blocks/assets/js/products-block.js b/plugins/woocommerce-blocks/assets/js/products-block.js
index 067c52e7eb7..2208bd10a97 100644
--- a/plugins/woocommerce-blocks/assets/js/products-block.js
+++ b/plugins/woocommerce-blocks/assets/js/products-block.js
@@ -100,9 +100,8 @@ var _wp$components = wp.components,
Dropdown = _wp$components.Dropdown,
Dashicon = _wp$components.Dashicon,
RangeControl = _wp$components.RangeControl,
- Tooltip = _wp$components.Tooltip;
-var ToggleControl = InspectorControls.ToggleControl,
- SelectControl = InspectorControls.SelectControl;
+ Tooltip = _wp$components.Tooltip,
+ SelectControl = _wp$components.SelectControl;
/**
@@ -134,16 +133,6 @@ var PRODUCTS_BLOCK_DISPLAY_SETTINGS = {
description: '',
value: 'featured'
},
- 'best_sellers': {
- title: __('Best sellers'),
- description: '',
- value: 'best_sellers'
- },
- 'best_rated': {
- title: __('Best rated'),
- description: '',
- value: 'best_rated'
- },
'on_sale': {
title: __('On sale'),
description: '',
@@ -431,7 +420,7 @@ var ProductsBlockSettingsEditor = function (_React$Component3) {
var heading = null;
if (this.state.display) {
- var group_options = ['featured', 'best_sellers', 'best_rated', 'on_sale', 'attribute'];
+ var group_options = ['featured', 'on_sale', 'attribute'];
var should_group_expand = group_options.includes(this.state.display) ? this.state.display : '';
var menu_link = wp.element.createElement(
'button',
@@ -571,6 +560,7 @@ var ProductsBlockPreview = withAPIData(function (_ref) {
rows = attributes.rows,
display = attributes.display,
display_setting = attributes.display_setting,
+ orderby = attributes.orderby,
block_layout = attributes.block_layout;
@@ -591,14 +581,19 @@ var ProductsBlockPreview = withAPIData(function (_ref) {
}
} else if ('featured' === display) {
query.featured = 1;
- } else if ('best_sellers' === display) {
- // @todo Not possible in the API yet.
- } else if ('best_rated' === display) {
- // @todo Not possible in the API yet.
} else if ('on_sale' === display) {
query.on_sale = 1;
}
+ // @todo Add support for orderby by sales, rating, and random to the API.
+ if ('specific' !== display && ('title' === orderby || 'date' === orderby)) {
+ query.orderby = orderby;
+
+ if ('title' === orderby) {
+ query.order = 'asc';
+ }
+ }
+
var query_string = '?';
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
@@ -702,6 +697,14 @@ registerBlockType('woocommerce/products', {
default: []
},
+ /**
+ * How to order the products: 'date', 'popularity', 'rand', 'rating', 'title'.
+ */
+ orderby: {
+ type: 'string',
+ default: 'date'
+ },
+
/**
* Whether the block is in edit or preview mode.
*/
@@ -725,6 +728,7 @@ registerBlockType('woocommerce/products', {
columns = attributes.columns,
display = attributes.display,
display_setting = attributes.display_setting,
+ orderby = attributes.orderby,
edit_mode = attributes.edit_mode;
/**
@@ -749,6 +753,35 @@ registerBlockType('woocommerce/products', {
});
}
+ // Orderby settings don't make sense for specific-selected products display.
+ var orderControl = null;
+ if ('specific' !== display) {
+ orderControl = wp.element.createElement(SelectControl, {
+ key: 'query-panel-select',
+ label: __('Products Order'),
+ value: orderby,
+ options: [{
+ label: __('Newness'),
+ value: 'date'
+ }, {
+ label: __('Title'),
+ value: 'title'
+ }, {
+ label: __('Sales'),
+ value: 'popularity'
+ }, {
+ label: __('Rating'),
+ value: 'rating'
+ }, {
+ label: __('Random'),
+ value: 'rand'
+ }],
+ onChange: function onChange(value) {
+ return setAttributes({ orderby: value });
+ }
+ });
+ }
+
return wp.element.createElement(
InspectorControls,
{ key: 'inspector' },
@@ -766,7 +799,8 @@ registerBlockType('woocommerce/products', {
},
min: 1,
max: 6
- })
+ }),
+ orderControl
);
};
@@ -866,7 +900,8 @@ registerBlockType('woocommerce/products', {
rows = _props$attributes.rows,
columns = _props$attributes.columns,
display = _props$attributes.display,
- display_setting = _props$attributes.display_setting;
+ display_setting = _props$attributes.display_setting,
+ orderby = _props$attributes.orderby;
var shortcode_atts = new Map();
@@ -886,10 +921,6 @@ registerBlockType('woocommerce/products', {
shortcode_atts.set('category', display_setting.join(','));
} else if ('featured' === display) {
shortcode_atts.set('visibility', 'featured');
- } else if ('best_sellers' === display) {
- shortcode_atts.set('best_selling', '1');
- } else if ('best_rated' === display) {
- shortcode_atts.set('orderby', 'rating');
} else if ('on_sale' === display) {
shortcode_atts.set('on_sale', '1');
} else if ('attribute' === display) {
@@ -902,6 +933,10 @@ registerBlockType('woocommerce/products', {
}
}
+ if ('specific' !== display) {
+ shortcode_atts.set('orderby', orderby);
+ }
+
// Build the shortcode string out of the set shortcode attributes.
var shortcode = '[products';
var _iteratorNormalCompletion2 = true;
diff --git a/plugins/woocommerce-blocks/assets/js/products-block.jsx b/plugins/woocommerce-blocks/assets/js/products-block.jsx
index 68523c37ad9..6833a65171a 100644
--- a/plugins/woocommerce-blocks/assets/js/products-block.jsx
+++ b/plugins/woocommerce-blocks/assets/js/products-block.jsx
@@ -1,8 +1,7 @@
const { __ } = wp.i18n;
const { RawHTML } = wp.element;
const { registerBlockType, InspectorControls, BlockControls } = wp.blocks;
-const { Toolbar, withAPIData, Dropdown, Dashicon, RangeControl, Tooltip } = wp.components;
-const { ToggleControl, SelectControl } = InspectorControls;
+const { Toolbar, withAPIData, Dropdown, Dashicon, RangeControl, Tooltip, SelectControl } = wp.components;
import { ProductsSpecificSelect } from './views/specific-select.jsx';
import { ProductsCategorySelect } from './views/category-select.jsx';
@@ -37,16 +36,6 @@ const PRODUCTS_BLOCK_DISPLAY_SETTINGS = {
description: '',
value: 'featured',
},
- 'best_sellers' : {
- title: __( 'Best sellers' ),
- description: '',
- value: 'best_sellers',
- },
- 'best_rated' : {
- title: __( 'Best rated' ),
- description: '',
- value: 'best_rated',
- },
'on_sale' : {
title: __( 'On sale' ),
description: '',
@@ -259,7 +248,7 @@ class ProductsBlockSettingsEditor extends React.Component {
let heading = null;
if ( this.state.display ) {
- const group_options = [ 'featured', 'best_sellers', 'best_rated', 'on_sale', 'attribute' ];
+ const group_options = [ 'featured', 'on_sale', 'attribute' ];
let should_group_expand = group_options.includes( this.state.display ) ? this.state.display : '';
let menu_link = ;
@@ -340,7 +329,7 @@ class ProductPreview extends React.Component {
*/
const ProductsBlockPreview = withAPIData( ( { attributes } ) => {
- const { columns, rows, display, display_setting, block_layout } = attributes;
+ const { columns, rows, display, display_setting, orderby, block_layout } = attributes;
let query = {
per_page: ( 'list' === block_layout ) ? rows : rows * columns,
@@ -359,14 +348,19 @@ const ProductsBlockPreview = withAPIData( ( { attributes } ) => {
}
} else if ( 'featured' === display ) {
query.featured = 1;
- } else if ( 'best_sellers' === display ) {
- // @todo Not possible in the API yet.
- } else if ( 'best_rated' === display ) {
- // @todo Not possible in the API yet.
} else if ( 'on_sale' === display ) {
query.on_sale = 1;
}
+ // @todo Add support for orderby by sales, rating, and random to the API.
+ if ( 'specific' !== display && ( 'title' === orderby || 'date' === orderby ) ) {
+ query.orderby = orderby;
+
+ if ( 'title' === orderby ) {
+ query.order = 'asc';
+ }
+ }
+
let query_string = '?';
for ( const key of Object.keys( query ) ) {
query_string += key + '=' + query[ key ] + '&';
@@ -447,6 +441,14 @@ registerBlockType( 'woocommerce/products', {
default: [],
},
+ /**
+ * How to order the products: 'date', 'popularity', 'rand', 'rating', 'title'.
+ */
+ orderby: {
+ type: 'string',
+ default: 'date',
+ },
+
/**
* Whether the block is in edit or preview mode.
*/
@@ -461,7 +463,7 @@ registerBlockType( 'woocommerce/products', {
*/
edit( props ) {
const { attributes, className, focus, setAttributes, setFocus } = props;
- const { block_layout, rows, columns, display, display_setting, edit_mode } = attributes;
+ const { block_layout, rows, columns, display, display_setting, orderby, edit_mode } = attributes;
/**
* Get the components for the sidebar settings area that is rendered while focused on a Products block.
@@ -484,6 +486,41 @@ registerBlockType( 'woocommerce/products', {
);
}
+ // Orderby settings don't make sense for specific-selected products display.
+ let orderControl = null;
+ if ( 'specific' !== display ) {
+ orderControl = (
+ setAttributes( { orderby: value } ) }
+ />
+ );
+ }
+
return (
{ __( 'Layout' ) }
@@ -495,6 +532,7 @@ registerBlockType( 'woocommerce/products', {
min={ 1 }
max={ 6 }
/>
+ { orderControl }
);
};
@@ -590,7 +628,7 @@ registerBlockType( 'woocommerce/products', {
* @return string
*/
save( props ) {
- const { block_layout, rows, columns, display, display_setting } = props.attributes;
+ const { block_layout, rows, columns, display, display_setting, orderby } = props.attributes;
let shortcode_atts = new Map();
shortcode_atts.set( 'limit', 'grid' === block_layout ? rows * columns : rows );
@@ -609,10 +647,6 @@ registerBlockType( 'woocommerce/products', {
shortcode_atts.set( 'category', display_setting.join( ',' ) );
} else if ( 'featured' === display ) {
shortcode_atts.set( 'visibility', 'featured' );
- } else if ( 'best_sellers' === display ) {
- shortcode_atts.set( 'best_selling', '1' );
- } else if ( 'best_rated' === display ) {
- shortcode_atts.set( 'orderby', 'rating' );
} else if ( 'on_sale' === display ) {
shortcode_atts.set( 'on_sale', '1' );
} else if ( 'attribute' === display ) {
@@ -625,6 +659,10 @@ registerBlockType( 'woocommerce/products', {
}
}
+ if ( 'specific' !== display ) {
+ shortcode_atts.set( 'orderby', orderby );
+ }
+
// Build the shortcode string out of the set shortcode attributes.
let shortcode = '[products';
for ( let [key, value] of shortcode_atts ) {