i have 2 type of products : 1- products that have regulare price 2- products that have calculated price
i added some hidden field to product page form with below code :
JavaScript
x
function agop_plugin_add_text_field() {
global $product;
// print_r($product);
if ( agop_use_calculated_price($product->get_ID()) ) {
echo '<input type="text" name="agop-new-price" id="agop-new-price" value="'. agop_calculate_product_price($product->get_ID()) .'">';
}
?>
<input type="hidden" name='agop-date-shamsi' id='agop-date-shamsi' value=''>
<input type="hidden" name='agop-date-miladi' id='agop-date-miladi' value=''>
<input type="hidden" name='agop-shipping-method' id='agop-shipping-method' value=''>
<input type="hidden" name='agop-shipping-method-price' id='agop-shipping-method-price' value=''>
<input type="hidden" name='agop-shipping-method-price-number' id='agop-shipping-method-price-number' value=''>
<input type="hidden" name='agop-shipping-time' id='agop-shipping-time' value=''>
<div id="selectedDateTimeMethod">
<div id="dtmDatesWrapper">
<span id="dtmDateShamsi"></span>
<span id="dtmEqual"> = </span>
<span id="dtmDateMiladi"></span>
</div>
<div id="dtmMethodWrapper">
<span id="dtmMethodName"></span>
<span id="dtmMethodPrice"></span>
</div>
<div id="dtmTimeWrapper">
<span id="dtmMethodTime"></span>
</div>
<div id="dtmTotalPriceWrapper">
<span id="dtmMethodTime"></span>
</div>
</div>
<?php }
add_action( 'woocommerce_before_add_to_cart_button', 'agop_plugin_add_text_field' );
and send these fields data to cart item by :
JavaScript
function agop_plugin_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
if( isset( $_POST['agop-date-shamsi'] ) ) {
$cart_item_data['agop_date_shamsi'] = sanitize_text_field( $_POST['agop-date-shamsi'] );
}
if( isset( $_POST['agop-date-miladi'] ) ) {
$cart_item_data['agop_date_miladi'] = sanitize_text_field( $_POST['agop-date-miladi'] );
}
if( isset( $_POST['agop-shipping-method'] ) ) {
$cart_item_data['agop_shipping_method'] = sanitize_text_field( $_POST['agop-shipping-method'] );
}
if( isset( $_POST['agop-shipping-method-price'] ) ) {
$cart_item_data['agop_shipping_method_price'] = sanitize_text_field( $_POST['agop-shipping-method-price'] );
}
$product = wc_get_product( $product_id );
$final_price = $product->get_price();
if( isset( $_POST['agop-new-price'] ) && filter_var( $_POST['agop-new-price'], FILTER_VALIDATE_INT)) {
// $cart_item_data['agop_new_price'] = sanitize_text_field( $_POST['agop-new-price'] );
$final_price = floatval(sanitize_text_field( $_POST['agop-new-price'] ));
error_log('isset( $_POST[agop-new-price] FIRED---- '.$final_price);
}
if( isset( $_POST['agop-shipping-method-price-number'] ) && filter_var( $_POST['agop-shipping-method-price-number'], FILTER_VALIDATE_INT) ) {
// $cart_item_data['product_price_with_shipping'] = sanitize_text_field( $_POST['agop-shipping-method-price-number'] );
$final_price = floatval($final_price) + floatval(sanitize_text_field( $_POST['agop-shipping-method-price-number'] ));
error_log('isset( $_POST[agop-shipping-method-price-number] FIRED---- '.$final_price);
}
if( isset( $_POST['agop-shipping-time'] ) ) {
$cart_item_data['agop_shipping_time'] = sanitize_text_field( $_POST['agop-shipping-time'] );
}
$cart_item_data['agop_final_price'] = $final_price;
// $data = array();
// WC()->session->set( 'agop_final_price', $data );
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'agop_plugin_add_cart_item_data', 10, 3 );
and at last using woocommerce_before_calculate_totals hook to change product price by this code :
JavaScript
function agop_before_calculate_totals( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Iterating though cart items
foreach ( $cart->get_cart() as $cart_item ) {
// The WC_Product object
$product = $cart_item['data'];
// Get the price (WooCommerce versions 2.5.x to 3+)
$product_price = method_exists( $product, 'get_price' ) ? floatval($product->get_price()) : floatval($product->price);
// Continue if we get the custom data for the current cart item
if( ! empty( $cart_item['agop_final_price'] ) ){
// Get the custom field "added price" value
$new_price = floatval($cart_item['agop_final_price'] );
// Set the calculeted price (WooCommerce versions 2.5.x to 3+)
method_exists( $product, 'set_price' ) ? $product->set_price( $new_price ) : $product->price = $new_price;
} else {
// Set the calculeted price (WooCommerce versions 2.5.x to 3+)
method_exists( $product, 'set_price' ) ? $product->set_price( $product_price ) : $product->price = $product_price;
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'agop_before_calculate_totals' );
now problem is that $final_price variable not working when $_POST[‘agop-new-price’] and $_POST[‘agop-shipping-method-price-number’] are exists together What part of my code is wrong?
Advertisement
Answer
i found the problem: i used woocommerce_product_get_price and woocommerce_product_get_regular_price filters, Which affected the checkout and cart pages. So I put the commands of these filters in a condition like the following code and the problem was solved 🙂
JavaScript
function agop_change_product_price_by_custom_fields( $price, $product ) {
// if ( (! is_cart()) and (! is_checkout()) ) {
if ( is_singular('product') || is_product_category() || is_product_tag() || is_shop()) {
if ( agop_use_calculated_price($product->get_id()) ) {
$price = agop_calculate_product_price($product->get_id());
}
return $price;
}
return $price;
}
add_filter( 'woocommerce_product_get_price', 'agop_change_product_price_by_custom_fields', 20, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'agop_change_product_price_by_custom_fields', 20, 2 );