This repository has been archived by the owner on Feb 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 217
Product Query: Add product visibility query support #7951
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
89eb0a3
add visibility query to make ProductQuery queries align with WC core
dinhtungdu 8882371
break the big early return condition to improve readability
dinhtungdu 9f3058a
update unit test, fix wrong array comparison
dinhtungdu 81646d0
return earlier
dinhtungdu dce733c
typo
dinhtungdu b413fa5
Merge branch 'trunk' into fix/7746-stock-status-query
dinhtungdu 7162727
reset query var after test
dinhtungdu File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -127,8 +127,9 @@ public function update_rest_query( $args, $request ) { | |
$orderby_query = isset( $orderby ) ? $this->get_custom_orderby_query( $orderby ) : array(); | ||
$attributes_query = is_array( $woo_attributes ) ? $this->get_product_attributes_query( $woo_attributes ) : array(); | ||
$stock_query = is_array( $woo_stock_status ) ? $this->get_stock_status_query( $woo_stock_status ) : array(); | ||
$visibility_query = $this->get_product_visibility_query( $stock_query ); | ||
|
||
return array_merge( $args, $on_sale_query, $orderby_query, $attributes_query, $stock_query ); | ||
return array_merge( $args, $on_sale_query, $orderby_query, $attributes_query, $stock_query, $visibility_query ); | ||
} | ||
|
||
/** | ||
|
@@ -325,6 +326,34 @@ function ( $carry, $item ) { | |
* @return array | ||
*/ | ||
private function get_stock_status_query( $stock_statii ) { | ||
if ( ! is_array( $stock_statii ) ) { | ||
return array(); | ||
} | ||
|
||
$stock_status_options = array_keys( wc_get_product_stock_status_options() ); | ||
|
||
/** | ||
* If all available stock status are selected, we don't need to add the | ||
* meta query for stock status. | ||
*/ | ||
Comment on lines
+335
to
+338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for this comments! ❤️ |
||
if ( | ||
count( $stock_statii ) === count( $stock_status_options ) && | ||
array_diff( $stock_statii, $stock_status_options ) === array_diff( $stock_status_options, $stock_statii ) | ||
) { | ||
return array(); | ||
} | ||
|
||
/** | ||
* If all stock statuses are selected except 'outofstock', we use the | ||
* product visibility query to filter out out of stock products. | ||
* | ||
* @see get_product_visibility_query() | ||
*/ | ||
$diff = array_diff( $stock_status_options, $stock_statii ); | ||
if ( count( $diff ) === 1 && in_array( 'outofstock', $diff, true ) ) { | ||
return array(); | ||
} | ||
|
||
return array( | ||
'meta_query' => array( | ||
array( | ||
|
@@ -336,6 +365,34 @@ private function get_stock_status_query( $stock_statii ) { | |
); | ||
} | ||
|
||
/** | ||
* Return a query for product visibility depending on their stock status. | ||
* | ||
* @param array $stock_query Stock status query. | ||
* | ||
* @return array Tax query for product visibility. | ||
*/ | ||
private function get_product_visibility_query( $stock_query ) { | ||
$product_visibility_terms = wc_get_product_visibility_term_ids(); | ||
$product_visibility_not_in = array( is_search() ? $product_visibility_terms['exclude-from-search'] : $product_visibility_terms['exclude-from-catalog'] ); | ||
|
||
// Hide out of stock products. | ||
if ( empty( $stock_query ) && 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) { | ||
$product_visibility_not_in[] = $product_visibility_terms['outofstock']; | ||
} | ||
|
||
return array( | ||
'tax_query' => array( | ||
array( | ||
'taxonomy' => 'product_visibility', | ||
'field' => 'term_taxonomy_id', | ||
'terms' => $product_visibility_not_in, | ||
'operator' => 'NOT IN', | ||
), | ||
), | ||
); | ||
} | ||
|
||
/** | ||
* Set the query vars that are used by filter blocks. | ||
* | ||
|
@@ -439,11 +496,13 @@ private function get_queries_by_attributes( $parsed_block ) { | |
$on_sale_enabled = isset( $query['__woocommerceOnSale'] ) && true === $query['__woocommerceOnSale']; | ||
$attributes_query = isset( $query['__woocommerceAttributes'] ) ? $this->get_product_attributes_query( $query['__woocommerceAttributes'] ) : array(); | ||
$stock_query = isset( $query['__woocommerceStockStatus'] ) ? $this->get_stock_status_query( $query['__woocommerceStockStatus'] ) : array(); | ||
$visibility_query = $this->get_product_visibility_query( $stock_query ); | ||
|
||
return array( | ||
'on_sale' => ( $on_sale_enabled ? $this->get_on_sale_products_query() : array() ), | ||
'attributes' => $attributes_query, | ||
'stock_status' => $stock_query, | ||
'visibility' => $visibility_query, | ||
); | ||
} | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not a big deal, but should we return even earlier? We don't even need a call to
wc_get_product_stock_status_option
if the argument is not an array.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Absolutely!