允许客户设置产品价格并通过WooCommerce中的某些验证添加到购物车

问题描述

我正在开发礼品卡产品,我需要客户能够设置价格,只要价格是100或更高。问题是,我不确定如何创建值检查。

然后,客户应该能够照常添加到购物车并照常结帐。

如果产品已分配到礼品卡类别,则我已在产品价格中添加remove_action(由于某种原因,该价格不起作用)。

已经创建了字段输入,并且应该将数据转移到购物车,结帐和订单中,但是由于某些原因它不起作用。

下一步是将产品价格设置为客户提交的任何礼品卡值(只要是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',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',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'] );
    }
}

解决方法

  • 如果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->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','error' );
            $passed = false;                
        } elseif ( $giftcard_product_price < 100 ) {
            wc_add_notice( __( 'Less than 100','error' );
            $passed = false;                
        }   
    }
    
    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation','filter_woocommerce_add_to_cart_validation',5 );

function filter_add_cart_item_data( $cart_item_data,$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',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',1 );