Update stock and sku search query in API to use lookup table.

Lookup table was introduced in 3.6 and will improve performance for these 2 queries.
This commit is contained in:
Mike Jolley 2019-05-08 14:05:35 +01:00
parent 684c526d1e
commit f85b25f34d
1 changed files with 25 additions and 12 deletions

View File

@ -124,24 +124,24 @@ class WC_Admin_REST_Products_Controller extends WC_REST_Products_Controller {
$search = $wpdb->esc_like( $search ); $search = $wpdb->esc_like( $search );
$search = "'%" . $search . "%'"; $search = "'%" . $search . "%'";
$where .= " AND ({$wpdb->posts}.post_title LIKE {$search}"; $where .= " AND ({$wpdb->posts}.post_title LIKE {$search}";
$where .= wc_product_sku_enabled() ? ' OR ps_post_meta.meta_key = "_sku" AND ps_post_meta.meta_value LIKE ' . $search . ')' : ')'; $where .= wc_product_sku_enabled() ? ' OR wc_product_meta_lookup.sku LIKE ' . $search . ')' : ')';
} }
if ( $wp_query->get( 'low_in_stock' ) ) { if ( $wp_query->get( 'low_in_stock' ) ) {
$low_stock_amount = absint( max( get_option( 'woocommerce_notify_low_stock_amount' ), 1 ) ); $low_stock_amount = absint( max( get_option( 'woocommerce_notify_low_stock_amount' ), 1 ) );
$where .= " $where .= "
AND manage_stock_meta.meta_value = 'yes' AND wc_product_meta_lookup.stock_quantity IS NOT NULL
AND stock_meta.meta_value IS NOT NULL
AND ( AND (
( (
low_stock_amount_meta.meta_value > '' low_stock_amount_meta.meta_value > ''
AND CAST(stock_meta.meta_value AS SIGNED) <= CAST(stock_meta.meta_value AS SIGNED) AND wc_product_meta_lookup.stock_quantity <= CAST(low_stock_amount_meta.meta_value AS SIGNED)
) )
OR ( OR (
low_stock_amount_meta.meta_value <= '' (
AND CAST(stock_meta.meta_value AS SIGNED) <= {$low_stock_amount} low_stock_amount_meta.meta_value IS NULL OR low_stock_amount_meta.meta_value <= ''
)
AND wc_product_meta_lookup.stock_quantity <= {$low_stock_amount}
) )
OR low_stock_amount_meta.meta_value IS NULL
)"; )";
} }
@ -160,19 +160,32 @@ class WC_Admin_REST_Products_Controller extends WC_REST_Products_Controller {
$search = $wp_query->get( 'search' ); $search = $wp_query->get( 'search' );
if ( $search && wc_product_sku_enabled() ) { if ( $search && wc_product_sku_enabled() ) {
$join .= " INNER JOIN {$wpdb->postmeta} AS ps_post_meta ON ps_post_meta.post_id = {$wpdb->posts}.ID"; $join = self::append_product_sorting_table_join( $join );
} }
if ( $wp_query->get( 'low_in_stock' ) ) { if ( $wp_query->get( 'low_in_stock' ) ) {
$join .= " INNER JOIN {$wpdb->postmeta} AS stock_meta ON {$wpdb->posts}.ID = stock_meta.post_id AND stock_meta.meta_key = '_stock' $join = self::append_product_sorting_table_join( $join );
INNER JOIN {$wpdb->postmeta} AS manage_stock_meta ON {$wpdb->posts}.ID = manage_stock_meta.post_id AND manage_stock_meta.meta_key = '_manage_stock' $join .= " LEFT JOIN {$wpdb->postmeta} AS low_stock_amount_meta ON {$wpdb->posts}.ID = low_stock_amount_meta.post_id AND low_stock_amount_meta.meta_key = '_low_stock_amount' ";
LEFT JOIN {$wpdb->postmeta} AS low_stock_amount_meta ON {$wpdb->posts}.ID = low_stock_amount_meta.post_id AND low_stock_amount_meta.meta_key = '_low_stock_amount'
";
} }
return $join; return $join;
} }
/**
* Join wc_product_meta_lookup to posts if not already joined.
*
* @param string $sql SQL join.
* @return string
*/
protected static function append_product_sorting_table_join( $sql ) {
global $wpdb;
if ( ! strstr( $sql, 'wc_product_meta_lookup' ) ) {
$sql .= " LEFT JOIN {$wpdb->wc_product_meta_lookup} wc_product_meta_lookup ON $wpdb->posts.ID = wc_product_meta_lookup.product_id ";
}
return $sql;
}
/** /**
* Group by post ID to prevent duplicates. * Group by post ID to prevent duplicates.
* *