当前位置: 首页 > 知识库问答 >
问题:

允许客户在WooCommerce中设置产品价格并添加到具有一定验证的购物车

郭坚壁
2023-03-14

我正在工作的礼品卡产品,其中我需要客户能够设置的价格,只要它是100或更多。问题是,我不确定如何创建值检查。

然后,客户应该能够像平常一样添加到购物车,并像平常一样结账。

如果有人能复习并帮助我,那就太棒了。

add_action( 'woocommerce_before_add_to_cart_form', 'giftcard_price_field' );
function giftcard_price_field() {
global $product;

    if( has_term('giftcard', 'product_cat', $product->get_id() ) ) {
    
    // if the product is assigned to the giftcard category, remove the product price
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );

    // add a new input field for the price, allowing the customer to set the price
    echo '<div class="giftcard-product-price">
    <label for="giftcard-product-price">Giftcard value: </label>
    <input type="text" id="giftcard-product-price" name="giftcard-product-price" placeholder="Giftcard value" maxlength="1000">
    </div>';
    }
}

add_filter( 'woocommerce_add_cart_item_data', 'giftcard_price_field_cart_data', 10, 3 ); 
function giftcard_price_field_cart_data( $cart_item_data, $product_id, $variation_id ) {

    if( ! empty ( $_POST[ 'giftcard-product-price' ] ) ) {

        // need to check that the value is NOT below 100 and if so, create a wc_notice warning
        $cart_item_data['giftcard-product-price'] = sanitize_text_field( $_POST['giftcard-product-price']);
    }

    return $cart_item_data;
}

add_filter( 'woocommerce_get_item_data', 'giftcard_price_field_display_data', 10, 2 ); 
function giftcard_price_field_display_data( $item_data, $cart_item ) {

    if( ! empty ( $cart_item[ 'giftcard-product-price' ] ) ) {

    $item_data[] = array (
    'key' => 'Giftcard value',
    'value' => $cart_item['giftcard-product-price'],
    'display' => '',
    );
}
    return $item_data;
}

add_action( 'woocommerce_checkout_create_order_line_item', 'giftcard_price_field_order_data', 10, 4 ); 
function giftcard_price_field_order_data( $item, $cart_item_key, $values, $order ) {

    if( ! empty ( $values[ 'giftcard-product-price' ] ) ) {

        $item->add_meta_data( 'Giftcard value', $values['giftcard-product-price'] );
    }
}

共有1个答案

松英叡
2023-03-14
  • 如果has_term()
  • 则在单产品页面上添加新字段“ giftcard_product_price
  • 删除单个产品页面上的原始产品价格
  • 添加各种验证,并且可以进行
  • 产品(礼品卡)的价格调整为客户输入的价格
function giftcard_price_field() {
    global $product;
    
    // Instanceof
    if ( $product instanceof WC_Product ) {
        
        // Set category(ies)
        $cats = array ( 'giftcard' );

        // True
        if ( has_term( $cats, 'product_cat', $product->get_id() ) ) {
            // add a new input field for the price, allowing the customer to set the price
            echo '<div class="giftcard-product-price">
            <label for="giftcard-product-price">Giftcard value: </label>
            <input type="text" id="giftcard_product_price" name="giftcard_product_price" placeholder="Giftcard value" maxlength="1000">
            </div>';
        }
    }
}
add_action( 'woocommerce_before_add_to_cart_button', 'giftcard_price_field', 10, 0 );

// Remove price
function action_woocommerce_single_product_summary() {
    global $product;
    
    // Instanceof
    if ( $product instanceof WC_Product ) {
        
        // Set category(ies)
        $cats = array ( 'giftcard' );

        // True
        if ( has_term( $cats, 'product_cat', $product->get_id() ) ) {   
            remove_action('woocommerce_single_product_summary','woocommerce_template_single_price', 10 );
        }
    }
}
add_action( 'woocommerce_single_product_summary', 'action_woocommerce_single_product_summary', 5 );

// Validate
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
    // Isset
    if ( isset ( $_POST['giftcard_product_price'] ) ) {
        $giftcard_product_price = $_POST['giftcard_product_price'];

        // Error = empty, not numeric or less than 100
        if ( empty ( $giftcard_product_price ) ) {
            wc_add_notice( __( 'Field is empty', 'woocommerce' ), 'error' );
            $passed = false;
        } elseif ( ! is_numeric ( $giftcard_product_price ) ) {
            wc_add_notice( __( 'NOT a number or a numeric string', 'woocommerce' ), 'error' );
            $passed = false;                
        } elseif ( $giftcard_product_price < 100 ) {
            wc_add_notice( __( 'Less than 100', 'woocommerce' ), 'error' );
            $passed = false;                
        }   
    }
    
    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );

function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    if ( isset ( $_POST['giftcard_product_price'] ) ) {
        $cart_item_data['giftcard_product_price'] = sanitize_text_field( $_POST['giftcard_product_price'] );
    }
    
    return $cart_item_data; 
}
add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 10, 3 );

// Set price
function action_woocommerce_before_calculate_totals( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        if ( isset ( $cart_item['giftcard_product_price'] ) ) {
            $cart_item['data']->set_price( $cart_item['giftcard_product_price'] );
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'action_woocommerce_before_calculate_totals', 10, 1 );
 类似资料:
  • 我使用WooCommerce Wordpress中的以下代码,通过一个模板,使用add_to_cart($product_id)功能添加了许多产品。 现在,我希望通过此模板为每个产品添加自定义价格。现在购物车中的价格和数据库中的价格一样,但我想通过这一点添加我的自定义价格。有人能帮我做同样的事吗。谢谢

  • 问题内容: 上面的代码将产品添加到购物车时间。但是我遇到的问题是我希望能够完全超越产品价格……据我所知,我唯一能做到的就是将优惠券应用到购物车。 有没有办法将价格完全覆盖到完全定制的价格上? 问题答案: 这是覆盖购物车中产品价格的代码 希望它会有用…

  • 我使用“从Woocommerce中的functions.php文件中添加到购物车按钮上显示价格”的答案代码,在简单的产品中添加价格。 但我想改进这个功能,动态显示选择的变异价格内按钮。在变体产品页面上使用此代码,它只显示最低的价格。有什么解决办法吗?

  • 我见过很多例子,都是用客户价格将商品添加到WC购物车中,但没有一个是动态添加的。我正在尝试在一个接收POST变量的短代码函数中执行。。。。 这当然会将项目添加到购物车,但价格为零,我意识到我需要以某种方式将此数组保存回WC购物车数据。这种方法是可能的还是只能通过过滤器或操作钩子来完成?如果是这样,我如何保存改变的数组回到购物车的内容,或使其工作添加一个项目与公布的价格?非常感谢任何指导。 感谢do

  • 我已经添加了一个自定义字段,其中有图片帧的额外价格,现在如果图片价格是10$和用户选择一个帧,它将加起来5$让说,总数将是15$。 现在,如果我添加另一个产品,它的选择定制框架价格应该得到添加。e、 g产品1的价格是:10美元,上面选择的框架是:frame1谁的价格是5美元,那么该产品的总价格将是15美元,如果产品2加上价格10美元,选择frame2的价格是6美元,那么该产品的总价格将是16美元,