You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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' );
}

关键修改说明

  1. 字段显示控制:在d_extra_product_field函数中,我们通过has_term函数判断当前商品是否属于配件分类,如果不属于才渲染字段,这样配件分类的商品页面就不会显示这个字段了,比用CSS隐藏更彻底。
  2. 验证逻辑豁免:在d_extra_field_validation函数开头增加判断,如果商品属于配件分类,直接返回true跳过必填检查,这样用户添加这类商品时就不会触发错误提示了。

注意事项

  • 请将代码中的'accessories'替换为你实际的配件分类的slug(可以在WooCommerce分类管理页面查看);如果习惯用分类ID,把第一个参数改成对应的数字即可,比如has_term( 12, 'product_cat', $product_id )。
  • 原来的CSS隐藏代码可以删除了,现在通过PHP逻辑直接控制字段是否显示,更高效也更可靠。

备注:内容来源于stack exchange,提问作者Abdel Fattah El Tayeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:09:36