Menu Close

WooCommerce: Get Variation IDs By Product Category or Tag

default

We can get products belonging to a product category or product tag very easily. What’s much more difficult is getting single variations based on a product category or product tag, as variations… don’t have a category or tag, which belong to its “parent” variable product instead.

In this post, we will define a function that you can reuse in your custom code whenever you need to get all variation IDs based on a given product category or product tag. You can then loop through the array and return whatever info you need. Enjoy!

PHP Snippet: Retrieve List of Variations By Product Category or Tag

/**
 * @snippet       Get Variation IDs By Taxonomy Term
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 7
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

function get_variations_from_term( $term, $taxonomy, $type ) {
    global $wpdb;
    $ids = $wpdb->get_col( "
        SELECT DISTINCT p.ID
        FROM {$wpdb->prefix}posts as p
        INNER JOIN {$wpdb->prefix}term_relationships as tr ON ( p.ID = tr.object_id OR p.post_parent = tr.object_id )
        INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
        INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
        WHERE p.post_type = 'product_variation'
        AND p.post_status = 'publish'
        AND p.ID NOT IN (
			SELECT DISTINCT post_parent
			FROM {$wpdb->prefix}posts
			WHERE post_type = 'product_variation'
			AND post_status = 'publish'
		)
        AND tt.taxonomy = '$taxonomy'
        AND t.$type = '$term'
    " );
	return $ids;
}

You can then use the following in order to get the variation IDs by category or tag:

// BY PRODUCT CATEGORY
get_variations_from_term( 'chairs', 'product_cat', 'slug' );
get_variations_from_term( 59, 'product_cat', 'term_id' );
// ETC

// BY PRODUCT TAG
get_variations_from_term( 'shiny', 'product_tag', 'slug' );
get_variations_from_term( 'Super heavy', 'product_tag', 'name' );
// ETC

View Source
Posted in WooCommerce Tips