Woocommerce – Product Variation Preorder price
-
Im kinda new to woocommerce dev and haven’t developped in PHP for ages.
With the help of [@LoicTheAztec][1], I implemented Preording on my Woocommerce store using this :
// Admin Variation custom fields add_action( 'woocommerce_product_after_variable_attributes', 'ab_preorder_variation_fields', 10, 3 ); function ab_preorder_variation_fields( $loop, $variation_data, $variation ) { echo '<div class="options_group form-row form-row-full">'; // Is Preordable woocommerce_wp_checkbox( array( 'id' => '_ab_preorder_checkbox['.$loop.']', 'wrapper_class' => 'show_if_simple', 'label' => __(' Disponible à la précommande', 'woocommerce' ), 'description' => __( 'Disponible à la précommande', 'woocommerce' ), 'desc_tip' => true, 'value' => get_post_meta( $variation->ID, '_ab_preorder_checkbox', true ) ) ); // Custom Preorder Price woocommerce_wp_text_input( array( 'id' => '_ab_preorder_custom_price['.$loop.']', 'label' => __( 'Prix à la précommande', 'woocommerce' ), 'placeholder' => '', 'desc_tip' => true, 'description' => __( "Prix à la précommande", 'woocommerce' ), 'type' => 'number', 'custom_attributes' => array( 'step' => 'any', 'min' => '0' ), 'value' => get_post_meta( $variation->ID, '_ab_preorder_custom_price', true ) ) ); // Date de livraison estimée woocommerce_wp_text_input( array( 'id' => '_ab_preorder_estimated_date['.$loop.']', 'label' => __( 'Date de livraison estimé', 'woocommerce' ), 'desc_tip' => true, 'description' => __( "Date de livraison estimé", "woocommerce" ), 'type' => 'date', 'value' => get_post_meta( $variation->ID, '_ab_preorder_estimated_date', true ) ) ); echo '</div>'; } // Save admin Variations custom fields values add_action( 'woocommerce_admin_process_variation_object', 'ab_preorder_variation_fields_saving', 10, 2 ); function ab_preorder_variation_fields_saving( $variation, $loop ) { if( isset($_POST['_ab_preorder_checkbox'][$loop]) ) { $variation->update_meta_data( '_ab_preorder_checkbox', esc_attr($_POST['_ab_preorder_checkbox'][$loop]) ); } if( isset($_POST['_ab_preorder_custom_price'][$loop]) ) { $variation->update_meta_data( '_ab_preorder_custom_price', esc_attr($_POST['_ab_preorder_custom_price'][$loop]) ); } if( isset($_POST['_ab_preorder_estimated_date'][$loop]) ) { $variation->update_meta_data( '_ab_preorder_estimated_date', esc_attr($_POST['_ab_preorder_estimated_date'][$loop]) ); } } // Set the variation backorder price add_filter('woocommerce_product_variation_get_regular_price', 'custom_price', 99, 2 ); add_filter('woocommerce_product_variation_get_price', 'custom_price', 99, 2 ); function custom_price( $price, $product ) { if ( $product->get_stock_quantity() == 0 && $product->get_meta('_ab_preorder_checkbox') === 'yes' ) { $backorder_price = $product->get_meta('_ab_preorder_custom_price'); if( $backorder_price > 0 ) { $price = (float) $backorder_price; } } return $price; } // Display prefixed backorder price and estimated delivery on single product pages add_filter( 'woocommerce_available_variation', 'ab_available_variation_custom_field', 10, 3 ); function ab_available_variation_custom_field( $variation_data, $product, $variation ) { if ( $variation->get_stock_quantity() == 0 && $variation->get_meta('_ab_preorder_checkbox') === 'yes' ) { if ( $estimated_delivery_date = $variation->get_meta('_ab_preorder_estimated_date') ) { // Display estimated delivery date $variation_data['availability_html'] .= sprintf( '<p class="stock date-precommande">%s : %s</p>', __("Date de livraison estimée (précommande)", "woocommerce"), $estimated_delivery_date ); } // Displayed prefixed formatted price $variation_data['price_html'] = '<span class="price-prefix">'.__("Prix à la précommande", "") .'<span> : ' . wc_price( $variation_data['display_price'] ); } return $variation_data; } // Display on estimated delivery date on cart and checkout add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 ); function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) { if ( $cart_item['variation_id'] > 0 && $cart_item['data']->get_stock_quantity() == 0 && $cart_item['data']->get_meta('_ab_preorder_checkbox') === 'yes' ) { if ( $estimated_delivery_date = $cart_item['data']->get_meta('_ab_preorder_estimated_date') ) { $custom_items[] = array( "name" => __("Date de livraison estimée", "woocommerce"), "value" => $estimated_delivery_date ); } } return $custom_items; }
When i want to allow preordering on a product, i just need to check the
_ab_preorder_checkbox
(Disponible à la précommande) checkbox and enter a_ab_preorder_custom_price
and an estimated delivery date_ab_preorder_estimated_date
.Everything works good, the problem im facing is : When i have only one copy left from a product and the client tries to order more than just one (2-3), the product gets added to the cart with the original price and not with the preorder discount.
The behavior i want to have is : When i have
X
copies left of a product and the client decides to orderX+Y
copies, i want to set the original price for theX
copies and the preorder price_ab_preorder_custom_price
for theY
copies.I tought about using the
woocommerce_before_calculate_totals
hook but im not sure about how to implement that and i don’t know if the best solution.Can anyone help me up with that please?
Regards
The page I need help with: [log in to see the link]
- The topic ‘Woocommerce – Product Variation Preorder price’ is closed to new replies.