-
-
Save Jon007/ae3a112659d6670ebbd2f26d55143773 to your computer and use it in GitHub Desktop.
| /* | |
| * Example adds certain named Product Attribute fields to the product Edit screen ready for completion. | |
| * (Pre-requisite ) | |
| * This saves the Shop Admin having to add them manually. | |
| * | |
| * Why might you want to do this instead of adding Custom fields? There's plenty of nice documentation on adding custom fields | |
| * for example: http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ | |
| * | |
| * Well a Product Attributes are a built in WooCommerce feature, using Terms which are a built in Wordpress feature. | |
| * - no add-ons required | |
| * - pre-existing functionality including | |
| * - ability to link from Product to archive page of products sharing the same term | |
| * - Term selection, hide or show Attribute, use for Product Variations | |
| * - built-in configuration screens, display and selection mechanisms | |
| * - highly compatible with plugin components for example to | |
| * - enhance Product Attributes display, | |
| * - show Variation swatches, | |
| * - translate Attributes and terms | |
| * - offers a level of separation between built-in fields and extension fields | |
| * (though custom fields can be added to their own tab, and some fields make sense to add to other tabs) | |
| * | |
| */ | |
| /* | |
| * Create a default Product Attribute object for the supplied name | |
| * | |
| * @param string name Product Attribute taxonomy name | |
| * | |
| * @return WC_Product_Attribute/bool new Attribute or false if named Attribute is not found | |
| * | |
| */ | |
| function acme_make_product_attribute($name) | |
| { | |
| global $wc_product_attributes; | |
| if ( isset($wc_product_attributes[$name]) ){ | |
| $newattr = new WC_Product_Attribute(); | |
| $newattr->set_id(1); //any positive value is interpreted as is_taxonomy=true | |
| $newattr->set_name($name); | |
| $newattr->set_visible(true); | |
| $newattr->set_variation(false); | |
| //example of setting default value for item | |
| if ($name=='pa_brand'){ | |
| $term = get_term_by('slug', 'acme', $name); | |
| $newattr->set_options(array($term->term_id)); | |
| } | |
| return $newattr; | |
| } else { | |
| return false; | |
| } | |
| } | |
| /* | |
| * Add default attributes to a product | |
| */ | |
| function acme_default_product_attributes() | |
| { | |
| global $product; | |
| if (! $product) { | |
| $product = $GLOBALS['product_object']; | |
| } | |
| if (! $product) { | |
| return; | |
| } | |
| $attributes = $product->get_attributes(); | |
| $defaultAttributes = array( | |
| 'pa_brand', | |
| 'pa_maker', | |
| 'pa_materials', | |
| 'pa_asin', | |
| 'pa_upc', | |
| 'pa_packaging', | |
| 'pa_recommend-to', | |
| 'pa_suitable-for', | |
| 'pa_product-size', | |
| 'pa_net-weight', | |
| ); | |
| $changed=false; | |
| foreach ($defaultAttributes as $key){ | |
| if (! isset($attributes[$key])){ | |
| $newattr = acme_make_product_attribute($key); | |
| if ($newattr){ | |
| $attributes[$key] = $newattr; | |
| } | |
| $changed = true; | |
| } | |
| } | |
| if ($changed){ | |
| $product->set_attributes($attributes); | |
| } | |
| } | |
| /* | |
| * added to last hook before rendering of Product Edit screen | |
| */ | |
| add_action('woocommerce_product_write_panel_tabs', 'acme_default_product_attributes'); |
not working with Woocommerce Version 5.7.1
Is it throwing an error or simply not ordering the attributes? Did you find a solution?
How do I trigger the execution of this snippet? Is it executed automatically if I post it in the functions.php page and whenever a new product is added?
Do you probably have an idea, how to automaticall apply a combination of attribute terms to all products in a given category? Like this: if a new product is published in a category 1, the product gets attribute "color", value "green" and attribute "size", value "big".
For those getting the error "Attempt to read property 'term_id' on bool" with PHP 8, here's the fix:
this part
if ($name=='pa_brand'){ $term = get_term_by('slug', 'acme', $name); $newattr->set_options(array($term->term_id)); }
should become
if ($name == 'pa_brand') { $term = get_term_by('slug', 'acme', $name); if ($term) { $newattr->set_options(array($term->term_id)); } }
not working with Woocommerce Version 5.7.1