Improve (by a lot) the performance of the queries for the
product attributes lookup table by doing the following:
1. Fallback the query for the "AND" case to thequery for the "OR" case
when there's only one term being filtered for the category
(the subquery for the "OR" case is much simpler)
2. Collapse all of the "AND" queries (for all the categories)
into a simple one (this is possible since term ids are unique
even across categories)
3. The most important change: introduce an extra derived query,
so
...AND posts.ID in ( SELECT product_id FROM lookup_table WHERE...
becomes
...AND posts.ID in ( SELECT product_id FROM (
SELECT product_id FROM lookup_table WHERE...
This causes the filtering subquery to be executed only once.
This was needed to activate the feature for filtering products
by attribute using the new lookup table. The lookup table still
needs to be created and filled via the tools page.
Previously we were increasing coupon usage count on every apply_coupon method. This was causing double usages because, we would also increase on order save callback.
We instead now call `wc_update_coupon_usage_counts` in apply_method itself, which would increase the usage and also set the `_recorded_coupon_usage_counts` order meta.
Additional, we also manually call $couon->increase_usage_count if `_recorded_coupon_usage_counts` is because in this case, we are likely applying more than one coupon to the order. And `_recorded_coupon_usage_counts` meta would have already been set by the first coupon. This is not a good solution, ideally we should revamp how we store the coupon recorded information to support multiple coupon information from the get-go.