WordPress/WooCommerce中如何对配件分类商品页面排除必填的身高体重字段
WordPress/WooCommerce中如何对配件分类商品页面排除必填的身高体重字段
我来帮你解决这个问题!你现在的核心问题是:虽然用CSS隐藏了配件分类商品页面的身高体重字段,但后台的必填验证逻辑依然在运行,导致用户无法将这类商品加入购物车。我们需要从字段显示控制和验证逻辑豁免两个维度来调整代码,让配件分类的商品完全跳过这个必填字段的流程:
修改后的完整代码
// Display custom field on single product page (仅非配件分类显示) function d_extra_product_field(){ global $product; $product_id = $product->get_id(); // 替换 'accessories' 为你的配件分类slug,用ID的话改成数字比如12 if( !has_term( 'accessories', 'product_cat', $product_id ) ){ $value = isset( $_POST['extra_product_field'] ) ? sanitize_text_field( $_POST['extra_product_field'] ) : ''; printf( '<div><label>%s</label><br><textarea name="extra_product_field" value="%s"></textarea></div>', __( '<br><br><br> Enter your order notes' ), esc_attr( $value ) ); } } add_action( 'woocommerce_after_add_to_cart_button', 'd_extra_product_field', 9 ); // Validate when add to cart (豁免配件分类的必填验证) function d_extra_field_validation($passed, $product_id, $qty){ // 替换 'accessories' 为你的配件分类slug,用ID的话改成数字比如12 if( has_term( 'accessories', 'product_cat', $product_id ) ){ return true; // 配件分类直接通过验证 } if( isset( $_POST['extra_product_field'] ) && sanitize_text_field( $_POST['extra_product_field'] ) == '' ){ $product = wc_get_product( $product_id ); wc_add_notice( sprintf( __( '%s يرجى إدخال ملاحظات الطلب لإضافة المنتج الى السلة.' ), $product->get_title() ), 'error' ); return false; } return $passed; } add_filter( 'woocommerce_add_to_cart_validation', 'd_extra_field_validation', 10, 3 ); // 以下原有函数保持不变 // Add custom field data in to cart function d_add_cart_item_data( $cart_item, $product_id ){ if( isset( $_POST['extra_product_field'] ) ) { $cart_item['extra_product_field'] = sanitize_text_field( $_POST['extra_product_field'] ); } return $cart_item; } add_filter( 'woocommerce_add_cart_item_data', 'd_add_cart_item_data', 10, 2 ); // Load data from session function d_get_cart_data_f_session( $cart_item, $values ) { if ( isset( $values['extra_product_field'] ) ){ $cart_item['extra_product_field'] = $values['extra_product_field']; } return $cart_item; } add_filter( 'woocommerce_get_cart_item_from_session', 'd_get_cart_data_f_session', 20, 2 ); // Add meta to order function d_add_order_meta( $item_id, $values ) { if ( ! empty( $values['extra_product_field'] ) ) { woocommerce_add_order_item_meta( $item_id, 'extra_product_field', $values['extra_product_field'] ); } } add_action( 'woocommerce_add_order_item_meta', 'd_add_order_meta', 10, 2 ); // Display data in cart function d_get_itemdata( $other_data, $cart_item ) { if ( isset( $cart_item['extra_product_field'] ) ){ $other_data[] = array( 'name' => __( 'Your extra field text' ), 'value' => sanitize_text_field( $cart_item['extra_product_field'] ) ); } return $other_data; } add_filter( 'woocommerce_get_item_data', 'd_get_itemdata', 10, 2 ); // Display custom field data in order view function d_dis_metadata_order( $cart_item, $order_item ){ if( isset( $order_item['extra_product_field'] ) ){ $cart_item_meta['extra_product_field'] = $order_item['extra_product_field']; } return $cart_item; } add_filter( 'woocommerce_order_item_product', 'd_dis_metadata_order', 10, 2 ); // Add field data in email function d_order_email_data( $fields ) { $fields['extra_product_field'] = __( 'Your extra field text' ); return $fields; } add_filter('woocommerce_email_order_meta_fields', 'd_order_email_data'); // Again order function d_order_again_meta_data( $cart_item, $order_item, $order ){ if( isset( $order_item['extra_product_field'] ) ){ $cart_item_meta['extra_product_field'] = $order_item['extra_product_field']; } return $cart_item; } add_filter( 'woocommerce_order_again_cart_item_data', 'd_order_again_meta_data', 10, 3 ); add_action( 'wp_enqueue_scripts', 'custom_enqueue_wc_cart_fragments' ); function custom_enqueue_wc_cart_fragments() { wp_enqueue_script( 'wc-cart-fragments' ); }
关键修改说明
- 字段显示控制:在
d_extra_product_field函数中,我们通过has_term函数判断当前商品是否属于配件分类,如果不属于才渲染字段,这样配件分类的商品页面就不会显示这个字段了,比用CSS隐藏更彻底。 - 验证逻辑豁免:在
d_extra_field_validation函数开头增加判断,如果商品属于配件分类,直接返回true跳过必填检查,这样用户添加这类商品时就不会触发错误提示了。
注意事项
- 请将代码中的
'accessories'替换为你实际的配件分类的slug(可以在WooCommerce分类管理页面查看);如果习惯用分类ID,把第一个参数改成对应的数字即可,比如has_term( 12, 'product_cat', $product_id )。 - 原来的CSS隐藏代码可以删除了,现在通过PHP逻辑直接控制字段是否显示,更高效也更可靠。
备注:内容来源于stack exchange,提问作者Abdel Fattah El Tayeb
相关产品推荐
相关产品推荐

