I need to add custom checkout field based on product category. I found this code which works with products, but it is very time consuming to add Ids from every new product from particular category.
function is_in_cart() { // Add your special product IDs here $ids = array( 12468, 9687, 9693); foreach( WC()->cart->get_cart() as $cart_item ){ $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id(); if( in_array( $cart_item['data']->get_id(), $ids ) ) return true; } return false; } /** * Add the field to the checkout */ add_action( 'woocommerce_before_order_notes', 'custom_checkout_field', 20 ); function custom_checkout_field( $checkout ) { if( ! is_in_cart() ){ woocommerce_form_field( 'special_field', array( 'type' => 'textarea', 'class' => array('form-row-wide'), 'label' => pll__('Special text'), 'required' => false, 'label_class' => array('specialfieldclass'), 'clear' => false, ), $checkout->get_value( 'special_field' )); } }
How to modify this code to work with product categories?
Advertisement
Answer
Try the following to handle product categories (handling parent terms too):
// Custom conditional function that handle parent product categories too function has_product_categories( $categories, $product_id = 0 ) { $parent_term_ids = $categories_ids = array(); // Initializing $taxonomy = 'product_cat'; $product_id = $product_id == 0 ? get_the_id() : $product_id; if( is_string( $categories ) ) { $categories = (array) $categories; // Convert string to array } // Convert categories term names and slugs to categories term ids foreach ( $categories as $category ){ $result = (array) term_exists( $category, $taxonomy ); if ( ! empty( $result ) ) { $categories_ids[] = reset($result); } } // Loop through the current product category terms to get only parent main category term foreach( get_the_terms( $product_id, $taxonomy ) as $term ){ if( $term->parent > 0 ){ $parent_term_ids[] = $term->parent; // Set the parent product category $parent_term_ids[] = $term->term_id; // (and the child) } else { $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it. } } return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false; } // Custom conditional function that check for product categories function is_in_cart() { // HERE your product categories $categories = array( 'clothing' ); foreach( WC()->cart->get_cart() as $cart_item ){ if( has_product_categories( $cart_item['product_id'], $categories ) ) return true; } return false; } // Add a checkout field before order notes add_action( 'woocommerce_before_order_notes', 'custom_checkout_field', 20 ); function custom_checkout_field( $checkout ) { if( ! is_in_cart() ){ woocommerce_form_field( 'special_field', array( 'type' => 'textarea', 'class' => array('form-row-wide'), 'label' => pll__('Special text'), 'required' => false, 'label_class' => array('specialfieldclass'), 'clear' => false, ), $checkout->get_value( 'special_field' )); } }
Code goes in functions.php file of your active child theme (or active theme). It should works.