3

Before I get too far down this rabbit hole...

I have a product in a category that is essentially a selection of 4 other products. It can be any combination of select products. Pricing is based off of regular price for those products.

What I've managed so far

Controlled through normal WooCommerce attributes interface. Admin puts in an attribute use-for-custom with the value being the category of item, i.e. cupcakes

The result is an association to a product slugged custom-assortment in the cupcakes category. This product will be an option for any/all of the 4 selections in the custom-assortment product in cupcakes category.

I also have a function in functions.php that queries all products with this set attribute and builds a neat little array of id/title/cost. I managed that via this post earlier, plus

$useable = array();
foreach ($products as $product){
    $useable[] = array(
        'id' => $product->ID,
        'name' => $product->post_title,
        'desc' => $product->post_excerpt,
        'cost' => floatval(wc_get_product($product->ID)->get_price())/4
        //cost is 1/4 as 4 will be selected to create 1 new product
    );
}

Notes

It does not need to actually relate the selection back to a particular product. Having the selected product name(s) shown in the final order is enough for the admin. However, it would be nice to keep that reference as it may lead to additional functionality later.

Not concerned with stock at the moment, or any other attributes from the selected products except price.

Thoughts

I've tried a little to get custom variations to create programmatically via this post from LoicTheAztec, but so far I haven't gotten them to show up. I might be able to with a little more poking as his stuff is usually spot-on.

foreach ($useable as $useit){
    $display = $useit['name'] . " (" . $useit['cost'] . ")";
    $variation_data =  array(
        'attributes' => array(
            'flavor-one'  => $display,
            'flavor-two'  => $display,
            'flavor-three'  => $display,
            'flavor-four'  => $display
        ),
        'sku'           => '',
        'regular_price' => $useit['cost'],
        'sale_price'    => ''
    );
    var_dump($product->get_id());
    create_product_variation($product->get_id(), $variation_data);          
}

Alternatively, I could probably create the drop-down selections manually and run a filter on the price based on selections. That seems like a lot of manual recreation of functionality though - checking validity, pricing, etc.

Final question

Is there a way to use one product as a variable product attribute for another product already? It doesn't seem like something far-fetched, but I haven't been able to google-foo anything. My google-foo has not been great recently.

Randy Hall
  • 7,716
  • 16
  • 73
  • 151

1 Answers1

1

Assuming a single product that can be any combination of 4 of 10 other products, using variations means 10,000 possible products added. That seems unreasonable, so I went with the option of doing this another way.

Will expand this answer with code shortly, but basically:

Query posts to get product type posts with the custom attribute grouping it with this configurable option. Output these as select elements with options of items in the add-to-cart form. Option values as product IDs and displayed as product name + price for that option.

Hook to the add to cart action to check options (passed in the $_POST) and store them as attributes on the cart item.

Hook to the cart pricing filter and use the cart item attributes to calculate final product price based on the assortment products' original prices.

Also:

  • add attribute display to the cart
  • add front-end control to display changing price with the changing attributes
Randy Hall
  • 7,716
  • 16
  • 73
  • 151