Consenti al cliente di impostare il prezzo del prodotto e aggiungerlo al carrello con determinate convalide in WooCommerce

Aug 23 2020

Sto lavorando a un prodotto di carta regalo di cui ho bisogno che il cliente possa fissare il prezzo purché sia ​​100 o più. Il problema è che non sono sicuro di come creare il controllo del valore.

Il cliente dovrebbe quindi essere in grado di aggiungere al carrello normalmente e di effettuare il checkout come al solito.

Ho incluso un remove_actionper il prezzo del prodotto (che per qualche motivo non funziona) se il prodotto è assegnato alla categoria dei buoni regalo.

Il campo di input è stato creato ei dati devono essere trasferiti nel carrello, in cassa e nell'ordine, ma per qualche motivo non funziona.

Il passaggio successivo consiste nell'impostare il prezzo del prodotto in quello che il cliente invia come valore del buono regalo (purché sia ​​100 o più) e visualizzarlo come prezzo del prodotto nel carrello e alla cassa.

Se qualcuno mi può recensire e aiutarmi, sarebbe fantastico.

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

Risposte

1 7uc1f3r Aug 23 2020 at 11:49
  • Aggiungi un nuovo campo " giftcard_product_price" sulla pagina del singolo prodotto sehas_term()
  • Rimuove il prezzo del prodotto originale dalla pagina del singolo prodotto
  • Sono state aggiunte varie convalide e sono possibili
  • Il prezzo del prodotto (buono regalo) viene adeguato al prezzo inserito dal cliente
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 );